From: Jiayu Hu <jiayu...@intel.com> When the guest memory is hotplugged, the vhost application which enables DMA acceleration must stop DMA transfers before the vhost re-maps the guest memory.
This patch is to notify the vhost application of stopping DMA transfers. Signed-off-by: Jiayu Hu <jiayu...@intel.com> --- lib/vhost/vhost_user.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/vhost/vhost_user.c b/lib/vhost/vhost_user.c index 031c578e54..8106cc1c30 100644 --- a/lib/vhost/vhost_user.c +++ b/lib/vhost/vhost_user.c @@ -1248,6 +1248,7 @@ vhost_user_set_mem_table(struct virtio_net **pdev, struct VhostUserMsg *msg, int numa_node = SOCKET_ID_ANY; uint64_t mmap_offset; uint32_t i; + bool async_notify = false; if (validate_msg_fds(msg, memory->nregions) != 0) return RTE_VHOST_MSG_RESULT_ERR; @@ -1275,6 +1276,16 @@ vhost_user_set_mem_table(struct virtio_net **pdev, struct VhostUserMsg *msg, vdpa_dev->ops->dev_close(dev->vid); dev->flags &= ~VIRTIO_DEV_VDPA_CONFIGURED; } + + /* notify the vhost application to stop DMA transfers */ + if (dev->async_copy && dev->notify_ops->vring_state_changed) { + for (i = 0; i < dev->nr_vring; i++) { + dev->notify_ops->vring_state_changed(dev->vid, + i, 0); + } + async_notify = true; + } + free_mem_region(dev); rte_free(dev->mem); dev->mem = NULL; @@ -1371,6 +1382,11 @@ vhost_user_set_mem_table(struct virtio_net **pdev, struct VhostUserMsg *msg, dump_guest_pages(dev); + if (async_notify) { + for (i = 0; i < dev->nr_vring; i++) + dev->notify_ops->vring_state_changed(dev->vid, i, 1); + } + return RTE_VHOST_MSG_RESULT_OK; free_mem_table: -- 2.29.2