net: Detect drivers that reschedule NAPI and exhaust budget
authorHerbert Xu <herbert@gondor.apana.org.au>
Sat, 20 Dec 2014 20:16:22 +0000 (07:16 +1100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 24 Dec 2014 04:20:21 +0000 (23:20 -0500)
The commit d75b1ade567ffab085e8adbbdacf0092d10cd09c (net: less
interrupt masking in NAPI) required drivers to leave poll_list
empty if the entire budget is consumed.

We have already had two broken drivers so let's add a check for
this.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/dev.c

index 493ae8ee569f12d30ca58eb2c13e54d451f592b9..c0cf1293df0605d75551a56d1d03b251ece6918b 100644 (file)
@@ -4602,6 +4602,15 @@ static int napi_poll(struct napi_struct *n, struct list_head *repoll)
                napi_gro_flush(n, HZ >= 1000);
        }
 
+       /* Some drivers may have called napi_schedule
+        * prior to exhausting their budget.
+        */
+       if (unlikely(!list_empty(&n->poll_list))) {
+               pr_warn_once("%s: Budget exhausted after napi rescheduled\n",
+                            n->dev ? n->dev->name : "backlog");
+               goto out_unlock;
+       }
+
        list_add_tail(&n->poll_list, repoll);
 
 out_unlock: