From: Eric Dumazet Date: Tue, 2 Dec 2014 12:30:59 +0000 (-0800) Subject: net: mvneta: fix race condition in mvneta_tx() X-Git-Tag: v3.12.36~73 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2ffe53f9735a9fb7be8a2a1f78487db8bd603f53;p=thirdparty%2Fkernel%2Fstable.git net: mvneta: fix race condition in mvneta_tx() [ Upstream commit 5f478b41033606d325e420df693162e2524c2b94 ] mvneta_tx() dereferences skb to get skb->len too late, as hardware might have completed the transmit and TX completion could have freed the skb from another cpu. Fixes: 71f6d1b31fb1 ("net: mvneta: replace Tx timer with a real interrupt") Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller Signed-off-by: Jiri Slaby --- diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c index 0e38db6469fb7..9c66d3168911b 100644 --- a/drivers/net/ethernet/marvell/mvneta.c +++ b/drivers/net/ethernet/marvell/mvneta.c @@ -1524,6 +1524,7 @@ static int mvneta_tx(struct sk_buff *skb, struct net_device *dev) struct mvneta_tx_queue *txq = &pp->txqs[txq_id]; struct mvneta_tx_desc *tx_desc; struct netdev_queue *nq; + int len = skb->len; int frags = 0; u32 tx_cmd; @@ -1584,7 +1585,7 @@ out: if (frags > 0) { u64_stats_update_begin(&pp->tx_stats.syncp); pp->tx_stats.packets++; - pp->tx_stats.bytes += skb->len; + pp->tx_stats.bytes += len; u64_stats_update_end(&pp->tx_stats.syncp); } else {