Mercurial > hg > aboriginal
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; + } +