Commit 5fd77e32 authored by Changpeng Liu's avatar Changpeng Liu Committed by Tomasz Zawadzki
Browse files

nvmf/vfio-user: unmap queue pairs before spdk_mem_unregister()



Ideally, SPDK should make sure no pending I/Os in this queue
pair are using the removed memory region. Currently we just
stop the submission path and leave a TODO comment here until
we have an asynchronous way to do this.

Also use the `<=` for the boundary check.

Change-Id: I63a2189022978811dc21f92f2599f28a5191ecd7
Signed-off-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/9352


Community-CI: Mellanox Build Bot
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 159fa94a
Loading
Loading
Loading
Loading
+15 −12
Original line number Diff line number Diff line
@@ -1518,29 +1518,32 @@ 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 + info->mapping.iov_len);

	if (info->prot == (PROT_WRITE | PROT_READ)) {
		ret = spdk_mem_unregister(info->mapping.iov_base, info->mapping.iov_len);
		if (ret) {
			SPDK_ERRLOG("Memory region unregister %#lx-%#lx failed, ret=%d\n",
				    (uint64_t)(uintptr_t)info->mapping.iov_base,
				    (uint64_t)(uintptr_t)info->mapping.iov_base + info->mapping.iov_len,
				    ret);
		}
	}

	map_start = info->mapping.iov_base;
	map_end = info->mapping.iov_base + info->mapping.iov_len;

	pthread_mutex_lock(&endpoint->lock);
	TAILQ_FOREACH(qpair, &ctrlr->connected_qps, tailq) {
		if ((qpair->cq.addr >= map_start && qpair->cq.addr < map_end) ||
		    (qpair->sq.addr >= map_start && qpair->sq.addr < map_end)) {
		if ((qpair->cq.addr >= map_start && qpair->cq.addr <= map_end) ||
		    (qpair->sq.addr >= map_start && qpair->sq.addr <= map_end)) {
			/* TODO: Ideally we should disconnect this queue pair
			 * before returning to caller.
			 */
			unmap_qp(qpair);
			qpair->state = VFIO_USER_QPAIR_INACTIVE;
		}
	}
	pthread_mutex_unlock(&endpoint->lock);

	if (info->prot == (PROT_WRITE | PROT_READ)) {
		ret = spdk_mem_unregister(info->mapping.iov_base, info->mapping.iov_len);
		if (ret) {
			SPDK_ERRLOG("Memory region unregister %#lx-%#lx failed, ret=%d\n",
				    (uint64_t)(uintptr_t)info->mapping.iov_base,
				    (uint64_t)(uintptr_t)info->mapping.iov_base + info->mapping.iov_len,
				    ret);
		}
	}

	return 0;
}