Messages in this thread Patch in this message |  | | | Date | Wed, 25 Mar 2009 23:54:56 +0100 | | From | Jarek Poplawski <> | | Subject | Re: Revert "gro: Fix legacy path napi_complete crash", |
| |
Herbert Xu wrote, On 03/25/2009 01:26 PM:
> On Wed, Mar 25, 2009 at 01:20:46PM +0100, Ingo Molnar wrote: >> ok - i have started testing the delta below, on top of the plain >> revert. > > Thanks! BTW Ingo, any chance you could help us identify the problem > with the previous patch? I don't have a forcedeth machine here > and the hang you had with my patch that open-coded __napi_complete > appears intimately connected to forcedeth (with NAPI enabled).
Of course it's too late for verifying this now, but (for the future) I think, this scenario could be considered:
process_backlog() netif_rx()
if (!skb) local_irq_enable() if (queue.qlen) //NO napi_schedule() //NOTHING __skb_queue_tail() //qlen > 0 napi_complete() ... ... Every next netif_rx() sees qlen > 0, so napi is never scheduled again. Then, something like this might work...
Jarek P. --- (2.6.29) net/core/dev.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) diff --git a/net/core/dev.c b/net/core/dev.c index e3fe5c7..cf53c24 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -2589,7 +2589,11 @@ static int process_backlog(struct napi_struct *napi, int quota) skb = __skb_dequeue(&queue->input_pkt_queue); if (!skb) { local_irq_enable(); - napi_complete(napi); + napi_gro_flush(napi); + local_irq_disable(); + if (skb_queue_empty(&queue->input_pkt_queue)) + __napi_complete(napi); + local_irq_enable(); goto out; } local_irq_enable();
|  |