From: Longjun Tang <[email protected]> When busy-poll is active, napi_schedule_prep() returns false in skb_recv_done(), so virtqueue_disable_cb() is skipped. The device may keep firing irqs until the next poll round reaches virtqueue_napi_complete(). If cb is enabled under busy-poll case, it will lead to a large number of spurious interrupts. Explicitly disable callbacks in this case to prevent spurious interrupts.
Signed-off-by: Longjun Tang <[email protected]> --- drivers/net/virtio_net.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index f4adcfee7a80..6d675fddc59b 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -728,6 +728,8 @@ static void virtqueue_napi_schedule(struct napi_struct *napi, if (napi_schedule_prep(napi)) { virtqueue_disable_cb(vq); __napi_schedule(napi); + } else if (test_bit(NAPI_STATE_IN_BUSY_POLL, &napi->state)) { + virtqueue_disable_cb(vq); } } -- 2.25.1
