[lkml]   [2012]   [May]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    Subject[PATCH] virtio_net: invoke softirqs after __napi_schedule
    __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
    [ 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 <>
    Tested-by: Ulrich Obergfell <>
    Signed-off-by: Michael S. Tsirkin <>

    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?

    drivers/net/virtio_net.c | 2 ++
    1 files changed, 2 insertions(+), 0 deletions(-)

    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)) {
    + local_bh_disable();
    + local_bh_enable();


     \ /
      Last update: 2012-05-16 10:41    [W:0.024 / U:5.188 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site