Thread (38 messages) 38 messages, 4 authors, 2021-04-28

Re: [dpdk-dev] [PATCH v2 3/4] vhost: avoid deadlock on async register

From: Hu, Jiayu <hidden>
Date: 2021-04-14 01:40:12

Hi Maxime,
-----Original Message-----
From: Maxime Coquelin <redacted>
Sent: Tuesday, April 13, 2021 7:33 PM
To: Hu, Jiayu <redacted>; dev@dpdk.org
Cc: Xia, Chenbo <redacted>; Wang, Yinan
[off-list ref]; Pai G, Sunil [off-list ref]; Jiang, Cheng1
[off-list ref]
Subject: Re: [PATCH v2 3/4] vhost: avoid deadlock on async register



On 4/2/21 3:04 PM, Jiayu Hu wrote:
quoted
Users can register async copy device in vring_state_changed(),
when vhost queue is enabled. However, a deadlock occurs inside
rte_vhost_async_channel_register(), if
VHOST_USER_F_PROTOCOL_FEATURES
quoted
is not supported, as vhost_user_msg_handler() takes vq->access_lock
before calling vhost_user_set_vring_kick().

This patch avoids async register deadlock by removing calling
vring_state_changed() in vhost_user_set_vring_kick(). It's safe
as vhost_user_msg_handler() will call vring_state_changed() anyway.

Signed-off-by: Jiayu Hu <redacted>
---
 lib/librte_vhost/vhost_user.c | 3 ---
 1 file changed, 3 deletions(-)
diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c
index 44c0452..8f0eba6 100644
--- a/lib/librte_vhost/vhost_user.c
+++ b/lib/librte_vhost/vhost_user.c
@@ -1918,9 +1918,6 @@ vhost_user_set_vring_kick(struct virtio_net
**pdev, struct VhostUserMsg *msg,
quoted
 	 */
 	if (!(dev->features & (1ULL <<
VHOST_USER_F_PROTOCOL_FEATURES))) {
quoted
 		vq->enabled = true;
-		if (dev->notify_ops->vring_state_changed)
-			dev->notify_ops->vring_state_changed(
-				dev->vid, file.index, 1);
 	}

 	if (vq->ready) {
As replied earlier on v1, I agree the call to vring_state_changed here
is not needed. But it might not be enough, there are other cases where
you could have issues.
vhost_user_notify_queue_state() can be called in three cases:
1. when vq ready status changes, vhost_user_msg_handler() calls it to notify
backend. But vhost_user_msg_handler() doesn't take lock before calling it.
So in this case, no deadlock occurs in async register.

2. if vq->ready is true, vhost_user_set_vring_call() calls it to notify backend
vq is not enabled. Although vhost_user_set_vring_call() is protected by lock,
async register is called only if vq is enabled, so async register will not be called
in this case.

3. If vq->ready is true, vhost_user_set_vring_kick() calls it to notify backend
vq is not enabled. Same as #2, async register is called only when vq is enabled.
Even if vhost_user_set_vring_kick() is protected by lock, there is no deadlock in
async register, as it will not be called in this case.

In summary,  I think there is no deadlock issue in async register if we
can remove calling vring_state_change() in vhost_user_set_vring_kick().
Please add stable and Fixes tag.
Do you suggest to make the patch as a fix for 8639d54563a
("vhost: introduce async enqueue registration API")? But the
thing is that code removed in this patch is not introduced
by this commit.

Thanks,
Jiayu
Thanks,
Maxime
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help