gianfar: fix BUG under load after introduction of skb recycling
[sfrench/cifs-2.6.git] / drivers / net / gianfar.c
index b2c49679bba78407fe51d58b57cc62344feb7b0d..a0519184e54ee7d7a30aed189a7ce13e5ab122f1 100644 (file)
@@ -1885,8 +1885,17 @@ int gfar_clean_rx_ring(struct net_device *dev, int rx_work_limit)
 
                        if (unlikely(!newskb))
                                newskb = skb;
 
                        if (unlikely(!newskb))
                                newskb = skb;
-                       else if (skb)
+                       else if (skb) {
+                               /*
+                                * We need to reset ->data to what it
+                                * was before gfar_new_skb() re-aligned
+                                * it to an RXBUF_ALIGNMENT boundary
+                                * before we put the skb back on the
+                                * recycle list.
+                                */
+                               skb->data = skb->head + NET_SKB_PAD;
                                __skb_queue_head(&priv->rx_recycle, skb);
                                __skb_queue_head(&priv->rx_recycle, skb);
+                       }
                } else {
                        /* Increment the number of packets */
                        dev->stats.rx_packets++;
                } else {
                        /* Increment the number of packets */
                        dev->stats.rx_packets++;