Mercurial > hg > aboriginal
view sources/patches/linux-2.6.29-napi.patch @ 743:5e745e03408a
Commit 729 broke canadian cross to fix ppc440 build, so try again to hopefully fix _both_ issues.
author | Rob Landley <rob@landley.net> |
---|---|
date | Thu, 11 Jun 2009 00:26:15 -0500 |
parents | 0320ff2bcdd4 |
children |
line wrap: on
line source
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; }