nvmf/vfio-user: register external DMA memory regions to SPDK

For NVMe backend device, we should use vtophys to calculate
physical address when doing DMA from/to VM to drives.

Fix #1822.

Change-Id: Ib8fbc371e19e77a20202d408340e7d65644b1eeb
Signed-off-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/7261
Community-CI: Broadcom CI
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Changpeng Liu 2021-03-24 20:30:22 +08:00 committed by Tomasz Zawadzki
parent 275c5dec0f
commit 45aaf0db1d

View File

@ -1091,6 +1091,16 @@ memory_region_add_cb(vfu_ctx_t *vfu_ctx, vfu_dma_info_t *info)
(uintptr_t)info->mapping.iov_base, (uintptr_t)info->mapping.iov_base,
(uintptr_t)info->mapping.iov_base + info->mapping.iov_len); (uintptr_t)info->mapping.iov_base + info->mapping.iov_len);
/* VFIO_DMA_MAP_FLAG_READ | VFIO_DMA_MAP_FLAG_WRITE are enabled when registering to VFIO, here we also
* check the protection bits before registering.
*/
if ((info->prot == (PROT_WRITE | PROT_READ)) &&
(spdk_mem_register(info->mapping.iov_base, info->mapping.iov_len))) {
SPDK_ERRLOG("Memory region register %#lx-%#lx failed\n",
(uint64_t)(uintptr_t)info->mapping.iov_base,
(uint64_t)(uintptr_t)info->mapping.iov_base + info->mapping.iov_len);
}
for (i = 0; i < NVMF_VFIO_USER_DEFAULT_MAX_QPAIRS_PER_CTRLR; i++) { for (i = 0; i < NVMF_VFIO_USER_DEFAULT_MAX_QPAIRS_PER_CTRLR; i++) {
qpair = ctrlr->qp[i]; qpair = ctrlr->qp[i];
if (qpair == NULL) { if (qpair == NULL) {
@ -1157,6 +1167,13 @@ memory_region_remove_cb(vfu_ctx_t *vfu_ctx, vfu_dma_info_t *info)
(uintptr_t)info->mapping.iov_base, (uintptr_t)info->mapping.iov_base,
(uintptr_t)info->mapping.iov_base + info->mapping.iov_len); (uintptr_t)info->mapping.iov_base + info->mapping.iov_len);
if ((info->prot == (PROT_WRITE | PROT_READ)) &&
(spdk_mem_unregister(info->mapping.iov_base, info->mapping.iov_len))) {
SPDK_ERRLOG("Memory region unregister %#lx-%#lx failed\n",
(uint64_t)(uintptr_t)info->mapping.iov_base,
(uint64_t)(uintptr_t)info->mapping.iov_base + info->mapping.iov_len);
}
map_start = info->mapping.iov_base; map_start = info->mapping.iov_base;
map_end = info->mapping.iov_base + info->mapping.iov_len; map_end = info->mapping.iov_base + info->mapping.iov_len;
for (i = 0; i < NVMF_VFIO_USER_DEFAULT_MAX_QPAIRS_PER_CTRLR; i++) { for (i = 0; i < NVMF_VFIO_USER_DEFAULT_MAX_QPAIRS_PER_CTRLR; i++) {