virtualization.lists.linux-foundation.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] virtio_ring: Fix the stale index in available ring
@ 2024-03-14  7:49 Gavin Shan
  2024-03-14  8:05 ` Michael S. Tsirkin
                   ` (2 more replies)
  0 siblings, 3 replies; 44+ messages in thread
From: Gavin Shan @ 2024-03-14  7:49 UTC (permalink / raw)
  To: virtualization; +Cc: linux-kernel, mst, jasowang, xuanzhuo, yihyu, shan.gavin

The issue is reported by Yihuang Yu who have 'netperf' test on
NVidia's grace-grace and grace-hopper machines. The 'netperf'
client is started in the VM hosted by grace-hopper machine,
while the 'netperf' server is running on grace-grace machine.

The VM is started with virtio-net and vhost has been enabled.
We observe a error message spew from VM and then soft-lockup
report. The error message indicates the data associated with
the descriptor (index: 135) has been released, and the queue
is marked as broken. It eventually leads to the endless effort
to fetch free buffer (skb) in drivers/net/virtio_net.c::start_xmit()
and soft-lockup. The stale index 135 is fetched from the available
ring and published to the used ring by vhost, meaning we have
disordred write to the available ring element and available index.

  /home/gavin/sandbox/qemu.main/build/qemu-system-aarch64              \
  -accel kvm -machine virt,gic-version=host                            \
     :                                                                 \
  -netdev tap,id=vnet0,vhost=on                                        \
  -device virtio-net-pci,bus=pcie.8,netdev=vnet0,mac=52:54:00:f1:26:b0 \

  [   19.993158] virtio_net virtio1: output.0:id 135 is not a head!

Fix the issue by replacing virtio_wmb(vq->weak_barriers) with stronger
virtio_mb(false), equivalent to replaced 'dmb' by 'dsb' instruction on
ARM64. It should work for other architectures, but performance loss is
expected.

Cc: stable@vger.kernel.org
Reported-by: Yihuang Yu <yihyu@redhat.com>
Signed-off-by: Gavin Shan <gshan@redhat.com>
---
 drivers/virtio/virtio_ring.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index 49299b1f9ec7..7d852811c912 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -687,9 +687,15 @@ static inline int virtqueue_add_split(struct virtqueue *_vq,
 	avail = vq->split.avail_idx_shadow & (vq->split.vring.num - 1);
 	vq->split.vring.avail->ring[avail] = cpu_to_virtio16(_vq->vdev, head);
 
-	/* Descriptors and available array need to be set before we expose the
-	 * new available array entries. */
-	virtio_wmb(vq->weak_barriers);
+	/*
+	 * Descriptors and available array need to be set before we expose
+	 * the new available array entries. virtio_wmb() should be enough
+	 * to ensuere the order theoretically. However, a stronger barrier
+	 * is needed by ARM64. Otherwise, the stale data can be observed
+	 * by the host (vhost). A stronger barrier should work for other
+	 * architectures, but performance loss is expected.
+	 */
+	virtio_mb(false);
 	vq->split.avail_idx_shadow++;
 	vq->split.vring.avail->idx = cpu_to_virtio16(_vq->vdev,
 						vq->split.avail_idx_shadow);
-- 
2.44.0


^ permalink raw reply related	[flat|nested] 44+ messages in thread

end of thread, other threads:[~2024-03-27 11:57 UTC | newest]

Thread overview: 44+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-03-14  7:49 [PATCH] virtio_ring: Fix the stale index in available ring Gavin Shan
2024-03-14  8:05 ` Michael S. Tsirkin
2024-03-14 10:15   ` Gavin Shan
2024-03-14 11:50     ` Michael S. Tsirkin
2024-03-14 12:50       ` Gavin Shan
2024-03-14 12:59         ` Michael S. Tsirkin
2024-03-15 10:45           ` Gavin Shan
2024-03-15 11:05             ` Michael S. Tsirkin
2024-03-15 11:24               ` Gavin Shan
2024-03-17 16:50                 ` Michael S. Tsirkin
2024-03-17 23:41                   ` Gavin Shan
2024-03-18  7:50                     ` Michael S. Tsirkin
2024-03-18 16:59 ` Will Deacon
2024-03-19  4:59   ` Gavin Shan
2024-03-19  6:09     ` Michael S. Tsirkin
2024-03-19  6:10       ` Michael S. Tsirkin
2024-03-19  6:54         ` Gavin Shan
2024-03-19  7:04           ` Michael S. Tsirkin
2024-03-19  7:41             ` Gavin Shan
2024-03-19  8:28           ` Michael S. Tsirkin
2024-03-19  6:38       ` Gavin Shan
2024-03-19  6:43         ` Michael S. Tsirkin
2024-03-19  6:49           ` Gavin Shan
2024-03-19  7:09             ` Michael S. Tsirkin
2024-03-19  8:08               ` Gavin Shan
2024-03-19  8:49                 ` Michael S. Tsirkin
2024-03-19 18:22     ` Will Deacon
2024-03-19 23:56       ` Gavin Shan
2024-03-20  0:49         ` Michael S. Tsirkin
2024-03-20  5:24           ` Gavin Shan
2024-03-20  7:14             ` Michael S. Tsirkin
2024-03-25  7:34               ` Gavin Shan
2024-03-26  7:49                 ` Michael S. Tsirkin
2024-03-26  9:38                   ` Keir Fraser
2024-03-26 11:43                     ` Will Deacon
2024-03-26 15:46                       ` Will Deacon
2024-03-26 23:14                         ` Gavin Shan
2024-03-27  0:01                           ` Gavin Shan
2024-03-27 11:56                         ` Michael S. Tsirkin
2024-03-20 17:15             ` Keir Fraser
2024-03-21 12:06               ` Gavin Shan
2024-03-19  7:36   ` Michael S. Tsirkin
2024-03-19 18:21     ` Will Deacon
2024-03-19  6:14 ` Michael S. Tsirkin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).