summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Coquelin <maxime.coquelin@redhat.com>2018-08-16 19:29:22 +0200
committerYongseok Koh <yskoh@mellanox.com>2018-08-16 10:53:46 -0700
commit96935c61631fe2095246b5dce5c6fea960e34c87 (patch)
tree57e47c80d0b932f6a94210f3d8a167cac4d3b934
parentb245a812737b5da712ce616e5d88aecf75f1bf4e (diff)
downloaddpdk-stable-96935c61631fe2095246b5dce5c6fea960e34c87.zip
dpdk-stable-96935c61631fe2095246b5dce5c6fea960e34c87.tar.gz
dpdk-stable-96935c61631fe2095246b5dce5c6fea960e34c87.tar.xz
vhost: retranslate vring addr when memory table changes
[ backported from upstream commit d5022533c20aed365d513663806a999459037015 ] When the vhost-user master sends memory updates using VHOST_USER_SET_MEM request, the user backends unmap and then mmap again the memory regions in its address space. If the ring addresses have already been translated, it needs to be translated again as they point to unmapped memory. Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
-rw-r--r--lib/librte_vhost/vhost_user.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c
index 07c848c..0eb5e0d 100644
--- a/lib/librte_vhost/vhost_user.c
+++ b/lib/librte_vhost/vhost_user.c
@@ -623,8 +623,9 @@ vhost_memory_changed(struct VhostUserMemory *new,
}
static int
-vhost_user_set_mem_table(struct virtio_net *dev, struct VhostUserMsg *pmsg)
+vhost_user_set_mem_table(struct virtio_net **pdev, struct VhostUserMsg *pmsg)
{
+ struct virtio_net *dev = *pdev;
struct VhostUserMemory memory = pmsg->payload.memory;
struct rte_vhost_mem_region *reg;
void *mmap_addr;
@@ -748,6 +749,25 @@ vhost_user_set_mem_table(struct virtio_net *dev, struct VhostUserMsg *pmsg)
mmap_offset);
}
+ for (i = 0; i < dev->nr_vring; i++) {
+ struct vhost_virtqueue *vq = dev->virtqueue[i];
+
+ if (vq->desc || vq->avail || vq->used) {
+ /*
+ * If the memory table got updated, the ring addresses
+ * need to be translated again as virtual addresses have
+ * changed.
+ */
+ vring_invalidate(dev, vq);
+
+ dev = translate_ring_addresses(dev, i);
+ if (!dev)
+ return -1;
+
+ *pdev = dev;
+ }
+ }
+
dump_guest_pages(dev);
return 0;
@@ -1409,7 +1429,7 @@ vhost_user_msg_handler(int vid, int fd)
break;
case VHOST_USER_SET_MEM_TABLE:
- ret = vhost_user_set_mem_table(dev, &msg);
+ ret = vhost_user_set_mem_table(&dev, &msg);
break;
case VHOST_USER_SET_LOG_BASE: