This deadlock happens when a guest, that had virtio ports with multi queues configured, does not announce the multi q feature in SET_FEATURES. In such a situation, all vq locks are already taken before calling free_vq(), which itself takes the lock.
As mentioned in the code, in this situation, the virtio device is not running yet and no datapath thread is using the vq. So we can release the lock before calling free_vq(). Bugzilla ID: 1196 Fixes: 4b02c2673757 ("vhost: annotate async accesses") Signed-off-by: David Marchand <david.march...@redhat.com> --- lib/vhost/vhost_user.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/vhost/vhost_user.c b/lib/vhost/vhost_user.c index f5edba8548..d60e39b6bc 100644 --- a/lib/vhost/vhost_user.c +++ b/lib/vhost/vhost_user.c @@ -397,6 +397,9 @@ vhost_user_set_features(struct virtio_net **pdev, dev->virtqueue[dev->nr_vring] = NULL; cleanup_vq(vq, 1); cleanup_vq_inflight(dev, vq); + /* vhost_user_lock_all_queue_pairs locked all qps */ + vq_assert_lock(dev, vq); + rte_spinlock_unlock(&vq->access_lock); free_vq(dev, vq); } } -- 2.39.2