diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2009-06-26 19:27:04 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-08-16 14:18:14 -0700 |
commit | 9ba3f8ea722e86b87627c2a4efbd464674e88412 (patch) | |
tree | 414af645193a3913e3df2fd2fe68b508262c6f33 /net | |
parent | 12774fb9ee081777593aa3028012929bd8ff3f8b (diff) |
gro: Flush GRO packets in napi_disable_pending path
[ Upstream commit ff780cd8f2fa928b193554f593b36d1243554212 ]
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>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'net')
-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 e2e9e4af3ac..0b241975c71 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -2788,9 +2788,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); } |