From: Ido Yariv <ido@wizery.com>
To: Juuso Oikarinen <juuso.oikarinen@nokia.com>
Cc: "Coelho Luciano (Nokia-MS/Helsinki)" <Luciano.Coelho@nokia.com>,
"linux-wireless@vger.kernel.org" <linux-wireless@vger.kernel.org>
Subject: Re: [PATCH 2/4] wl1271: Fix TX starvation
Date: Tue, 12 Oct 2010 01:44:32 +0200 [thread overview]
Message-ID: <20101011234432.GQ1836@WorkStation> (raw)
In-Reply-To: <1286791018.11177.484.camel@wimaxnb.nmp.nokia.com>
Hi Juuso,
You're absolutely right. I had an implicit assumption that both irq_work
and tx_work cannot run concurrently, since they're on the same work
queue.
The reason cancel_work_sync was called in the first place was to
minimize the number of times tx_work is being called without any work to do.
While the impact of simply not cancelling tx_work is quite minor, v2
will include an alternative implementation which tries to achieve the above
goal without calling cancel_work_sync().
Thanks,
Ido.
On Mon, Oct 11, 2010 at 12:56:58PM +0300, Juuso Oikarinen wrote:
> On Mon, 2010-10-11 at 10:48 +0200, ext Ido Yariv wrote:
> > While wl1271_irq_work handles RX directly (by calling wl1271_rx), a different
> > work is queued for transmitting packets. The IRQ work might handle more than
> > one interrupt during a single call, including multiple TX completion
> > interrupts. This might starve TX, since no packets are transmitted until all
> > interrupts are handled.
> >
> > Fix this by calling the TX work function directly, instead of deferring
> > it.
> >
> > Signed-off-by: Ido Yariv <ido@wizery.com>
> > ---
> > drivers/net/wireless/wl12xx/wl1271_main.c | 19 +++++++++++++------
> > drivers/net/wireless/wl12xx/wl1271_tx.c | 12 ++++++++----
> > drivers/net/wireless/wl12xx/wl1271_tx.h | 1 +
> > 3 files changed, 22 insertions(+), 10 deletions(-)
> >
>
> *snip*
>
>
> > @@ -537,6 +533,17 @@ static void wl1271_irq_work(struct work_struct *work)
> > (wl->tx_results_count & 0xff))
> > wl1271_tx_complete(wl);
> >
> > + /* Check if any tx blocks were freed */
> > + if ((wl->tx_blocks_available > prev_tx_blocks) &&
> > + !skb_queue_empty(&wl->tx_queue)) {
> > + /*
> > + * In order to avoid starvation of the TX path,
> > + * call the work function directly.
> > + */
> > + cancel_work_sync(&wl->tx_work);
>
> Hmm, isn't this causing a theoretical potential for a dead-lock? The
> tx_work could be waiting in mutex-lock already when cancel_work_sync is
> called, in which case cancel_work_sync would lock forever.
>
> IIRC the irq_work and tx_work currently run in the same queue, so this
> may work with the current driver. Smells like a hazard anyway, and
> changing the workqueues for each work could easily lead to dead locks
> here. So at minimum I'd like to see it documented in the comment why
> this cannot cause a deadlock.
>
> > + wl1271_tx_work_locked(wl);
> > + }
> > +
> > wl1271_rx(wl, wl->fw_status);
> > }
> >
> > diff --git a/drivers/net/wireless/wl12xx/wl1271_tx.c b/drivers/net/wireless/wl12xx/wl1271_tx.c
> > index 63bc52c..90a8909 100644
>
>
>
next prev parent reply other threads:[~2010-10-11 23:44 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-10-11 8:48 [PATCH 0/4] wl1271: TX optimizations & fixes Ido Yariv
2010-10-11 8:48 ` [PATCH 1/4] wl1271: TX aggregation optimization Ido Yariv
2010-10-11 8:48 ` [PATCH 2/4] wl1271: Fix TX starvation Ido Yariv
2010-10-11 9:56 ` Juuso Oikarinen
2010-10-11 10:00 ` Johannes Berg
2010-10-11 23:44 ` Ido Yariv [this message]
2010-10-11 8:48 ` [PATCH 3/4] wl1271: Allocate TX descriptors more efficiently Ido Yariv
2010-10-11 8:48 ` [PATCH 4/4] wl1271: Fix TX queue low watermark handling Ido Yariv
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20101011234432.GQ1836@WorkStation \
--to=ido@wizery.com \
--cc=Luciano.Coelho@nokia.com \
--cc=juuso.oikarinen@nokia.com \
--cc=linux-wireless@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.