diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2009-06-26 19:27:04 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-06-26 19:27:04 -0700 |
commit | ff780cd8f2fa928b193554f593b36d1243554212 (patch) | |
tree | 451563416dc07de91d274ab696055878fd6270aa /net/core/dev.c | |
parent | 71f9dacd2e4d233029e9e956ca3f79531f411827 (diff) | |
download | lwn-ff780cd8f2fa928b193554f593b36d1243554212.tar.gz lwn-ff780cd8f2fa928b193554f593b36d1243554212.zip |
gro: Flush GRO packets in napi_disable_pending path
When NAPI is disabled while we're in net_rx_action, we end up
calling __napi_complete without flushing GRO packets. This is
a bug as it would cause the GRO packets to linger, of course it
also literally BUGs to catch error like this :)
This patch changes it to napi_complete, with the obligatory IRQ
reenabling. This should be safe because we've only just disabled
IRQs and it does not materially affect the test conditions in
between.
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 | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 60b572812278..70c27e0c7c32 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -2823,9 +2823,11 @@ static void net_rx_action(struct softirq_action *h) * move the instance around on the list at-will. */ if (unlikely(work == weight)) { - if (unlikely(napi_disable_pending(n))) - __napi_complete(n); - else + if (unlikely(napi_disable_pending(n))) { + local_irq_enable(); + napi_complete(n); + local_irq_disable(); + } else list_move_tail(&n->poll_list, list); } |