A deadlock happens when handling VHOST_USER_RESET_OWNER request
for the same reason the lock is not taken for
VHOST_USER_GET_VRING_BASE.

It is safe not to take the lock, as the queues are no more used
by the application when the virtqueues and the device are reset.

Fixes: a3688046995f ("vhost: protect active rings from async ring changes")
Cc: sta...@dpdk.org

Cc: Victor Kaplansky <vict...@redhat.com>
Reviewed-by: Tiwei Bie <tiwei....@intel.com>
Reviewed-by: Jianfeng Tan <jianfeng....@intel.com>
Signed-off-by: Maxime Coquelin <maxime.coque...@redhat.com>
---
 lib/librte_vhost/vhost_user.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c
index 65ee33919..90ed2112e 100644
--- a/lib/librte_vhost/vhost_user.c
+++ b/lib/librte_vhost/vhost_user.c
@@ -1348,16 +1348,16 @@ vhost_user_msg_handler(int vid, int fd)
        }
 
        /*
-        * Note: we don't lock all queues on VHOST_USER_GET_VRING_BASE,
-        * since it is sent when virtio stops and device is destroyed.
-        * destroy_device waits for queues to be inactive, so it is safe.
-        * Otherwise taking the access_lock would cause a dead lock.
+        * Note: we don't lock all queues on VHOST_USER_GET_VRING_BASE
+        * and VHOST_USER_RESET_OWNER, since it is sent when virtio stops
+        * and device is destroyed. destroy_device waits for queues to be
+        * inactive, so it is safe. Otherwise taking the access_lock
+        * would cause a dead lock.
         */
        switch (msg.request.master) {
        case VHOST_USER_SET_FEATURES:
        case VHOST_USER_SET_PROTOCOL_FEATURES:
        case VHOST_USER_SET_OWNER:
-       case VHOST_USER_RESET_OWNER:
        case VHOST_USER_SET_MEM_TABLE:
        case VHOST_USER_SET_LOG_BASE:
        case VHOST_USER_SET_LOG_FD:
-- 
2.14.3

Reply via email to