From: Bui Quang Minh <minhquangbui99@gmail.com>
To: netdev@vger.kernel.org
Cc: "Michael S. Tsirkin" <mst@redhat.com>,
"Jason Wang" <jasowang@redhat.com>,
"Xuan Zhuo" <xuanzhuo@linux.alibaba.com>,
"Eugenio Pérez" <eperezma@redhat.com>,
"Andrew Lunn" <andrew+netdev@lunn.ch>,
"David S. Miller" <davem@davemloft.net>,
"Eric Dumazet" <edumazet@google.com>,
"Jakub Kicinski" <kuba@kernel.org>,
"Paolo Abeni" <pabeni@redhat.com>,
virtualization@lists.linux.dev, linux-kernel@vger.kernel.org,
"Bui Quang Minh" <minhquangbui99@gmail.com>
Subject: [PATCH net-next v2] virtio-net: xsk: Support wakeup on RX side
Date: Mon, 2 Mar 2026 23:41:58 +0700 [thread overview]
Message-ID: <20260302164158.4394-1-minhquangbui99@gmail.com> (raw)
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>
---
Changes in v2:
- Fix the flag check in virtnet_xsk_wakeup
- Link to v1: https://lore.kernel.org/netdev/20260227150949.13089-1-minhquangbui99@gmail.com/
---
drivers/net/virtio_net.c | 35 +++++++++++++++++++++++++++--------
1 file changed, 27 insertions(+), 8 deletions(-)
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index db88dcaefb20..3614002fc87c 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,19 @@ 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;
if (!netif_running(dev))
return -ENETDOWN;
@@ -1609,9 +1619,18 @@ 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];
+
+ xsk_wakeup(&sq->napi, sq->vq);
+ }
+
+ if (flag & XDP_WAKEUP_RX) {
+ struct receive_queue *rq = &vi->rq[qid];
+
+ xsk_wakeup(&rq->napi, rq->vq);
+ }
- xsk_wakeup(sq);
return 0;
}
@@ -1623,7 +1642,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
next reply other threads:[~2026-03-02 16:42 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-02 16:41 Bui Quang Minh [this message]
2026-03-02 18:53 ` [PATCH net-next v2] virtio-net: xsk: Support wakeup on RX side Michael S. Tsirkin
2026-03-03 14:44 ` Bui Quang Minh
2026-03-04 7:41 ` Jason Xing
2026-03-04 15:35 ` Bui Quang Minh
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260302164158.4394-1-minhquangbui99@gmail.com \
--to=minhquangbui99@gmail.com \
--cc=andrew+netdev@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=eperezma@redhat.com \
--cc=jasowang@redhat.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mst@redhat.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=virtualization@lists.linux.dev \
--cc=xuanzhuo@linux.alibaba.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox