From nobody Thu Apr 9 13:30:34 2026 Received: from mail-pf1-f172.google.com (mail-pf1-f172.google.com [209.85.210.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 46604423A99 for ; Mon, 2 Mar 2026 16:42:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772469739; cv=none; b=a1Je6WsWTBrYVEnqj3S+nz2QGWrv+CoI8znX1vOguyNC4vkY8E5RGi7Ogu/ccrDxhLsbSnDZwRj6C27YOG/xJr0SQP3o6AVrEwcm+eiEmvLwSbyUQsY7VhHs4zNN7ss9aRGY4pmv1Gh6T2OyNAxp/B0lIgcdEe4TIvbmrTZMYck= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772469739; c=relaxed/simple; bh=VFASPJvhciehL7F+IA6+SdXs77TNKb/sys4Vs9JnaxA=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=E6U20Iy7i5tfVKQLBdDXtCBsXSe8B4ov2LF45/lcGNLAxzYFA/IB9/KIzJcw2rTN7yy2gi6A0u8LqLe1iN2h/KtnYk2TWGjQkdg/T90FJtQ6DZRF6wzRGAYwSHX3fVtyqfSu2HkF2woOGd0hpJvNXZaDYTJkLiFrMOEND5ry0os= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=bBL1MUMc; arc=none smtp.client-ip=209.85.210.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="bBL1MUMc" Received: by mail-pf1-f172.google.com with SMTP id d2e1a72fcca58-82746ed8cdcso2812003b3a.3 for ; Mon, 02 Mar 2026 08:42:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772469738; x=1773074538; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=IZaKRJcz+mujuLo0S8DFt3UkN8fu6YsunVoMPBDL58A=; b=bBL1MUMcATKeHSlLaFfPJ0G65MBtqUjujyU55x6acpvbQI9mGKIFtD/UV7vzhAPeFx hDIRO8MeSnghj8Aos22qJugse5zw90Yv5KYFg4eUPfl4VW32OTmvfjPwJG+G98K6zssF 7PJBrb0QyskUX57K3CnpCcoPhoS6uHAXGOGgH7xuKml2s52VhnjsLZzAz0KwJzM02I50 7h0WVYdjs5PZF34ZMhYCOKaRUhYRXlQID5OpUjxMjkFCURzeWbePvzsECg42xhLvFL3n FYda5Elz+MsBGBRFDYH0ShcFPHi9QSm6GECKqgiz17bSvbJsTGVUlMDr5MuxpQMCbtOz 78Vw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772469738; x=1773074538; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=IZaKRJcz+mujuLo0S8DFt3UkN8fu6YsunVoMPBDL58A=; b=lxquk7DAC9PybAQ4Gf7NVm4eDbBGnnnEWSrIcjf1evI1bKk+14CzxBfjP7JGgaXy3f vSmUgWUY0xhX90GCj5b6DmOdAn+mgpOBn6foLNqGrCdVh6Rji21Ny2TGJ0Ld2hY0/mu/ qOOq0pmclIGyCEcXzuWKdNkRvcbjIYFetU9WC3S61JW2U5jIxK9llt4nUqXpmFbBS3GU bRHlnD2Gcg33q4dmAjVvRQnaUfTv1P4Xor/NTfY9dGFxoz/+auwJl8rhZqRjXKRIz3F0 fjhDTf1w7+EgN3EgqsFtU8jyP8YcyItk/cJl8xizToOy6rIEpHPqwNyRToq4zSXdEss8 46gA== X-Forwarded-Encrypted: i=1; AJvYcCWxP/mWY0zZVBGZQeArg8tL2c8H9Me2lKkNDhrQmJ+I3Ys3/KDg2WcBPrPPWznmvGTiWTCJ6sFd6/D2Mbc=@vger.kernel.org X-Gm-Message-State: AOJu0YwCgIEcVRoP+xFioWVS+OF8lpHc61Q+HdbAOg8+pvM/HnnG6LgO MkYqXSInI88Fi66QA3WORAOjOw68KJp47Qkq2U2EW1zs/HaaA1otdCsW X-Gm-Gg: ATEYQzyDvgB+c0vCbKF4hX6dtP0B23KDfBCe9hEFEEQNUHcmpboUD4IHdmdsgIVmPUt DOvbjpJkYNJYpxbtzb051fBjr7eYmKIGeXi+Zqvrbx9jJt98gh94tTcZeg5ysCAdoEOwUWqfITW 2nFFKdxo6eROwWT0V1KzlrJhENdln/ud07IHfxWdCDpXtivT1ICsXp3H+pDtPH0lJMZoBKLbus+ tRnRrgEenMzQDzGkiZMJZ2mxk8LXNQzVLMoGnwsSiXRJRmjQEaC27bJE1Q8ckETxgUR07OBp9nY pApkmJha+uxo0ZVtyY0c6uOUSkj8n56vG5XnSihW1Td0ulgAzf4edbBN4K6hbp/lekkCDBH+Aw0 G/i7NdtHqKE7pVZX+pPW0BRIR9c1EjB/JOdVLg7hiA7wZJP4DADq1ivWNp5S5P/QIGR1jvi2JY4 KOMy9Gr2z60lNcuxHSxB8= X-Received: by 2002:a05:6a20:a10d:b0:38d:efcb:2e84 with SMTP id adf61e73a8af0-395c3a86fb2mr12074081637.32.1772469737400; Mon, 02 Mar 2026 08:42:17 -0800 (PST) Received: from minh.192.168.1.1 ([2a09:bac1:31c0:8::246:f5]) by smtp.googlemail.com with ESMTPSA id 41be03b00d2f7-c70fa801849sm12681295a12.20.2026.03.02.08.42.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 08:42:15 -0800 (PST) From: Bui Quang Minh To: netdev@vger.kernel.org Cc: "Michael S. Tsirkin" , Jason Wang , Xuan Zhuo , =?UTF-8?q?Eugenio=20P=C3=A9rez?= , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, Bui Quang Minh Subject: [PATCH net-next v2] virtio-net: xsk: Support wakeup on RX side Date: Mon, 2 Mar 2026 23:41:58 +0700 Message-ID: <20260302164158.4394-1-minhquangbui99@gmail.com> X-Mailer: git-send-email 2.43.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 Reviewed-by: Jason Xing --- Changes in v2: - Fix the flag check in virtnet_xsk_wakeup - Link to v1: https://lore.kernel.org/netdev/20260227150949.13089-1-minhqua= ngbui99@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_in= fo *vi, struct receive_queue xsk_buffs =3D rq->xsk_buffs; =20 num =3D 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); + } =20 len =3D xsk_pool_get_rx_frame_size(pool) + vi->hdr_len; =20 @@ -1588,20 +1599,19 @@ static bool virtnet_xsk_xmit(struct send_queue *sq,= struct xsk_buff_pool *pool, return sent; } =20 -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; =20 local_bh_disable(); - virtqueue_napi_schedule(&sq->napi, sq->vq); + virtqueue_napi_schedule(napi, vq); local_bh_enable(); } =20 static int virtnet_xsk_wakeup(struct net_device *dev, u32 qid, u32 flag) { struct virtnet_info *vi =3D netdev_priv(dev); - struct send_queue *sq; =20 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 >=3D vi->curr_queue_pairs) return -EINVAL; =20 - sq =3D &vi->sq[qid]; + if (flag & XDP_WAKEUP_TX) { + struct send_queue *sq =3D &vi->sq[qid]; + + xsk_wakeup(&sq->napi, sq->vq); + } + + if (flag & XDP_WAKEUP_RX) { + struct receive_queue *rq =3D &vi->rq[qid]; + + xsk_wakeup(&rq->napi, rq->vq); + } =20 - xsk_wakeup(sq); return 0; } =20 @@ -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); } =20 static int __virtnet_xdp_xmit_one(struct virtnet_info *vi, --=20 2.43.0