diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2014-12-21 07:16:22 +1100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-12-23 23:20:21 -0500 |
commit | 001ce546bb537bb5b7821f05633556a0c9787e32 (patch) | |
tree | 3e3fde752c8c4bd05e6c3cb57318069e6e54bbd7 /net/core/dev.c | |
parent | 726ce70e9e4050409243f3a1d735dc86bc6e6e57 (diff) | |
download | op-kernel-dev-001ce546bb537bb5b7821f05633556a0c9787e32.zip op-kernel-dev-001ce546bb537bb5b7821f05633556a0c9787e32.tar.gz |
net: Detect drivers that reschedule NAPI and exhaust budget
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>
Diffstat (limited to 'net/core/dev.c')
-rw-r--r-- | net/core/dev.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 493ae8e..c0cf129 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -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: |