public inbox for netdev@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH net-next] virtio-net: xsk: Support wakeup on RX side
@ 2026-02-27 15:09 Bui Quang Minh
  2026-02-28  1:52 ` Xuan Zhuo
  2026-02-28  3:49 ` Jason Xing
  0 siblings, 2 replies; 6+ messages in thread
From: Bui Quang Minh @ 2026-02-27 15:09 UTC (permalink / raw)
  To: netdev
  Cc: Michael S. Tsirkin, Jason Wang, Xuan Zhuo, Eugenio Pérez,
	Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni, virtualization, linux-kernel, Bui Quang Minh

When XDP_USE_NEED_WAKEUP is used and the fill ring is empty so no buffer
is allocated on RX side, allow RX NAPI to be descheduled. This avoids
wasting CPU cycles on polling. Users will be notified and they need to
make a wakeup call after refilling the ring.

Signed-off-by: Bui Quang Minh <minhquangbui99@gmail.com>
---
 drivers/net/virtio_net.c | 38 ++++++++++++++++++++++++++++++--------
 1 file changed, 30 insertions(+), 8 deletions(-)

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index db88dcaefb20..494acc904b2c 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -1454,8 +1454,19 @@ static int virtnet_add_recvbuf_xsk(struct virtnet_info *vi, struct receive_queue
 	xsk_buffs = rq->xsk_buffs;
 
 	num = xsk_buff_alloc_batch(pool, xsk_buffs, rq->vq->num_free);
-	if (!num)
+	if (!num) {
+		if (xsk_uses_need_wakeup(pool)) {
+			xsk_set_rx_need_wakeup(pool);
+			/* Return 0 instead of -ENOMEM so that NAPI is
+			 * descheduled.
+			 */
+			return 0;
+		}
+
 		return -ENOMEM;
+	} else {
+		xsk_clear_rx_need_wakeup(pool);
+	}
 
 	len = xsk_pool_get_rx_frame_size(pool) + vi->hdr_len;
 
@@ -1588,20 +1599,21 @@ static bool virtnet_xsk_xmit(struct send_queue *sq, struct xsk_buff_pool *pool,
 	return sent;
 }
 
-static void xsk_wakeup(struct send_queue *sq)
+static void xsk_wakeup(struct napi_struct *napi, struct virtqueue *vq)
 {
-	if (napi_if_scheduled_mark_missed(&sq->napi))
+	if (napi_if_scheduled_mark_missed(napi))
 		return;
 
 	local_bh_disable();
-	virtqueue_napi_schedule(&sq->napi, sq->vq);
+	virtqueue_napi_schedule(napi, vq);
 	local_bh_enable();
 }
 
 static int virtnet_xsk_wakeup(struct net_device *dev, u32 qid, u32 flag)
 {
 	struct virtnet_info *vi = netdev_priv(dev);
-	struct send_queue *sq;
+	struct napi_struct *napi;
+	struct virtqueue *vq;
 
 	if (!netif_running(dev))
 		return -ENETDOWN;
@@ -1609,9 +1621,19 @@ static int virtnet_xsk_wakeup(struct net_device *dev, u32 qid, u32 flag)
 	if (qid >= vi->curr_queue_pairs)
 		return -EINVAL;
 
-	sq = &vi->sq[qid];
+	if (flag == XDP_WAKEUP_TX) {
+		struct send_queue *sq = &vi->sq[qid];
+
+		napi = &sq->napi;
+		vq = sq->vq;
+	} else {
+		struct receive_queue *rq = &vi->rq[qid];
+
+		napi = &rq->napi;
+		vq = rq->vq;
+	}
 
-	xsk_wakeup(sq);
+	xsk_wakeup(napi, vq);
 	return 0;
 }
 
@@ -1623,7 +1645,7 @@ static void virtnet_xsk_completed(struct send_queue *sq, int num)
 	 * wakeup the tx napi to consume the xsk tx queue, because the tx
 	 * interrupt may not be triggered.
 	 */
-	xsk_wakeup(sq);
+	xsk_wakeup(&sq->napi, sq->vq);
 }
 
 static int __virtnet_xdp_xmit_one(struct virtnet_info *vi,
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH net-next] virtio-net: xsk: Support wakeup on RX side
  2026-02-27 15:09 [PATCH net-next] virtio-net: xsk: Support wakeup on RX side Bui Quang Minh
@ 2026-02-28  1:52 ` Xuan Zhuo
  2026-02-28  3:49 ` Jason Xing
  1 sibling, 0 replies; 6+ messages in thread
From: Xuan Zhuo @ 2026-02-28  1:52 UTC (permalink / raw)
  To: Bui Quang Minh
  Cc: Michael S. Tsirkin, Jason Wang, Eugenio Pérez, Andrew Lunn,
	David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	virtualization, linux-kernel, Bui Quang Minh, netdev

On Fri, 27 Feb 2026 22:09:49 +0700, Bui Quang Minh <minhquangbui99@gmail.com> wrote:
> When XDP_USE_NEED_WAKEUP is used and the fill ring is empty so no buffer
> is allocated on RX side, allow RX NAPI to be descheduled. This avoids
> wasting CPU cycles on polling. Users will be notified and they need to
> make a wakeup call after refilling the ring.
>
> Signed-off-by: Bui Quang Minh <minhquangbui99@gmail.com>

LGTM

Reviewed-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>

> ---
>  drivers/net/virtio_net.c | 38 ++++++++++++++++++++++++++++++--------
>  1 file changed, 30 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index db88dcaefb20..494acc904b2c 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -1454,8 +1454,19 @@ static int virtnet_add_recvbuf_xsk(struct virtnet_info *vi, struct receive_queue
>  	xsk_buffs = rq->xsk_buffs;
>
>  	num = xsk_buff_alloc_batch(pool, xsk_buffs, rq->vq->num_free);
> -	if (!num)
> +	if (!num) {
> +		if (xsk_uses_need_wakeup(pool)) {
> +			xsk_set_rx_need_wakeup(pool);
> +			/* Return 0 instead of -ENOMEM so that NAPI is
> +			 * descheduled.
> +			 */
> +			return 0;
> +		}
> +
>  		return -ENOMEM;
> +	} else {
> +		xsk_clear_rx_need_wakeup(pool);
> +	}
>
>  	len = xsk_pool_get_rx_frame_size(pool) + vi->hdr_len;
>
> @@ -1588,20 +1599,21 @@ static bool virtnet_xsk_xmit(struct send_queue *sq, struct xsk_buff_pool *pool,
>  	return sent;
>  }
>
> -static void xsk_wakeup(struct send_queue *sq)
> +static void xsk_wakeup(struct napi_struct *napi, struct virtqueue *vq)
>  {
> -	if (napi_if_scheduled_mark_missed(&sq->napi))
> +	if (napi_if_scheduled_mark_missed(napi))
>  		return;
>
>  	local_bh_disable();
> -	virtqueue_napi_schedule(&sq->napi, sq->vq);
> +	virtqueue_napi_schedule(napi, vq);
>  	local_bh_enable();
>  }
>
>  static int virtnet_xsk_wakeup(struct net_device *dev, u32 qid, u32 flag)
>  {
>  	struct virtnet_info *vi = netdev_priv(dev);
> -	struct send_queue *sq;
> +	struct napi_struct *napi;
> +	struct virtqueue *vq;
>
>  	if (!netif_running(dev))
>  		return -ENETDOWN;
> @@ -1609,9 +1621,19 @@ static int virtnet_xsk_wakeup(struct net_device *dev, u32 qid, u32 flag)
>  	if (qid >= vi->curr_queue_pairs)
>  		return -EINVAL;
>
> -	sq = &vi->sq[qid];
> +	if (flag == XDP_WAKEUP_TX) {
> +		struct send_queue *sq = &vi->sq[qid];
> +
> +		napi = &sq->napi;
> +		vq = sq->vq;
> +	} else {
> +		struct receive_queue *rq = &vi->rq[qid];
> +
> +		napi = &rq->napi;
> +		vq = rq->vq;
> +	}
>
> -	xsk_wakeup(sq);
> +	xsk_wakeup(napi, vq);
>  	return 0;
>  }
>
> @@ -1623,7 +1645,7 @@ static void virtnet_xsk_completed(struct send_queue *sq, int num)
>  	 * wakeup the tx napi to consume the xsk tx queue, because the tx
>  	 * interrupt may not be triggered.
>  	 */
> -	xsk_wakeup(sq);
> +	xsk_wakeup(&sq->napi, sq->vq);
>  }
>
>  static int __virtnet_xdp_xmit_one(struct virtnet_info *vi,
> --
> 2.43.0
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH net-next] virtio-net: xsk: Support wakeup on RX side
  2026-02-27 15:09 [PATCH net-next] virtio-net: xsk: Support wakeup on RX side Bui Quang Minh
  2026-02-28  1:52 ` Xuan Zhuo
@ 2026-02-28  3:49 ` Jason Xing
  2026-02-28  5:03   ` Bui Quang Minh
  1 sibling, 1 reply; 6+ messages in thread
From: Jason Xing @ 2026-02-28  3:49 UTC (permalink / raw)
  To: Bui Quang Minh
  Cc: netdev, Michael S. Tsirkin, Jason Wang, Xuan Zhuo,
	Eugenio Pérez, Andrew Lunn, David S. Miller, Eric Dumazet,
	Jakub Kicinski, Paolo Abeni, virtualization, linux-kernel

Hi Bui,

On Fri, Feb 27, 2026 at 11:20 PM Bui Quang Minh
<minhquangbui99@gmail.com> wrote:
>
> When XDP_USE_NEED_WAKEUP is used and the fill ring is empty so no buffer
> is allocated on RX side, allow RX NAPI to be descheduled. This avoids
> wasting CPU cycles on polling. Users will be notified and they need to
> make a wakeup call after refilling the ring.
>
> Signed-off-by: Bui Quang Minh <minhquangbui99@gmail.com>
> ---
>  drivers/net/virtio_net.c | 38 ++++++++++++++++++++++++++++++--------
>  1 file changed, 30 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index db88dcaefb20..494acc904b2c 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -1454,8 +1454,19 @@ static int virtnet_add_recvbuf_xsk(struct virtnet_info *vi, struct receive_queue
>         xsk_buffs = rq->xsk_buffs;
>
>         num = xsk_buff_alloc_batch(pool, xsk_buffs, rq->vq->num_free);
> -       if (!num)
> +       if (!num) {
> +               if (xsk_uses_need_wakeup(pool)) {
> +                       xsk_set_rx_need_wakeup(pool);
> +                       /* Return 0 instead of -ENOMEM so that NAPI is
> +                        * descheduled.
> +                        */
> +                       return 0;
> +               }
> +
>                 return -ENOMEM;
> +       } else {
> +               xsk_clear_rx_need_wakeup(pool);
> +       }
>
>         len = xsk_pool_get_rx_frame_size(pool) + vi->hdr_len;
>
> @@ -1588,20 +1599,21 @@ static bool virtnet_xsk_xmit(struct send_queue *sq, struct xsk_buff_pool *pool,
>         return sent;
>  }
>
> -static void xsk_wakeup(struct send_queue *sq)
> +static void xsk_wakeup(struct napi_struct *napi, struct virtqueue *vq)
>  {
> -       if (napi_if_scheduled_mark_missed(&sq->napi))
> +       if (napi_if_scheduled_mark_missed(napi))
>                 return;
>
>         local_bh_disable();
> -       virtqueue_napi_schedule(&sq->napi, sq->vq);
> +       virtqueue_napi_schedule(napi, vq);
>         local_bh_enable();
>  }
>
>  static int virtnet_xsk_wakeup(struct net_device *dev, u32 qid, u32 flag)
>  {
>         struct virtnet_info *vi = netdev_priv(dev);
> -       struct send_queue *sq;
> +       struct napi_struct *napi;
> +       struct virtqueue *vq;
>
>         if (!netif_running(dev))
>                 return -ENETDOWN;
> @@ -1609,9 +1621,19 @@ static int virtnet_xsk_wakeup(struct net_device *dev, u32 qid, u32 flag)
>         if (qid >= vi->curr_queue_pairs)
>                 return -EINVAL;
>
> -       sq = &vi->sq[qid];
> +       if (flag == XDP_WAKEUP_TX) {

Better use &?

Thanks,
Jason

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH net-next] virtio-net: xsk: Support wakeup on RX side
  2026-02-28  3:49 ` Jason Xing
@ 2026-02-28  5:03   ` Bui Quang Minh
  2026-02-28  6:16     ` Jason Xing
  0 siblings, 1 reply; 6+ messages in thread
From: Bui Quang Minh @ 2026-02-28  5:03 UTC (permalink / raw)
  To: Jason Xing
  Cc: netdev, Michael S. Tsirkin, Jason Wang, Xuan Zhuo,
	Eugenio Pérez, Andrew Lunn, David S. Miller, Eric Dumazet,
	Jakub Kicinski, Paolo Abeni, virtualization, linux-kernel

Hi Jason,

On 2/28/26 10:49, Jason Xing wrote:
> Hi Bui,
>
> On Fri, Feb 27, 2026 at 11:20 PM Bui Quang Minh
> <minhquangbui99@gmail.com> wrote:
>> When XDP_USE_NEED_WAKEUP is used and the fill ring is empty so no buffer
>> is allocated on RX side, allow RX NAPI to be descheduled. This avoids
>> wasting CPU cycles on polling. Users will be notified and they need to
>> make a wakeup call after refilling the ring.
>>
>> Signed-off-by: Bui Quang Minh <minhquangbui99@gmail.com>
>> ---
>>   drivers/net/virtio_net.c | 38 ++++++++++++++++++++++++++++++--------
>>   1 file changed, 30 insertions(+), 8 deletions(-)
>>
>> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
>> index db88dcaefb20..494acc904b2c 100644
>> --- a/drivers/net/virtio_net.c
>> +++ b/drivers/net/virtio_net.c
>> @@ -1454,8 +1454,19 @@ static int virtnet_add_recvbuf_xsk(struct virtnet_info *vi, struct receive_queue
>>          xsk_buffs = rq->xsk_buffs;
>>
>>          num = xsk_buff_alloc_batch(pool, xsk_buffs, rq->vq->num_free);
>> -       if (!num)
>> +       if (!num) {
>> +               if (xsk_uses_need_wakeup(pool)) {
>> +                       xsk_set_rx_need_wakeup(pool);
>> +                       /* Return 0 instead of -ENOMEM so that NAPI is
>> +                        * descheduled.
>> +                        */
>> +                       return 0;
>> +               }
>> +
>>                  return -ENOMEM;
>> +       } else {
>> +               xsk_clear_rx_need_wakeup(pool);
>> +       }
>>
>>          len = xsk_pool_get_rx_frame_size(pool) + vi->hdr_len;
>>
>> @@ -1588,20 +1599,21 @@ static bool virtnet_xsk_xmit(struct send_queue *sq, struct xsk_buff_pool *pool,
>>          return sent;
>>   }
>>
>> -static void xsk_wakeup(struct send_queue *sq)
>> +static void xsk_wakeup(struct napi_struct *napi, struct virtqueue *vq)
>>   {
>> -       if (napi_if_scheduled_mark_missed(&sq->napi))
>> +       if (napi_if_scheduled_mark_missed(napi))
>>                  return;
>>
>>          local_bh_disable();
>> -       virtqueue_napi_schedule(&sq->napi, sq->vq);
>> +       virtqueue_napi_schedule(napi, vq);
>>          local_bh_enable();
>>   }
>>
>>   static int virtnet_xsk_wakeup(struct net_device *dev, u32 qid, u32 flag)
>>   {
>>          struct virtnet_info *vi = netdev_priv(dev);
>> -       struct send_queue *sq;
>> +       struct napi_struct *napi;
>> +       struct virtqueue *vq;
>>
>>          if (!netif_running(dev))
>>                  return -ENETDOWN;
>> @@ -1609,9 +1621,19 @@ static int virtnet_xsk_wakeup(struct net_device *dev, u32 qid, u32 flag)
>>          if (qid >= vi->curr_queue_pairs)
>>                  return -EINVAL;
>>
>> -       sq = &vi->sq[qid];
>> +       if (flag == XDP_WAKEUP_TX) {
> Better use &?

Sorry, I don't get your point. Can you elaborate more?

Thanks,
Quang Minh.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH net-next] virtio-net: xsk: Support wakeup on RX side
  2026-02-28  5:03   ` Bui Quang Minh
@ 2026-02-28  6:16     ` Jason Xing
  2026-02-28  6:25       ` Bui Quang Minh
  0 siblings, 1 reply; 6+ messages in thread
From: Jason Xing @ 2026-02-28  6:16 UTC (permalink / raw)
  To: Bui Quang Minh
  Cc: netdev, Michael S. Tsirkin, Jason Wang, Xuan Zhuo,
	Eugenio Pérez, Andrew Lunn, David S. Miller, Eric Dumazet,
	Jakub Kicinski, Paolo Abeni, virtualization, linux-kernel

On Sat, Feb 28, 2026 at 1:03 PM Bui Quang Minh <minhquangbui99@gmail.com> wrote:
>
> Hi Jason,
>
> On 2/28/26 10:49, Jason Xing wrote:
> > Hi Bui,
> >
> > On Fri, Feb 27, 2026 at 11:20 PM Bui Quang Minh
> > <minhquangbui99@gmail.com> wrote:
> >> When XDP_USE_NEED_WAKEUP is used and the fill ring is empty so no buffer
> >> is allocated on RX side, allow RX NAPI to be descheduled. This avoids
> >> wasting CPU cycles on polling. Users will be notified and they need to
> >> make a wakeup call after refilling the ring.
> >>
> >> Signed-off-by: Bui Quang Minh <minhquangbui99@gmail.com>
> >> ---
> >>   drivers/net/virtio_net.c | 38 ++++++++++++++++++++++++++++++--------
> >>   1 file changed, 30 insertions(+), 8 deletions(-)
> >>
> >> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> >> index db88dcaefb20..494acc904b2c 100644
> >> --- a/drivers/net/virtio_net.c
> >> +++ b/drivers/net/virtio_net.c
> >> @@ -1454,8 +1454,19 @@ static int virtnet_add_recvbuf_xsk(struct virtnet_info *vi, struct receive_queue
> >>          xsk_buffs = rq->xsk_buffs;
> >>
> >>          num = xsk_buff_alloc_batch(pool, xsk_buffs, rq->vq->num_free);
> >> -       if (!num)
> >> +       if (!num) {
> >> +               if (xsk_uses_need_wakeup(pool)) {
> >> +                       xsk_set_rx_need_wakeup(pool);
> >> +                       /* Return 0 instead of -ENOMEM so that NAPI is
> >> +                        * descheduled.
> >> +                        */
> >> +                       return 0;
> >> +               }
> >> +
> >>                  return -ENOMEM;
> >> +       } else {
> >> +               xsk_clear_rx_need_wakeup(pool);
> >> +       }
> >>
> >>          len = xsk_pool_get_rx_frame_size(pool) + vi->hdr_len;
> >>
> >> @@ -1588,20 +1599,21 @@ static bool virtnet_xsk_xmit(struct send_queue *sq, struct xsk_buff_pool *pool,
> >>          return sent;
> >>   }
> >>
> >> -static void xsk_wakeup(struct send_queue *sq)
> >> +static void xsk_wakeup(struct napi_struct *napi, struct virtqueue *vq)
> >>   {
> >> -       if (napi_if_scheduled_mark_missed(&sq->napi))
> >> +       if (napi_if_scheduled_mark_missed(napi))
> >>                  return;
> >>
> >>          local_bh_disable();
> >> -       virtqueue_napi_schedule(&sq->napi, sq->vq);
> >> +       virtqueue_napi_schedule(napi, vq);
> >>          local_bh_enable();
> >>   }
> >>
> >>   static int virtnet_xsk_wakeup(struct net_device *dev, u32 qid, u32 flag)
> >>   {
> >>          struct virtnet_info *vi = netdev_priv(dev);
> >> -       struct send_queue *sq;
> >> +       struct napi_struct *napi;
> >> +       struct virtqueue *vq;
> >>
> >>          if (!netif_running(dev))
> >>                  return -ENETDOWN;
> >> @@ -1609,9 +1621,19 @@ static int virtnet_xsk_wakeup(struct net_device *dev, u32 qid, u32 flag)
> >>          if (qid >= vi->curr_queue_pairs)
> >>                  return -EINVAL;
> >>
> >> -       sq = &vi->sq[qid];
> >> +       if (flag == XDP_WAKEUP_TX) {
> > Better use &?
>
> Sorry, I don't get your point. Can you elaborate more?

Oh, I meant using 'flag & XDP_WAKEUP_TX' is preferrable. IIUC, since
this patch provides a way to enable the RX flag, for virtio_net, this
flag can be set by TX and RX altogether? Please see this call trace:
xsk_poll()->xsk_wakeup(xs, pool->cached_need_wakeup).

Thanks,
Jason

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH net-next] virtio-net: xsk: Support wakeup on RX side
  2026-02-28  6:16     ` Jason Xing
@ 2026-02-28  6:25       ` Bui Quang Minh
  0 siblings, 0 replies; 6+ messages in thread
From: Bui Quang Minh @ 2026-02-28  6:25 UTC (permalink / raw)
  To: Jason Xing
  Cc: netdev, Michael S. Tsirkin, Jason Wang, Xuan Zhuo,
	Eugenio Pérez, Andrew Lunn, David S. Miller, Eric Dumazet,
	Jakub Kicinski, Paolo Abeni, virtualization, linux-kernel

On 2/28/26 13:16, Jason Xing wrote:
> On Sat, Feb 28, 2026 at 1:03 PM Bui Quang Minh <minhquangbui99@gmail.com> wrote:
>> Hi Jason,
>>
>> On 2/28/26 10:49, Jason Xing wrote:
>>> Hi Bui,
>>>
>>> On Fri, Feb 27, 2026 at 11:20 PM Bui Quang Minh
>>> <minhquangbui99@gmail.com> wrote:
>>>> When XDP_USE_NEED_WAKEUP is used and the fill ring is empty so no buffer
>>>> is allocated on RX side, allow RX NAPI to be descheduled. This avoids
>>>> wasting CPU cycles on polling. Users will be notified and they need to
>>>> make a wakeup call after refilling the ring.
>>>>
>>>> Signed-off-by: Bui Quang Minh <minhquangbui99@gmail.com>
>>>> ---
>>>>    drivers/net/virtio_net.c | 38 ++++++++++++++++++++++++++++++--------
>>>>    1 file changed, 30 insertions(+), 8 deletions(-)
>>>>
>>>> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
>>>> index db88dcaefb20..494acc904b2c 100644
>>>> --- a/drivers/net/virtio_net.c
>>>> +++ b/drivers/net/virtio_net.c
>>>> @@ -1454,8 +1454,19 @@ static int virtnet_add_recvbuf_xsk(struct virtnet_info *vi, struct receive_queue
>>>>           xsk_buffs = rq->xsk_buffs;
>>>>
>>>>           num = xsk_buff_alloc_batch(pool, xsk_buffs, rq->vq->num_free);
>>>> -       if (!num)
>>>> +       if (!num) {
>>>> +               if (xsk_uses_need_wakeup(pool)) {
>>>> +                       xsk_set_rx_need_wakeup(pool);
>>>> +                       /* Return 0 instead of -ENOMEM so that NAPI is
>>>> +                        * descheduled.
>>>> +                        */
>>>> +                       return 0;
>>>> +               }
>>>> +
>>>>                   return -ENOMEM;
>>>> +       } else {
>>>> +               xsk_clear_rx_need_wakeup(pool);
>>>> +       }
>>>>
>>>>           len = xsk_pool_get_rx_frame_size(pool) + vi->hdr_len;
>>>>
>>>> @@ -1588,20 +1599,21 @@ static bool virtnet_xsk_xmit(struct send_queue *sq, struct xsk_buff_pool *pool,
>>>>           return sent;
>>>>    }
>>>>
>>>> -static void xsk_wakeup(struct send_queue *sq)
>>>> +static void xsk_wakeup(struct napi_struct *napi, struct virtqueue *vq)
>>>>    {
>>>> -       if (napi_if_scheduled_mark_missed(&sq->napi))
>>>> +       if (napi_if_scheduled_mark_missed(napi))
>>>>                   return;
>>>>
>>>>           local_bh_disable();
>>>> -       virtqueue_napi_schedule(&sq->napi, sq->vq);
>>>> +       virtqueue_napi_schedule(napi, vq);
>>>>           local_bh_enable();
>>>>    }
>>>>
>>>>    static int virtnet_xsk_wakeup(struct net_device *dev, u32 qid, u32 flag)
>>>>    {
>>>>           struct virtnet_info *vi = netdev_priv(dev);
>>>> -       struct send_queue *sq;
>>>> +       struct napi_struct *napi;
>>>> +       struct virtqueue *vq;
>>>>
>>>>           if (!netif_running(dev))
>>>>                   return -ENETDOWN;
>>>> @@ -1609,9 +1621,19 @@ static int virtnet_xsk_wakeup(struct net_device *dev, u32 qid, u32 flag)
>>>>           if (qid >= vi->curr_queue_pairs)
>>>>                   return -EINVAL;
>>>>
>>>> -       sq = &vi->sq[qid];
>>>> +       if (flag == XDP_WAKEUP_TX) {
>>> Better use &?
>> Sorry, I don't get your point. Can you elaborate more?
> Oh, I meant using 'flag & XDP_WAKEUP_TX' is preferrable. IIUC, since
> this patch provides a way to enable the RX flag, for virtio_net, this
> flag can be set by TX and RX altogether? Please see this call trace:
> xsk_poll()->xsk_wakeup(xs, pool->cached_need_wakeup).

Oh, you're right. I'll fix it in the next version.

Thanks,
Quang Minh.


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2026-02-28  6:25 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-27 15:09 [PATCH net-next] virtio-net: xsk: Support wakeup on RX side Bui Quang Minh
2026-02-28  1:52 ` Xuan Zhuo
2026-02-28  3:49 ` Jason Xing
2026-02-28  5:03   ` Bui Quang Minh
2026-02-28  6:16     ` Jason Xing
2026-02-28  6:25       ` Bui Quang Minh

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox