On Mon, 15 Jun 2026 17:45:50 +0800, Longjun Tang <[email protected]> wrote:
> 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);

I see, but we should avoid checking NAPI_STATE_IN_BUSY_POLL directly in the
drivers. The NIC driver should remain agnostic to busy polling. I think we need
a better way, maybe we should rewrite virtqueue_napi_schedule instead.

Thanks.

>       }
>  }
>
> --
> 2.25.1
>

Reply via email to