• Michael S. Tsirkin's avatar
    virtio_net: invoke softirqs after __napi_schedule · ec13ee80
    Michael S. Tsirkin authored
    __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.
    
    In fact it's a very complicated way of calling do_softirq(),
    and works since this function is only used when we are not
    in interrupt context.  It's not hot at all, in any ideal scenario.
    Reported-by: default avatarUlrich Obergfell <uobergfe@redhat.com>
    Tested-by: default avatarUlrich Obergfell <uobergfe@redhat.com>
    Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    Acked-by: default avatarRusty Russell <rusty@rustcorp.com.au>
    ec13ee80
virtio_net.c 31.6 KB