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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).