From: Oleksandr Kolomeiets <okl-...@napatech.com>

Perform unmapping in a default container, which is used by queues.
Handle multiple mappings when IOMMU is unoptimized.

Fixes: c1c139535591 ("net/ntnic: add VFIO module")

Signed-off-by: Oleksandr Kolomeiets <okl-...@napatech.com>
---
 drivers/net/ntnic/include/ntos_drv.h |  1 +
 drivers/net/ntnic/ntnic_ethdev.c     | 26 ++++++++++++++++++++++++--
 drivers/net/ntnic/ntnic_vfio.c       |  3 ---
 3 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ntnic/include/ntos_drv.h 
b/drivers/net/ntnic/include/ntos_drv.h
index cef3c5c277..047c077057 100644
--- a/drivers/net/ntnic/include/ntos_drv.h
+++ b/drivers/net/ntnic/include/ntos_drv.h
@@ -51,6 +51,7 @@ struct nthw_memory_descriptor {
 struct hwq_s {
        int vf_num;
        struct nthw_memory_descriptor virt_queues_ctrl;
+       struct nthw_memory_descriptor pkt_buffers_ctrl;
        struct nthw_memory_descriptor *pkt_buffers;
 };
 
diff --git a/drivers/net/ntnic/ntnic_ethdev.c b/drivers/net/ntnic/ntnic_ethdev.c
index d875e7c236..79ef9e7e7c 100644
--- a/drivers/net/ntnic/ntnic_ethdev.c
+++ b/drivers/net/ntnic/ntnic_ethdev.c
@@ -879,6 +879,10 @@ static int allocate_hw_virtio_queues(struct rte_eth_dev 
*eth_dev, int vf_num, st
                if (res != 0)
                        return -1;
 
+               hwq->pkt_buffers_ctrl.virt_addr = virt_addr;
+               hwq->pkt_buffers_ctrl.phys_addr = (void *)iova_addr;
+               hwq->pkt_buffers_ctrl.len = size;
+
                for (i = 0; i < num_descr; i++) {
                        hwq->pkt_buffers[i].virt_addr =
                                (void *)((char *)virt_addr + ((uint64_t)(i) * 
buf_size));
@@ -900,9 +904,13 @@ static int allocate_hw_virtio_queues(struct rte_eth_dev 
*eth_dev, int vf_num, st
        hwq->vf_num = vf_num;
        hwq->virt_queues_ctrl.virt_addr = virt;
        hwq->virt_queues_ctrl.phys_addr = (void *)(iova_addr);
-       hwq->virt_queues_ctrl.len = 0x100000;
+       hwq->virt_queues_ctrl.len = ONE_G_SIZE;
        iova_addr += 0x100000;
 
+       hwq->pkt_buffers_ctrl.virt_addr = NULL;
+       hwq->pkt_buffers_ctrl.phys_addr = NULL;
+       hwq->pkt_buffers_ctrl.len = 0;
+
        NT_LOG(DBG, NTNIC,
                "VFIO MMAP: virt_addr=%p phys_addr=%p size=%" PRIX32 " hpa=%" 
PRIX64 "",
                hwq->virt_queues_ctrl.virt_addr, 
hwq->virt_queues_ctrl.phys_addr,
@@ -948,13 +956,27 @@ static int deallocate_hw_virtio_queues(struct hwq_s *hwq)
        void *virt = hwq->virt_queues_ctrl.virt_addr;
 
        int res = nt_vfio_dma_unmap(vf_num, hwq->virt_queues_ctrl.virt_addr,
-                       (uint64_t)hwq->virt_queues_ctrl.phys_addr, ONE_G_SIZE);
+                       (uint64_t)hwq->virt_queues_ctrl.phys_addr, 
hwq->virt_queues_ctrl.len);
 
        if (res != 0) {
                NT_LOG(ERR, NTNIC, "VFIO UNMMAP FAILED! res %i, vf_num %i", 
res, vf_num);
                return -1;
        }
 
+       if (hwq->pkt_buffers_ctrl.virt_addr != NULL &&
+                       hwq->pkt_buffers_ctrl.phys_addr != NULL &&
+                       hwq->pkt_buffers_ctrl.len > 0) {
+               int res = nt_vfio_dma_unmap(vf_num,
+                               hwq->pkt_buffers_ctrl.virt_addr,
+                               (uint64_t)hwq->pkt_buffers_ctrl.phys_addr,
+                               hwq->pkt_buffers_ctrl.len);
+
+               if (res != 0) {
+                       NT_LOG(ERR, NTNIC, "VFIO UNMMAP FAILED! res %i, vf_num 
%i", res, vf_num);
+                       return -1;
+               }
+       }
+
        release_hw_virtio_queues(hwq);
        rte_free(hwq->pkt_buffers);
        rte_free(virt);
diff --git a/drivers/net/ntnic/ntnic_vfio.c b/drivers/net/ntnic/ntnic_vfio.c
index 8d955e8342..1031b3cf67 100644
--- a/drivers/net/ntnic/ntnic_vfio.c
+++ b/drivers/net/ntnic/ntnic_vfio.c
@@ -211,9 +211,6 @@ nt_vfio_dma_unmap(int vf_num, void *virt_addr, uint64_t 
iova_addr, uint64_t size
                return -1;
        }
 
-       if (vfio->container_fd == -1)
-               return 0;
-
        int res = rte_vfio_container_dma_unmap(vfio->container_fd, 
gp_virt_base, iova_addr, size);
 
        if (res != 0) {
-- 
2.45.0

Reply via email to