On Mar 4, 2010, at 2:41 AM, David Miller wrote: > From: Anton Vorontsov <avoront...@ru.mvista.com> > Date: Wed, 3 Mar 2010 21:18:58 +0300 > >> Starting with commit a3bc1f11e9b867a4f49505 ("gianfar: Revive SKB >> recycling") gianfar driver sooner or later stops transmitting any >> packets on SMP machines. >> >> start_xmit() prepares new skb for transmitting, generally it does >> three things: >> >> 1. sets up all BDs (marks them ready to send), except the first one. >> 2. stores skb into tx_queue->tx_skbuff so that clean_tx_ring() >> would cleanup it later. >> 3. sets up the first BD, i.e. marks it ready. >> >> Here is what clean_tx_ring() does: >> >> 1. reads skbs from tx_queue->tx_skbuff >> 2. checks if the *last* BD is ready. If it's still ready [to send] >> then it it isn't transmitted, so clean_tx_ring() returns. >> Otherwise it actually cleanups BDs. All is OK. >> >> Now, if there is just one BD, code flow: >> >> - start_xmit(): stores skb into tx_skbuff. Note that the first BD >> (which is also the last one) isn't marked as ready, yet. >> - clean_tx_ring(): sees that skb is not null, *and* its lstatus >> says that it is NOT ready (like if BD was sent), so it cleans >> it up (bad!) >> - start_xmit(): marks BD as ready [to send], but it's too late. >> >> We can fix this simply by reordering lstatus/tx_skbuff writes. >> >> Reported-by: Martyn Welch <martyn.we...@ge.com> >> Bisected-by: Paul Gortmaker <paul.gortma...@windriver.com> >> Signed-off-by: Anton Vorontsov <avoront...@ru.mvista.com> >> Tested-by: Paul Gortmaker <paul.gortma...@windriver.com> >> Tested-by: Martyn Welch <martyn.we...@ge.com> > > Applied.
Anton, Once this makes it into Linus's tree can you make sure we get it added to -stable. - k _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev