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:
parent
275c5dec0f
commit
45aaf0db1d
@ -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++) {
|
||||||
|
Loading…
Reference in New Issue
Block a user