Messages in this thread | | | Date | Tue, 24 Mar 2009 15:47:43 -0700 (PDT) | Subject | Re: Revert "gro: Fix legacy path napi_complete crash", | From | David Miller <> |
| |
From: David Miller <davem@davemloft.net> Date: Tue, 24 Mar 2009 14:36:22 -0700 (PDT)
> From: Herbert Xu <herbert@gondor.apana.org.au> > Date: Tue, 24 Mar 2009 23:09:28 +0800 > > > @@ -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(); > > I think the problem is that we need to do the GRO flush before the > list delete and clearing the NAPI_STATE_SCHED bit.
Ok Herbert, I'm even more sure of this because in your original commit log message you mention:
This simply doesn't work since we need to flush the held GRO packets first.
We are certainly in a pickle here, actually.
We can't run the GRO flush until we re-enable interrupts. But if we re-enable interrupts, more packets get queued to the input_pkt_queue and we end up back where we started.
| |