ibm emac: Don't call napi_complete if napi_reschedule failed
authorAlistair Popple <alistair@popple.id.au>
Tue, 29 Oct 2013 23:50:37 +0000 (10:50 +1100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 30 Oct 2013 02:57:42 +0000 (22:57 -0400)
This patch fixes a bug which would trigger the BUG_ON() at
net/core/dev.c:4156. It was found that this was due to continuing
processing in the current poll call even when the call to
napi_reschedule failed, indicating the device was already on the
polling list. This resulted in an extra call to napi_complete which
triggered the BUG_ON().

This patch ensures that we only contine processing rotting packets in
the current mal_poll call if we are not already on the polling list.

Signed-off-by: Alistair Popple <alistair@popple.id.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/ibm/emac/mal.c

index dac564c25440cbb5c222a02a8488f8ad6c676e16..909f9b6698b5e35ceb81d49ebf3fef7582a6447a 100644 (file)
@@ -442,15 +442,11 @@ static int mal_poll(struct napi_struct *napi, int budget)
                if (unlikely(mc->ops->peek_rx(mc->dev) ||
                             test_bit(MAL_COMMAC_RX_STOPPED, &mc->flags))) {
                        MAL_DBG2(mal, "rotting packet" NL);
-                       if (napi_reschedule(napi))
-                               mal_disable_eob_irq(mal);
-                       else
-                               MAL_DBG2(mal, "already in poll list" NL);
-
-                       if (budget > 0)
-                               goto again;
-                       else
+                       if (!napi_reschedule(napi))
                                goto more_work;
+
+                       mal_disable_eob_irq(mal);
+                       goto again;
                }
                mc->ops->poll_tx(mc->dev);
        }