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

Reply via email to