From nobody Mon Feb 9 06:25:26 2026 Received: from mail-pf1-f171.google.com (mail-pf1-f171.google.com [209.85.210.171]) (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 D4A4C26056A for ; Fri, 2 Jan 2026 15:20:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767367253; cv=none; b=seuYfGEiVAkgcvZ1GCOgqZeiLFk6Dgmg9IhP9wRePWrVkWJujvirV4MxBAhpwWBGzh78H2YAeWgnsduGq9vYtSpUESYW/SeKhW0sg79RVlgx+j34vPj0bEhYqAiizlMyWMMewX4cWXa51M4R0Cl7qVpkdZj6xvYJoA3gMlfFW+k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767367253; c=relaxed/simple; bh=AVmbCTua2itYQSdqi67Rg2DvQJpSs9Fw5lo+ym0KgKI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sT1BG543ewZCpy/ce6WcJJR3w9SoyCJJ9uhaqCgYLtuZMz8fnBURVPZDV3Y3c94TY6XU9367zhg3ZxbgA81tgw3+T9VfQDa4Z8nJHWD3Cp/v9pQrrpHveOXk6EMYjQYzldJykVihbGSzdokIcD4YYtOgUV9zWmNOksuXCubiGuI= 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=nHgspHF9; arc=none smtp.client-ip=209.85.210.171 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="nHgspHF9" Received: by mail-pf1-f171.google.com with SMTP id d2e1a72fcca58-7e1651ae0d5so9411700b3a.1 for ; Fri, 02 Jan 2026 07:20:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1767367248; x=1767972048; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=viiMT0mJ8A1eQE5ko81RyEvaps1qhf8umuQOghYhhoM=; b=nHgspHF9T7yoCA4K1d8XVNuDBmDhdYM8YBktwCnxbjG95MFCE3M6fF3bHqEqvr/Ua9 QQ5wnuUPwC9xSFF3hAfdVB71LSCEnGXQSCIeHtjW9qq1M122ZlRICcp9TthWlVeBzYou uHyf8/0lVgs0XbekgewKVfWyosQ8hzxllxkDRNBlUbUVSTyND+GC2rO91Pc+8xQCFSq0 X3qIAVgYFXSHbbKqJECsa6xVx1/LZadsYdPq8cDDSUVmRgk4GnSERuvYADTbTngFyxso a33gsqa/fbN7DfuehjP01pSRcofhDcjH3FRidSRUKe4URcj/rVRBq0DnjxUWPs5OvqwF pmWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767367248; x=1767972048; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=viiMT0mJ8A1eQE5ko81RyEvaps1qhf8umuQOghYhhoM=; b=j5V3ZKkVxu8S1Dzxt8IEqO4FIWQL1C32/STuLftCY+fT0fpFVeEKaigH3eOT5USfi2 tm4f6yRF5xiFtFza8LZC8x7z97WqTI2H3N0jHXt4z1PnhaMFbtDDxFEm7ybAoFd6Jb8m 3qyfgnN7wmKRGmcKNKhPXHYF2z5i6sfjJ4BVPwJa9adC2/8gWgAgpqufnl44zxIV5kJL mlm6nQXC3You2069rG8PLUX3X24wzvelWjFe0/TnKj+kUf5FhK1X+k9wmr8zYYOo4g03 onV0e7sUYTWR/IyczzjJUsTBLirqV6Xodc+Lemc/1IV8nXL49SAAem+PUPeT8tY32LgK bgIg== X-Forwarded-Encrypted: i=1; AJvYcCXOTzs3g2+LnHJFfj2JvA0sPONgiyn2PUufYLnnLWnneJbhrtWbVheVIS84/vstQBTOlhOLKXJoIVI5RmQ=@vger.kernel.org X-Gm-Message-State: AOJu0YziJVzp+DVRIQ9uefIDfWNX10P0e1BLGd+AulUdqRdBvI1qNwHg Drn4qKBJWzKO3ZoF8zEmPFinBz8k18sn5uvUIjfNwnqRN1THVJah4cfHn6DfxhBO X-Gm-Gg: AY/fxX6vDEj+vSiw5g66MyUuMTysCfn9fe+CVdp0spQLwyhDa6qx+feBPvSq+TU+PCS neddc7SwANJfqDJTvQi+0Fak3wti8s/J7MDi5Enzc34QLCyQXUWrdhRGZ0uCe6d18LTKCaAXlJK p2YbTaPdqgywpC8PXk6vuhgQ5b/whIAvzkNGz3NORvYwASFN96vX6QrbJdY94U9Wqnj/z1jr5y9 Qd/JLSEilfBqTpHn894PiOv6D0F2mcv2BupyXTj2UK95/chVVIK7gW3CCDc6M+ItM0uTATSrpfc 0qB9dUMz4ygLV0281fvUKBGFr12M9/Z93Dkd0pdHwtwTId8zkefKYIQelNXd6KmP0y/3nBtuH0x peDG+t3teHxSrHimv8UGF2SqUN4B6C7PAtkXvVWn+Vdze+GmCLGe2xPen4znbhG0QdX3T84l0Yi N0YmVSDG5PbPVmJtu/ddkcBjjGmfDh0EMYnA== X-Google-Smtp-Source: AGHT+IGW/oGz/NZjf+BGO8R4q9EUzB2Mdtq7Z2nuodi9vs6ehE50GZWiOZQO50TBdIV5gsvGFMRUSA== X-Received: by 2002:a05:6a21:99a4:b0:342:9cb7:649d with SMTP id adf61e73a8af0-376a7cec847mr41356285637.26.1767367248120; Fri, 02 Jan 2026 07:20:48 -0800 (PST) Received: from minh.192.168.1.1 ([2001:ee0:4f4c:210:a612:725:7af0:96ca]) by smtp.googlemail.com with ESMTPSA id 41be03b00d2f7-c1e7c146aabsm35041268a12.25.2026.01.02.07.20.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Jan 2026 07:20:47 -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 , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , Stanislav Fomichev , virtualization@lists.linux.dev, linux-kernel@vger.kernel.org, bpf@vger.kernel.org, Bui Quang Minh , stable@vger.kernel.org Subject: [PATCH net v2 1/3] virtio-net: don't schedule delayed refill worker Date: Fri, 2 Jan 2026 22:20:21 +0700 Message-ID: <20260102152023.10773-2-minhquangbui99@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260102152023.10773-1-minhquangbui99@gmail.com> References: <20260102152023.10773-1-minhquangbui99@gmail.com> 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 we fail to refill the receive buffers, we schedule a delayed worker to retry later. However, this worker creates some concurrency issues such as races and deadlocks. To simplify the logic and avoid further problems, we will instead retry refilling in the next NAPI poll. Fixes: 4bc12818b363 ("virtio-net: disable delayed refill when pausing rx") Reported-by: Paolo Abeni Closes: https://netdev-ctrl.bots.linux.dev/logs/vmksft/drv-hw-dbg/results/4= 00961/3-xdp-py/stderr Cc: stable@vger.kernel.org Suggested-by: Xuan Zhuo Signed-off-by: Bui Quang Minh --- drivers/net/virtio_net.c | 55 ++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 1bb3aeca66c6..ac514c9383ae 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -3035,7 +3035,7 @@ static int virtnet_receive_packets(struct virtnet_inf= o *vi, } =20 static int virtnet_receive(struct receive_queue *rq, int budget, - unsigned int *xdp_xmit) + unsigned int *xdp_xmit, bool *retry_refill) { struct virtnet_info *vi =3D rq->vq->vdev->priv; struct virtnet_rq_stats stats =3D {}; @@ -3047,12 +3047,8 @@ static int virtnet_receive(struct receive_queue *rq,= int budget, packets =3D virtnet_receive_packets(vi, rq, budget, xdp_xmit, &stats); =20 if (rq->vq->num_free > min((unsigned int)budget, virtqueue_get_vring_size= (rq->vq)) / 2) { - if (!try_fill_recv(vi, rq, GFP_ATOMIC)) { - spin_lock(&vi->refill_lock); - if (vi->refill_enabled) - schedule_delayed_work(&vi->refill, 0); - spin_unlock(&vi->refill_lock); - } + if (!try_fill_recv(vi, rq, GFP_ATOMIC)) + *retry_refill =3D true; } =20 u64_stats_set(&stats.packets, packets); @@ -3129,18 +3125,18 @@ static int virtnet_poll(struct napi_struct *napi, i= nt budget) struct send_queue *sq; unsigned int received; unsigned int xdp_xmit =3D 0; - bool napi_complete; + bool napi_complete, retry_refill =3D false; =20 virtnet_poll_cleantx(rq, budget); =20 - received =3D virtnet_receive(rq, budget, &xdp_xmit); + received =3D virtnet_receive(rq, budget, &xdp_xmit, &retry_refill); rq->packets_in_napi +=3D received; =20 if (xdp_xmit & VIRTIO_XDP_REDIR) xdp_do_flush(); =20 /* Out of packets? */ - if (received < budget) { + if (received < budget && !retry_refill) { napi_complete =3D virtqueue_napi_complete(napi, rq->vq, received); /* Intentionally not taking dim_lock here. This may result in a * spurious net_dim call. But if that happens virtnet_rx_dim_work @@ -3160,7 +3156,7 @@ static int virtnet_poll(struct napi_struct *napi, int= budget) virtnet_xdp_put_sq(vi, sq); } =20 - return received; + return retry_refill ? budget : received; } =20 static void virtnet_disable_queue_pair(struct virtnet_info *vi, int qp_ind= ex) @@ -3230,9 +3226,11 @@ static int virtnet_open(struct net_device *dev) =20 for (i =3D 0; i < vi->max_queue_pairs; i++) { if (i < vi->curr_queue_pairs) - /* Make sure we have some buffers: if oom use wq. */ - if (!try_fill_recv(vi, &vi->rq[i], GFP_KERNEL)) - schedule_delayed_work(&vi->refill, 0); + /* If this fails, we will retry later in + * NAPI poll, which is scheduled in the below + * virtnet_enable_queue_pair + */ + try_fill_recv(vi, &vi->rq[i], GFP_KERNEL); =20 err =3D virtnet_enable_queue_pair(vi, i); if (err < 0) @@ -3473,15 +3471,15 @@ static void __virtnet_rx_resume(struct virtnet_info= *vi, bool refill) { bool running =3D netif_running(vi->dev); - bool schedule_refill =3D false; =20 - if (refill && !try_fill_recv(vi, rq, GFP_KERNEL)) - schedule_refill =3D true; + if (refill) + /* If this fails, we will retry later in NAPI poll, which is + * scheduled in the below virtnet_napi_enable + */ + try_fill_recv(vi, rq, GFP_KERNEL); + if (running) virtnet_napi_enable(rq); - - if (schedule_refill) - schedule_delayed_work(&vi->refill, 0); } =20 static void virtnet_rx_resume_all(struct virtnet_info *vi) @@ -3777,6 +3775,7 @@ static int virtnet_set_queues(struct virtnet_info *vi= , u16 queue_pairs) struct virtio_net_rss_config_trailer old_rss_trailer; struct net_device *dev =3D vi->dev; struct scatterlist sg; + int i; =20 if (!vi->has_cvq || !virtio_has_feature(vi->vdev, VIRTIO_NET_F_MQ)) return 0; @@ -3829,11 +3828,17 @@ static int virtnet_set_queues(struct virtnet_info *= vi, u16 queue_pairs) } succ: vi->curr_queue_pairs =3D queue_pairs; - /* virtnet_open() will refill when device is going to up. */ - spin_lock_bh(&vi->refill_lock); - if (dev->flags & IFF_UP && vi->refill_enabled) - schedule_delayed_work(&vi->refill, 0); - spin_unlock_bh(&vi->refill_lock); + if (dev->flags & IFF_UP) { + /* Let the NAPI poll refill the receive buffer for us. We can't + * safely call try_fill_recv() here because the NAPI might be + * enabled already. + */ + local_bh_disable(); + for (i =3D 0; i < vi->curr_queue_pairs; i++) + virtqueue_napi_schedule(&vi->rq[i].napi, vi->rq[i].vq); + + local_bh_enable(); + } =20 return 0; } --=20 2.43.0