Blame SOURCES/0001-vhost-retranslate-vring-addr-when-memory-table-chang.patch

dd2e6b
From 96935c61631fe2095246b5dce5c6fea960e34c87 Mon Sep 17 00:00:00 2001
dd2e6b
From: Maxime Coquelin <maxime.coquelin@redhat.com>
dd2e6b
Date: Thu, 16 Aug 2018 19:29:22 +0200
dd2e6b
Subject: [PATCH] vhost: retranslate vring addr when memory table changes
dd2e6b
dd2e6b
[ backported from upstream commit d5022533c20aed365d513663806a999459037015 ]
dd2e6b
dd2e6b
When the vhost-user master sends memory updates using
dd2e6b
VHOST_USER_SET_MEM request, the user backends unmap and then
dd2e6b
mmap again the memory regions in its address space.
dd2e6b
dd2e6b
If the ring addresses have already been translated, it needs to
dd2e6b
be translated again as they point to unmapped memory.
dd2e6b
dd2e6b
Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
dd2e6b
---
dd2e6b
 lib/librte_vhost/vhost_user.c | 24 ++++++++++++++++++++++--
dd2e6b
 1 file changed, 22 insertions(+), 2 deletions(-)
dd2e6b
dd2e6b
diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c
dd2e6b
index 07c848c7c..0eb5e0d65 100644
dd2e6b
--- a/lib/librte_vhost/vhost_user.c
dd2e6b
+++ b/lib/librte_vhost/vhost_user.c
dd2e6b
@@ -622,8 +622,9 @@ dump_guest_pages(struct virtio_net *dev)
dd2e6b
 #endif
dd2e6b
 
dd2e6b
 static int
dd2e6b
-vhost_user_set_mem_table(struct virtio_net *dev, struct VhostUserMsg *pmsg)
dd2e6b
+vhost_user_set_mem_table(struct virtio_net **pdev, struct VhostUserMsg *pmsg)
dd2e6b
 {
dd2e6b
+	struct virtio_net *dev = *pdev;
dd2e6b
 	struct VhostUserMemory memory = pmsg->payload.memory;
dd2e6b
 	struct rte_vhost_mem_region *reg;
dd2e6b
 	void *mmap_addr;
dd2e6b
@@ -732,6 +733,25 @@ vhost_user_set_mem_table(struct virtio_n
dd2e6b
 			mmap_offset);
dd2e6b
 	}
dd2e6b
 
dd2e6b
+	for (i = 0; i < dev->nr_vring; i++) {
dd2e6b
+		struct vhost_virtqueue *vq = dev->virtqueue[i];
dd2e6b
+
dd2e6b
+		if (vq->desc || vq->avail || vq->used) {
dd2e6b
+			/*
dd2e6b
+			 * If the memory table got updated, the ring addresses
dd2e6b
+			 * need to be translated again as virtual addresses have
dd2e6b
+			 * changed.
dd2e6b
+			 */
dd2e6b
+			vring_invalidate(dev, vq);
dd2e6b
+
dd2e6b
+			dev = translate_ring_addresses(dev, i);
dd2e6b
+			if (!dev)
dd2e6b
+				return -1;
dd2e6b
+
dd2e6b
+			*pdev = dev;
dd2e6b
+		}
dd2e6b
+	}
dd2e6b
+
dd2e6b
 	dump_guest_pages(dev);
dd2e6b
 
dd2e6b
 	return 0;
dd2e6b
@@ -1390,7 +1410,7 @@ vhost_user_msg_handler(int vid, int fd)
dd2e6b
 		break;
dd2e6b
 
dd2e6b
 	case VHOST_USER_SET_MEM_TABLE:
dd2e6b
-		ret = vhost_user_set_mem_table(dev, &msg;;
dd2e6b
+		ret = vhost_user_set_mem_table(&dev, &msg;;
dd2e6b
 		break;
dd2e6b
 
dd2e6b
 	case VHOST_USER_SET_LOG_BASE:
dd2e6b
-- 
dd2e6b
2.17.1
dd2e6b