From nobody Tue Apr 7 18:46:39 2026 Received: from mail-pf1-f174.google.com (mail-pf1-f174.google.com [209.85.210.174]) (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 703582BD5A7 for ; Fri, 27 Feb 2026 15:13:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772205223; cv=none; b=XTLvwLqe6LhaeKnFTk0yiSswPasa6xLifXR+s5AxBwh7PQ+WyddeXkPCrgjoT/nV2usApynXT/Zik1iknCQAo+jmPfI9XNCLHGPjk1BWIMbB5zsPHgk0PtC1QxxXUH79DXCFHVUbZNzKJURP755YEEogK01Gp0MR0wXqEwp+VIY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772205223; c=relaxed/simple; bh=+pvLKOyDJeDYk8Ks51ufw2eQlUL8GJXsRvfZQAUcAhA=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=f0HRrp1Mj7b968Cnr4Gt9xRJ89iRjagDqXscZ0FUUZF+ZNvH2CLFD7q0tqKV/3wOSAhGPVRgvY5vTeE6AeJpSMAEz0buumlWIvKCPXY+z7Y0ORdnf/aLkI8dwRkQ+IJ8GO6aT30BEc+lyiqevXYPjGV5JKe6l+hFwLflEnqYYck= 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=RIguU5IR; arc=none smtp.client-ip=209.85.210.174 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="RIguU5IR" Received: by mail-pf1-f174.google.com with SMTP id d2e1a72fcca58-827546f228aso509900b3a.0 for ; Fri, 27 Feb 2026 07:13:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772205222; x=1772810022; 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=wORT1SbE27ZIkrMMuUayvBmlw/YCk/ngCJoGzWhKHPo=; b=RIguU5IR+bGndBqcisKWURw9OmRwg+rrvnVpUdIPc/31oODUEu6n5inJjMX/Q9NHsy Ke4Dqbyoze3l61RT/LjM1b7yYch4EsarSJCdyoThf36XMmhNDbN3LAZ1D31Hdw8ySP0z avZe6PHS5QkgfQdPohRTWp10EeH1bAtUlPh8nLgRVSup1zdbFPUb+kE0K0GbMzyM3Ktv 6wFmb9zIz2er9e7/gp1jmosIQgoJI76EHL2L3n203huLLKm7XVVIxJ5awuTxk36lg3cF TMs8jvRTpPUV7YzEWhrtD8Siry59l2ryckNwYEunPUb50j6/FO3vF/Ijv81OfkIfwvsE gCaw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772205222; x=1772810022; 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=wORT1SbE27ZIkrMMuUayvBmlw/YCk/ngCJoGzWhKHPo=; b=mVdlva5iOsdxalLoARBIW3vA2McjhEmTOAkqICQPOlXPeDS+Jv4Q0huCk34ikNfJ7W XuFmdSLqRW8NY1MatIxQlOE0m5ocOXYpDjm+FjZIw+wBGZT6wBJkYei9G39f37370jZW q95D5hJ+h6wr7zR6KZl43IxNuCdO1VVcN1eqMON1syjfgiyG8kmZG45h2H9Ub/FMhZ7v 19tbbKAaFVr/d2A9WrD04ALUteZkvY4MV+eqdllfLBXQANvCvR4380l0CfDTcTBkTuTZ xNshQt/ohQabgR8+472cqVg2/eeWV5m06g7ZyNjvdmK63+33JPKy0IjQS1H8oN2japsM BZyA== X-Forwarded-Encrypted: i=1; AJvYcCXeiRH8FvWgT615v3Z9JVE01sl3ABoUK+mX7oQay8U/ESSdeyc2/fr4P7Omb6SFQK40mMRNJ90nz5Q2mII=@vger.kernel.org X-Gm-Message-State: AOJu0Yza6E5QhBoEsFXSG/K0v3GmrKUvWB3F3L6uQG9wIIS1Z/lTX8PF eMKtTFwfCvJPDU0usvD1ATj6ti7c1dJlnuHf6NWR3csm61Kh8wWRf1IJ X-Gm-Gg: ATEYQzzcSLF0Vj/doiXwBMVvBoULD323cpeHoybEfzpoCG+T/9kLxsitLjVCDef+7iI ULzZLIvBHo1BUcdtW5MODPilroHiA0xTRju0sfPzI+oaG8C1R2aHk3t8IAteR6pepMaIZqy9vIO 5KfRl5uV+lbV5Y6bWfDVISKNTvn6CWV1pJ4JijyjAu9QjD/UPlNPHmUYo1YuQDdMXthaiLschZY nG56/vb7P+aUfdnD9htWK4hlTaP+YZgLPyoD3s7UcdTrGNCwYbgXW+HDOOc5igTPZS7He5kE9Id 5vKRPniyF952BsRMBD6LRkkUtqykMity+FKB7lJZjoUrFXu8fXwU+YUIf4tb8oCNXne5K9MM1EH cNz9t5oWsgaTB9AMYUWtD1rQaq4/+AqqX7ZC2Gr0Duyg6Uisa67FeOB0bVUcFMGMvLJRtQNHa+u YIOMTJ7dr4pozQ9zhJi4pkIH9/9eex4hH+ayxiMhwYGqlREf8muw== X-Received: by 2002:a05:6a20:d809:b0:38e:9acd:97d0 with SMTP id adf61e73a8af0-395c3ae8562mr3787342637.34.1772205221514; Fri, 27 Feb 2026 07:13:41 -0800 (PST) Received: from minh.192.168.1.1 ([2001:ee0:4f0f:b1d0:1fac:b09d:ba7c:fa17]) by smtp.googlemail.com with ESMTPSA id 41be03b00d2f7-c70fa638dbcsm5034868a12.14.2026.02.27.07.13.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 27 Feb 2026 07:13:41 -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] virtio-net: xsk: Support wakeup on RX side Date: Fri, 27 Feb 2026 22:09:49 +0700 Message-ID: <20260227150949.13089-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: Xuan Zhuo --- 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_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,21 @@ 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; + struct napi_struct *napi; + struct virtqueue *vq; =20 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 >=3D vi->curr_queue_pairs) return -EINVAL; =20 - sq =3D &vi->sq[qid]; + if (flag =3D=3D XDP_WAKEUP_TX) { + struct send_queue *sq =3D &vi->sq[qid]; + + napi =3D &sq->napi; + vq =3D sq->vq; + } else { + struct receive_queue *rq =3D &vi->rq[qid]; + + napi =3D &rq->napi; + vq =3D rq->vq; + } =20 - xsk_wakeup(sq); + xsk_wakeup(napi, vq); return 0; } =20 @@ -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); } =20 static int __virtnet_xdp_xmit_one(struct virtnet_info *vi, --=20 2.43.0