changeset 667:0320ff2bcdd4

Bugfix for 2.6.29 network stack so it doesn't hang under load.
author Rob Landley <rob@landley.net>
date Sun, 29 Mar 2009 06:45:38 -0500
parents ec72d651231e
children e7eb5123258c
files sources/patches/linux-2.6.29-napi.patch
diffstat 1 files changed, 44 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sources/patches/linux-2.6.29-napi.patch	Sun Mar 29 06:45:38 2009 -0500
@@ -0,0 +1,44 @@
+net: Fix netpoll lockup in legacy receive path
+ 
+When I fixed the GRO crash in the legacy receive path I used
+napi_complete to replace __napi_complete.  Unfortunately they're
+not the same when NETPOLL is enabled, which may result in us
+not calling __napi_complete at all.
+ 
+What's more, we really do need to keep the __napi_complete call
+within the IRQ-off section since in theory an IRQ can occur in
+between and fill up the backlog to the maximum, causing us to
+lock up.
+ 
+This patch fixes this by essentially open-coding __napi_complete.
+ 
+Note we no longer need the memory barrier because this function
+is per-cpu.
+ 
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+
+diff --git a/net/core/dev.c b/net/core/dev.c
+index e3fe5c7..2a7f6b3 100644
+--- a/net/core/dev.c
++++ b/net/core/dev.c
+@@ -2588,9 +2588,10 @@ static int process_backlog(struct napi_struct *napi, int quota)
+ 		local_irq_disable();
+ 		skb = __skb_dequeue(&queue->input_pkt_queue);
+ 		if (!skb) {
++			list_del(&napi->poll_list);
++			clear_bit(NAPI_STATE_SCHED, &napi->state);
+ 			local_irq_enable();
+-			napi_complete(napi);
+-			goto out;
++			break;
+ 		}
+ 		local_irq_enable();
+ 
+@@ -2599,7 +2600,6 @@ static int process_backlog(struct napi_struct *napi, int quota)
+ 
+ 	napi_gro_flush(napi);
+
+-out:
+ 	return work;
+ }
+