From: Stanislaw Gruszka <sgruszka@redhat.com>
To: Ivo Van Doorn <ivdoorn@gmail.com>
Cc: "John W. Linville" <linville@tuxdriver.com>,
Justin Piszcz <jpiszcz@lucidpixels.com>,
Gertjan van Wingerde <gwingerde@gmail.com>,
Helmut Schaa <helmut.schaa@googlemail.com>,
linux-wireless@vger.kernel.org
Subject: Re: [PATCH] rt2x00: rt2800usb: fix races in tx queue
Date: Mon, 8 Aug 2011 11:29:15 +0200 [thread overview]
Message-ID: <20110808092914.GA2168@redhat.com> (raw)
In-Reply-To: <CAOZOX0Xpv9OPqx2Y3GnajhmDvx3GyL1xTAjEOYjOToWcQxB6bA@mail.gmail.com>
Hi Ivo
On Sat, Aug 06, 2011 at 01:06:51PM +0200, Ivo Van Doorn wrote:
> On Thu, Aug 4, 2011 at 2:46 PM, Stanislaw Gruszka <sgruszka@redhat.com> wrote:
> > -static void rt2800usb_txdone(struct rt2x00_dev *rt2x00dev)
> > +static int rt2800usb_txdone(struct rt2x00_dev *rt2x00dev)
> > {
> > struct data_queue *queue;
> > struct queue_entry *entry;
> > u32 reg;
> > u8 qid;
> >
> > - while (kfifo_get(&rt2x00dev->txstatus_fifo, ®)) {
> > + while (kfifo_peek(&rt2x00dev->txstatus_fifo, ®)) {
>
> I'm not too sure about this change, why do you need to do kfifo_peek
> and add gotos to the end of the while-loop to remove the item from the queue?
> There is no condition in which the obtained value from kfifo-peek
> will require it to be read again later (because when the value couldn't be
> handled we are throwing it away anyway using kfifo_skip).
There is new case (see below) where it is needed. I can get rid of goto,
that will make code a bit cleaner. There is place for optimization, mainly
make tx_status fifo per queue, but for now I just want to fix kernel crashes.
> > /* TX_STA_FIFO_PID_QUEUE is a 2-bit field, thus
> > * qid is guaranteed to be one of the TX QIDs
> > @@ -517,25 +517,39 @@ static void rt2800usb_txdone(struct rt2x00_dev *rt2x00dev)
> > if (unlikely(!queue)) {
> > WARNING(rt2x00dev, "Got TX status for an unavailable "
> > "queue %u, dropping\n", qid);
> > - continue;
> > + goto next_reg;
> > }
> >
> > /*
> > * Inside each queue, we process each entry in a chronological
> > * order. We first check that the queue is not empty.
> > */
> > - entry = NULL;
> > - while (!rt2x00queue_empty(queue)) {
> > + while (1) {
> > + entry = NULL;
> > +
> > + if (rt2x00queue_empty(queue))
> > + break;
> > +
> > entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
> > +
> > + if (test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags) ||
> > + !test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags)) {
> > + WARNING(rt2x00dev, "Data pending for entry %u"
> > + "in queue %u\n", entry->entry_idx, qid);
> > + return 1;
Here is part of code where we exit the loop (and whole function) and do
not remove head "reg" from tx_status fifo - and read it again when
_txdone work is called next time.
Stanislaw
next prev parent reply other threads:[~2011-08-08 9:29 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-08-04 12:46 [PATCH] rt2x00: rt2800usb: fix races in tx queue Stanislaw Gruszka
2011-08-06 11:06 ` Ivo Van Doorn
2011-08-08 9:29 ` Stanislaw Gruszka [this message]
2011-08-08 9:35 ` [PATCH v2] " Stanislaw Gruszka
2011-08-08 20:55 ` Gertjan van Wingerde
2011-08-09 9:50 ` Stanislaw Gruszka
2011-08-09 11:26 ` Stanislaw Gruszka
2011-08-09 15:45 ` Stanislaw Gruszka
2011-08-10 10:39 ` Stanislaw Gruszka
2011-08-10 13:28 ` Stanislaw Gruszka
2011-08-08 9:43 ` [PATCH] " Ivo Van Doorn
2011-08-08 14:28 ` Stanislaw Gruszka
2011-08-08 20:45 ` Gertjan van Wingerde
2011-08-09 10:01 ` Stanislaw Gruszka
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=20110808092914.GA2168@redhat.com \
--to=sgruszka@redhat.com \
--cc=gwingerde@gmail.com \
--cc=helmut.schaa@googlemail.com \
--cc=ivdoorn@gmail.com \
--cc=jpiszcz@lucidpixels.com \
--cc=linux-wireless@vger.kernel.org \
--cc=linville@tuxdriver.com \
/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.