]> Git Repo - qemu.git/commitdiff
hw/rdma: Bugfix - Support non-aligned buffers
authorYuval Shaia <[email protected]>
Sun, 5 Aug 2018 15:35:17 +0000 (18:35 +0300)
committerMarcel Apfelbaum <[email protected]>
Sat, 18 Aug 2018 15:00:55 +0000 (18:00 +0300)
RDMA application can provide non-aligned buffers to be registered. In
such case the DMA address passed by driver is pointing to the beginning
of the physical address of the mapped page so we can't distinguish
between two addresses from the same page.

Fix it by keeping the offset of the virtual address in mr->virt.

Signed-off-by: Yuval Shaia <[email protected]>
Reviewed-by: Marcel Apfelbaum <[email protected]>
Message-Id: <20180805153518[email protected]>
Signed-off-by: Marcel Apfelbaum <[email protected]>
hw/rdma/rdma_rm.c
hw/rdma/vmw/pvrdma_cmd.c

index 859c90000381cbf65959298ee3785dbc95e54b56..8d59a42cd1385c33c9bdf4b7e2a6db33847f076e 100644 (file)
@@ -166,6 +166,7 @@ int rdma_rm_alloc_mr(RdmaDeviceResources *dev_res, uint32_t pd_handle,
         mr->virt = host_virt;
         mr->start = guest_start;
         mr->length = guest_length;
+        mr->virt += (mr->start & (TARGET_PAGE_SIZE - 1));
 
         ret = rdma_backend_create_mr(&mr->backend_mr, &pd->backend_pd, mr->virt,
                                      mr->length, access_flags);
@@ -203,6 +204,7 @@ void rdma_rm_dealloc_mr(RdmaDeviceResources *dev_res, uint32_t mr_handle)
         rdma_backend_destroy_mr(&mr->backend_mr);
         pr_dbg("start=0x%" PRIx64 "\n", mr->start);
         if (mr->start) {
+            mr->virt -= (mr->start & (TARGET_PAGE_SIZE - 1));
             munmap(mr->virt, mr->length);
         }
         res_tbl_dealloc(&dev_res->mr_tbl, mr_handle);
index 4f74b2993610c3dbf4fedd3073532246db9a9c42..b74b0b48d0508141ec568ead740c4f818b22679b 100644 (file)
@@ -59,6 +59,7 @@ static void *pvrdma_map_to_pdir(PCIDevice *pdev, uint64_t pdir_dma,
     }
 
     host_virt = mremap(curr_page, 0, length, MREMAP_MAYMOVE);
+    pr_dbg("mremap %p -> %p\n", curr_page, host_virt);
     if (host_virt == MAP_FAILED) {
         host_virt = NULL;
         error_report("PVRDMA: Failed to remap memory for host_virt");
This page took 0.025931 seconds and 4 git commands to generate.