diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2025-02-15 00:08:41 +1100 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2025-02-15 05:34:21 +0100 |
commit | 7c33b1208632a9581d0ee7aabd1e0584a5d1fb20 (patch) | |
tree | c136d0773c5be53a89836ca98e41b6fe345bd380 | |
parent | 71249ef3f9bcf1dbb2d6c13cdbc41ba88c794f06 (diff) | |
download | passt-7c33b1208632a9581d0ee7aabd1e0584a5d1fb20.tar passt-7c33b1208632a9581d0ee7aabd1e0584a5d1fb20.tar.gz passt-7c33b1208632a9581d0ee7aabd1e0584a5d1fb20.tar.bz2 passt-7c33b1208632a9581d0ee7aabd1e0584a5d1fb20.tar.lz passt-7c33b1208632a9581d0ee7aabd1e0584a5d1fb20.tar.xz passt-7c33b1208632a9581d0ee7aabd1e0584a5d1fb20.tar.zst passt-7c33b1208632a9581d0ee7aabd1e0584a5d1fb20.zip |
vhost_user: Clear ring address on GET_VRING_BASE
GET_VRING_BASE stops the queue, clearing the call and kick fds. However,
we don't clear vring.avail. That means that if vu_queue_notify() is called
it won't realise the queue isn't ready and will die with an EBADFD.
We get this during migration, because for some reason, qemu reconfigures
the vhost-user device when a migration is triggered. There's a window
between the GET_VRING_BASE and re-establishing the call fd where the
notify function can be called, causing a crash.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
-rw-r--r-- | vhost_user.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/vhost_user.c b/vhost_user.c index 7ab1377..be1aa94 100644 --- a/vhost_user.c +++ b/vhost_user.c @@ -732,6 +732,7 @@ static bool vu_get_vring_base_exec(struct vu_dev *vdev, msg->hdr.size = sizeof(msg->payload.state); vdev->vq[idx].started = false; + vdev->vq[idx].vring.avail = 0; if (vdev->vq[idx].call_fd != -1) { close(vdev->vq[idx].call_fd); |