| Submitter | Michael S. Tsirkin |
|---|---|
| Date | May 16, 2012, 7:57 a.m. |
| Message ID | <20120516075712.GA2921@redhat.com> |
| Download | mbox | patch |
| Permalink | /patch/159545/ |
| State | Awaiting Upstream |
| Delegated to: | David Miller |
| Headers | show |
Comments
On Wed, 16 May 2012 10:57:13 +0300, "Michael S. Tsirkin" <mst@redhat.com> wrote: > __napi_schedule might raise softirq but nothing > causes do_softirq to trigger, so it does not in fact > run. As a result, > the error message "NOHZ: local_softirq_pending 08" > sometimes occurs during boot of a KVM guest when the network service is > started and we are oom: > > ... > Bringing up loopback interface: [ OK ] > Bringing up interface eth0: > Determining IP information for eth0...NOHZ: local_softirq_pending 08 > done. > [ OK ] > ... > > Further, receive queue processing might get delayed > indefinitely until some interrupt triggers: > virtio_net expected napi to be run immediately. > > One way to cause do_softirq to be executed is by > invoking local_bh_enable(). As __napi_schedule is > normally called from bh or irq context, this > seems to make sense: disable bh before __napi_schedule > and enable afterwards. > > Reported-by: Ulrich Obergfell <uobergfe@redhat.com> > Tested-by: Ulrich Obergfell <uobergfe@redhat.com> > Signed-off-by: Michael S. Tsirkin <mst@redhat.com> > --- > > To test, one can hack try_fill_recv to always report oom. > I'm not sure it's not too late for 3.4, but we can try. > Rusty, could you review ASAP pls? It's missing a big comment: it's a very complicated way of calling do_softirq(). Indeed, this function is only used when we are not in interrupt context. It's not hot at all, in any ideal scenario. Acked-by: Rusty Russell <rusty@rustcorp.com.au> -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Rusty Russell <rusty@rustcorp.com.au> Date: Thu, 17 May 2012 13:02:53 +0930 > On Wed, 16 May 2012 10:57:13 +0300, "Michael S. Tsirkin" <mst@redhat.com> wrote: >> __napi_schedule might raise softirq but nothing >> causes do_softirq to trigger, so it does not in fact >> run. As a result, >> the error message "NOHZ: local_softirq_pending 08" >> sometimes occurs during boot of a KVM guest when the network service is >> started and we are oom: >> >> ... >> Bringing up loopback interface: [ OK ] >> Bringing up interface eth0: >> Determining IP information for eth0...NOHZ: local_softirq_pending 08 >> done. >> [ OK ] >> ... >> >> Further, receive queue processing might get delayed >> indefinitely until some interrupt triggers: >> virtio_net expected napi to be run immediately. >> >> One way to cause do_softirq to be executed is by >> invoking local_bh_enable(). As __napi_schedule is >> normally called from bh or irq context, this >> seems to make sense: disable bh before __napi_schedule >> and enable afterwards. >> >> Reported-by: Ulrich Obergfell <uobergfe@redhat.com> >> Tested-by: Ulrich Obergfell <uobergfe@redhat.com> >> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> ... > Acked-by: Rusty Russell <rusty@rustcorp.com.au> Michael, you're best to submit this directly to Linus as I just made what I hope is my last push to him for 3.4 today. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Patch
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index af8acc8..cbefe67 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -492,7 +492,9 @@ static void virtnet_napi_enable(struct virtnet_info *vi) * We synchronize against interrupts via NAPI_STATE_SCHED */ if (napi_schedule_prep(&vi->napi)) { virtqueue_disable_cb(vi->rvq); + local_bh_disable(); __napi_schedule(&vi->napi); + local_bh_enable(); } }