Currently, vhost async copy feature will check if VFIO supports DMA mapping
on every attempt to add/remove memory region or set memory table. This is
not necessary, so instead check this once at new vhost connection, and
store that value for future use.

Signed-off-by: Anatoly Burakov <[email protected]>
---
 lib/vhost/socket.c     |  5 ++++-
 lib/vhost/vhost.h      |  1 +
 lib/vhost/vhost_user.c | 10 +++++-----
 3 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/lib/vhost/socket.c b/lib/vhost/socket.c
index 0943b3e9bb6..a8f58c95e83 100644
--- a/lib/vhost/socket.c
+++ b/lib/vhost/socket.c
@@ -17,6 +17,7 @@
 #include <eal_export.h>
 #include <rte_thread.h>
 #include <rte_log.h>
+#include <rte_vfio.h>
 
 #include "fd_man.h"
 #include "vduse.h"
@@ -242,8 +243,10 @@ vhost_user_add_connection(int fd, struct vhost_user_socket 
*vsocket)
        if (vsocket->async_copy) {
                dev = get_device(vid);
 
-               if (dev)
+               if (dev != NULL) {
                        dev->async_copy = 1;
+                       dev->dma_map_available = rte_vfio_is_enabled("vfio");
+               }
        }
 
        VHOST_CONFIG_LOG(vsocket->path, INFO, "new device, handle is %d", vid);
diff --git a/lib/vhost/vhost.h b/lib/vhost/vhost.h
index bb4708aed5e..75736eed3b5 100644
--- a/lib/vhost/vhost.h
+++ b/lib/vhost/vhost.h
@@ -499,6 +499,7 @@ struct __rte_cache_aligned virtio_net {
        RTE_ATOMIC(int16_t)     broadcast_rarp;
        uint32_t                nr_vring;
        int                     async_copy;
+       bool                    dma_map_available;
 
        int                     extbuf;
        int                     linearbuf;
diff --git a/lib/vhost/vhost_user.c b/lib/vhost/vhost_user.c
index 020c993b299..2d91722fcc0 100644
--- a/lib/vhost/vhost_user.c
+++ b/lib/vhost/vhost_user.c
@@ -267,7 +267,7 @@ free_all_mem_regions(struct virtio_net *dev)
        if (!dev || !dev->mem)
                return;
 
-       if (dev->async_copy && rte_vfio_is_enabled("vfio"))
+       if (dev->async_copy && dev->dma_map_available)
                async_dma_map(dev, false);
 
        for (i = 0; i < VHOST_MEMORY_MAX_NREGIONS; i++) {
@@ -1564,7 +1564,7 @@ vhost_user_set_mem_table(struct virtio_net **pdev,
                dev->mem->nregions++;
        }
 
-       if (dev->async_copy && rte_vfio_is_enabled("vfio"))
+       if (dev->async_copy && dev->dma_map_available)
                async_dma_map(dev, true);
 
        if (vhost_user_postcopy_register(dev, main_fd, ctx) < 0)
@@ -1750,7 +1750,7 @@ vhost_user_add_mem_reg(struct virtio_net **pdev,
 
        dev->mem->nregions++;
 
-       if (dev->async_copy && rte_vfio_is_enabled("vfio")) {
+       if (dev->async_copy && dev->dma_map_available) {
                if (async_dma_map_region(dev, reg, true) < 0)
                        goto free_new_region_no_dma;
        }
@@ -1791,7 +1791,7 @@ vhost_user_add_mem_reg(struct virtio_net **pdev,
        return RTE_VHOST_MSG_RESULT_OK;
 
 free_new_region:
-       if (dev->async_copy && rte_vfio_is_enabled("vfio"))
+       if (dev->async_copy && dev->dma_map_available)
                async_dma_map_region(dev, reg, false);
 free_new_region_no_dma:
        remove_guest_pages(dev, reg);
@@ -1827,7 +1827,7 @@ vhost_user_rem_mem_reg(struct virtio_net **pdev,
                if (region->userspace_addr == current_region->guest_user_addr
                        && region->guest_phys_addr == 
current_region->guest_phys_addr
                        && region->memory_size == current_region->size) {
-                       if (dev->async_copy && rte_vfio_is_enabled("vfio"))
+                       if (dev->async_copy && dev->dma_map_available)
                                async_dma_map_region(dev, current_region, 
false);
                        if (dev->features & (1ULL << VIRTIO_F_IOMMU_PLATFORM))
                                vhost_user_iotlb_cache_remove(dev,
-- 
2.52.0

Reply via email to