On Mon, 2011-06-20 at 09:48 +0200, Richard Cochran wrote: Hi Richard,
> Because the socket buffer is freed in the completion interrupt, it is not > safe to access it after submitting it to the hardware. I don't see why. skb is freed from txq_reclaim() which grabs the tx queue lock before, (hence the lockless __skb_queue_xxx() in both functions) What am I missing ? > Cc: [email protected] > Cc: Lennert Buytenhek <[email protected]> > Signed-off-by: Richard Cochran <[email protected]> > --- > drivers/net/mv643xx_eth.c | 6 ++++-- > 1 files changed, 4 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c > index a5d9b1c..1b7d2c1 100644 > --- a/drivers/net/mv643xx_eth.c > +++ b/drivers/net/mv643xx_eth.c > @@ -859,7 +859,7 @@ no_csum: > static netdev_tx_t mv643xx_eth_xmit(struct sk_buff *skb, struct net_device > *dev) > { > struct mv643xx_eth_private *mp = netdev_priv(dev); > - int queue; > + int length, queue; > struct tx_queue *txq; > struct netdev_queue *nq; > > @@ -881,10 +881,12 @@ static netdev_tx_t mv643xx_eth_xmit(struct sk_buff > *skb, struct net_device *dev) > return NETDEV_TX_OK; > } > > + length = skb->len; > + > if (!txq_submit_skb(txq, skb)) { > int entries_left; > > - txq->tx_bytes += skb->len; > + txq->tx_bytes += length; > txq->tx_packets++; > > entries_left = txq->tx_ring_size - txq->tx_desc_count; -- Maxime _______________________________________________ stable mailing list [email protected] http://linux.kernel.org/mailman/listinfo/stable
