[dpdk-stable] [PATCH] vhost: fix host notifier configuration error flow

Matan Azrad matan at mellanox.com
Thu Jun 11 17:47:30 CEST 2020


A vDPA driver can configure its device FD to be notified directly by
the guest memory mapping using `rte_vhost_host_notifier_ctrl` API.

The driver request is managed by the dpdk vhost management and is
forwarded to the QEMU, the vhost massage includes reply request in order
to be sure that the memory mapping was done correctly by the QEMU.

When QEMU finishes the configuration, it marks that its replay is valid
in the slave FD using VHOST_USER_REPLY_MASK flag.
The flag is set only in success and when the slave FD includes the reply
data.

The vhost library didn't validate the above flag before accessing to the
slave FD, it leaded to the thread to be blocked on recvmsg call forever
in case the QEMU has some problems in the notifier configuration.

Handle VHOST_USER_REPLY_MASK flag to validate that slave FD includes
a reply data.

Fixes: d90cf7d111ac ("vhost: support host notifier")
Cc: stable at dpdk.org

Signed-off-by: Matan Azrad <matan at mellanox.com>
---
 lib/librte_vhost/vhost_user.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c
index 84bebad..aa19d15 100644
--- a/lib/librte_vhost/vhost_user.c
+++ b/lib/librte_vhost/vhost_user.c
@@ -2833,8 +2833,14 @@ static int process_slave_message_reply(struct virtio_net *dev,
 	struct VhostUserMsg msg_reply;
 	int ret;
 
-	if ((msg->flags & VHOST_USER_NEED_REPLY) == 0)
-		return 0;
+	if (!(msg->flags & VHOST_USER_REPLY_MASK)) {
+		if (msg->flags & VHOST_USER_NEED_REPLY) {
+			ret = -1;
+			goto out;
+		} else {
+			return 0;
+		}
+	}
 
 	ret = read_vhost_message(dev->slave_req_fd, &msg_reply);
 	if (ret <= 0) {
-- 
1.8.3.1



More information about the stable mailing list