From nobody Mon Dec 1 22:02:20 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C1B6E239594 for ; Thu, 27 Nov 2025 07:02:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764226929; cv=none; b=ETScj5oTtPPev6hMq8yWu5LwA0pasWvoUZQmYf6M48IQqOFUtsITxcF/UhKRWJdymIEl0GVrXeW8J2gqZMC08a8NGUKaolDbPNSrkH6DAzk5O1S3OmMx6l2JzxiuYaZMm+U066Mej286u5uRzIolQ8O3mume6R6RJb8mIQjJ9pg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764226929; c=relaxed/simple; bh=xjYmOYkC6hQCN6h0Wrd6wD3+n3RutDCKmgFu6vCgU3E=; h=Date:From:To:Cc:Subject:Message-ID:MIME-Version:Content-Type: Content-Disposition:In-Reply-To; b=pMu4mmlsSmfU89JieJBIrcqNEA1xaeEHQ5MlRpPMSMUYWZXKGZFpT4/p7BAmQEXw2uxcoss+6XHw9cYsAL+4ZvTsFm+oTUgoF54LQ9DoCKRb5PWW7AlleIShpR0aHacmvSroxHQJ7hdEJLx52BiBT2qT+uvE0IbCb+KdmbxgZXw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=beoFLn8E; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.b=Id9swuIQ; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="beoFLn8E"; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.b="Id9swuIQ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1764226925; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to; bh=zSWWelL3VjQzbwp1FSCA4jXNnLH0PC4MUEaJbD9i6vM=; b=beoFLn8EbZT9s5xcBkoEGvvMBAvl/YMUPo+wSi778UR4BYgkzMwEi0Hpcn50l/RoHNgCCu X74B/EeWvEbvJjUWYI+sEsgRzLDo/AhyLwkSD6aA/JpetYvK7D6Ku3yZVkkdqtHPCNtZN4 MJfMkkrMxlVUe1zD7xQfmSMnPY7ISCc= Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-168-Gy7kPcuvOwaM_OiRUFTN0A-1; Thu, 27 Nov 2025 02:02:02 -0500 X-MC-Unique: Gy7kPcuvOwaM_OiRUFTN0A-1 X-Mimecast-MFC-AGG-ID: Gy7kPcuvOwaM_OiRUFTN0A_1764226921 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-477cf2230c8so4027715e9.0 for ; Wed, 26 Nov 2025 23:02:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1764226921; x=1764831721; darn=vger.kernel.org; h=in-reply-to:content-disposition:mime-version:message-id:subject:cc :to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=zSWWelL3VjQzbwp1FSCA4jXNnLH0PC4MUEaJbD9i6vM=; b=Id9swuIQMmOfW94DIy0QI99WwQmUkEfNVLU6wypz0c1Rob6vt7JEqkACq4XoV7Dzxb U+V2yjdlgx96WxsT38WtD2Cnt8HX+dBNzCyZNJfyyGoyVgxSWwfiGqPEdW9U1blU8rCy dlCeif/5K+LJjhuRBzsG1Occr42FnHkDFCLIcB1cPAjAwkWcS3Xkf14ukVLEizb3uVUG gKrDb58lOu2qVgX0WHyiAwfHePTrriDdO6t1R5qiH365gHuDFB3OPQirpDgZ6cZhwXrz OdpTuWRRH+YkUz5//it/R71HSnrWlTOUH8p1Ry97gmHYL4lWNN67BIClGZK6P+n8KRYi eLBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764226921; x=1764831721; h=in-reply-to:content-disposition:mime-version:message-id:subject:cc :to:from:date:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=zSWWelL3VjQzbwp1FSCA4jXNnLH0PC4MUEaJbD9i6vM=; b=jRYvhPno/no3Cc/c7xw421efm56VYiwahEtHVQKE9EjjWLb3AjjnagYK9w88fLNshp 9oCawutXSZtjaZDVQc8xUJUOD33CW4L/srwc5OifUDDwd1R4luXY+yxY5TUhTt/MKdwW gmziA6ynOqM6Zp9MpOGDgDBIUaAmsjA2Mu0MzR/wel7/JrCLX8JawaePxzYqRM+5CAbv 9qT0knotwVi4Ur/ea4ffAckf8eSrPGhxlRCgch1CdY4hNLOEXNIfBmQ3OTJ6TMb3VK2E WiakXAII6ABT0Y51s/6ZN2JK36mY7Mxwzt3XBrhiBk1MD3HRltjw+o9xuaI7JhdzUqzr KTQA== X-Gm-Message-State: AOJu0Ywj1Tpa8Fg93BypH8CsoeYg2toznS2xVhulrpGBPuwXPaWrKcf7 KvoCdotSdVcKhy5q9BhEnkjuVQo6SpifvBbIzESXwB6dXqlbI4AD+UZHibGspiVeWkepgtaROtv 0XB06oqCcmyqDGH8+TEgdNOqfewuzjKKgN56nLu2p54oCKQTQfRWV7lzmwa4MshnefEU7TYXpSD wNn7wttGYPVzMiWr3Dcjk+owwUyY41+1KYuCsKTSTi1NY= X-Gm-Gg: ASbGncto+4H2soJtnZBDsHCy3SyalAb7a7346NYVMKVuyBDcD7UV2uV24Ix5QquzTOs Fo9hWnI6K01r5bRaoISOfkGjRcCnhQuILmFDayUD/tRn2UzWORbw8KBlwsMURuD68Zo+0j61nEz 8uaPPqW+ZBnYEIaXOczv8jQ1QK03kVdWsXU9w5tG7+feL20wRfE1hRGSQhg9myVx76eHdG+g2eX dQi6wcn/ghrs50+djakBms3j0qX2r5hue3xNzGEHPW14Gr4xhcOesn+pCiclpX3JTZG+H125aNI x9aO2x9oi8JF7t/OpsYv3QeUQY7H+GwBXloKU3l5uyovmxvFNslkLilPb7umwtA0UVJUnq7wcOY VaSbUVSQwkxCRfYHezjtEU5fcUazGNQ== X-Received: by 2002:a05:600c:4e91:b0:477:7a95:b971 with SMTP id 5b1f17b1804b1-47904b2c3dfmr100075985e9.31.1764226920956; Wed, 26 Nov 2025 23:02:00 -0800 (PST) X-Google-Smtp-Source: AGHT+IHeJSq2o5Jh57pm1UqzfET6pe+NMDqgpP0OpHkh/lilO5EV4Yb7bQ/OQj6YpndJYbLTati9Ig== X-Received: by 2002:a05:600c:4e91:b0:477:7a95:b971 with SMTP id 5b1f17b1804b1-47904b2c3dfmr100075365e9.31.1764226920341; Wed, 26 Nov 2025 23:02:00 -0800 (PST) Received: from redhat.com (IGLD-80-230-39-63.inter.net.il. [80.230.39.63]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-479111438b9sm17019475e9.2.2025.11.26.23.01.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Nov 2025 23:01:59 -0800 (PST) Date: Thu, 27 Nov 2025 02:01:57 -0500 From: "Michael S. Tsirkin" To: linux-kernel@vger.kernel.org Cc: Paolo Abeni , Jason Wang , Xuan Zhuo , Eugenio =?utf-8?B?UMOpcmV6?= , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , Stanislav Fomichev , Bui Quang Minh , virtualization@lists.linux.dev, netdev@vger.kernel.org, bpf@vger.kernel.org Subject: [PATCH RFC] virtio_net: gate delayed refill scheduling Message-ID: <40af2b73239850e7bf1a81abb71ee99f1b563b9c.1764226734.git.mst@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <526b5396-459d-4d02-8635-a222d07b46d7@redhat.com> X-Mailer: git-send-email 2.27.0.106.g8ac3dc51b1 X-Mutt-Fcc: =sent Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Make the delayed refill worker honor the "refill_enabled" flag by checking it under refill_lock before requeueing itself. This prevents a window where virtnet_rx_pause[_all]() disables NAPI and synchronously waits for the current refill_work instance to finish only for that instance to immediately arm another run, which then deadlocks when it tries to double-disable NAPI. Add and use a helper that encapsulates the locking and flag check so all refill scheduling paths behave consistently and we no longer replicate the spin_lock/unlock pattern. This fixes the deadlock triggered by the XDP selftests when XDP is toggled and RX is paused/resumed quickly. 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 Signed-off-by: Michael S. Tsirkin --- Lightly tested. Paolo is there a way to confirm this actually fixes the bug? Could you help with that? drivers/net/virtio_net.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 8855a994e12b..e2bfe8337f50 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -734,6 +734,15 @@ static void disable_delayed_refill(struct virtnet_info= *vi) spin_unlock_bh(&vi->refill_lock); } =20 +static void virtnet_schedule_refill_work(struct virtnet_info *vi, + unsigned long delay) +{ + spin_lock_bh(&vi->refill_lock); + if (vi->refill_enabled) + schedule_delayed_work(&vi->refill, delay); + spin_unlock_bh(&vi->refill_lock); +} + static void enable_rx_mode_work(struct virtnet_info *vi) { rtnl_lock(); @@ -2959,7 +2968,7 @@ static void refill_work(struct work_struct *work) * we will *never* try to fill again. */ if (still_empty) - schedule_delayed_work(&vi->refill, HZ/2); + virtnet_schedule_refill_work(vi, HZ/2); } } =20 @@ -3026,12 +3035,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)) + virtnet_schedule_refill_work(vi, 0); } =20 u64_stats_set(&stats.packets, packets); @@ -3216,7 +3221,7 @@ static int virtnet_open(struct net_device *dev) 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); + virtnet_schedule_refill_work(vi, 0); =20 err =3D virtnet_enable_queue_pair(vi, i); if (err < 0) @@ -3469,7 +3474,7 @@ static void __virtnet_rx_resume(struct virtnet_info *= vi, virtnet_napi_enable(rq); =20 if (schedule_refill) - schedule_delayed_work(&vi->refill, 0); + virtnet_schedule_refill_work(vi, 0); } =20 static void virtnet_rx_resume_all(struct virtnet_info *vi) @@ -3815,10 +3820,8 @@ static int virtnet_set_queues(struct virtnet_info *v= i, 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) + virtnet_schedule_refill_work(vi, 0); =20 return 0; } --=20 MST