Commit 80b71d70 authored by Jim Harris's avatar Jim Harris Committed by Konrad Sztyber
Browse files

env_dpdk: use uint64_t instead of void * in memory reg calculations



Newer UBSAN doesn't like adding offsets to NULL addresses. We have unit
tests that use some NULL addresses. We could fix the unit tests but
we can avoid the problem altogether by just having the memory
registration functions work with uint64_t when doing address
calculations.

Fixes issue #3512.

Signed-off-by: default avatarJim Harris <jim.harris@samsung.com>
Change-Id: I6904f68c7e0b0e52e415fc85acca485aeccc0c0c
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/24729


Community-CI: Mellanox Build Bot
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: default avatarMichal Berger <michal.berger@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent 04d14898
Loading
Loading
Loading
Loading
+16 −11
Original line number Diff line number Diff line
@@ -329,21 +329,22 @@ spdk_mem_map_free(struct spdk_mem_map **pmap)
}

int
spdk_mem_register(void *vaddr, size_t len)
spdk_mem_register(void *_vaddr, size_t len)
{
	struct spdk_mem_map *map;
	int rc;
	void *seg_vaddr;
	uint64_t vaddr = (uintptr_t)_vaddr;
	uint64_t seg_vaddr;
	size_t seg_len;
	uint64_t reg;

	if ((uintptr_t)vaddr & ~MASK_256TB) {
		DEBUG_PRINT("invalid usermode virtual address %p\n", vaddr);
		DEBUG_PRINT("invalid usermode virtual address %jx\n", vaddr);
		return -EINVAL;
	}

	if (((uintptr_t)vaddr & MASK_2MB) || (len & MASK_2MB)) {
		DEBUG_PRINT("invalid %s parameters, vaddr=%p len=%ju\n",
		DEBUG_PRINT("invalid %s parameters, vaddr=%jx len=%ju\n",
			    __func__, vaddr, len);
		return -EINVAL;
	}
@@ -377,7 +378,8 @@ spdk_mem_register(void *vaddr, size_t len)
	}

	TAILQ_FOREACH(map, &g_spdk_mem_maps, tailq) {
		rc = map->ops.notify_cb(map->cb_ctx, map, SPDK_MEM_MAP_NOTIFY_REGISTER, seg_vaddr, seg_len);
		rc = map->ops.notify_cb(map->cb_ctx, map, SPDK_MEM_MAP_NOTIFY_REGISTER,
					(void *)seg_vaddr, seg_len);
		if (rc != 0) {
			pthread_mutex_unlock(&g_spdk_mem_map_mutex);
			return rc;
@@ -389,21 +391,22 @@ spdk_mem_register(void *vaddr, size_t len)
}

int
spdk_mem_unregister(void *vaddr, size_t len)
spdk_mem_unregister(void *_vaddr, size_t len)
{
	struct spdk_mem_map *map;
	int rc;
	void *seg_vaddr;
	uint64_t vaddr = (uintptr_t)_vaddr;
	uint64_t seg_vaddr;
	size_t seg_len;
	uint64_t reg, newreg;

	if ((uintptr_t)vaddr & ~MASK_256TB) {
		DEBUG_PRINT("invalid usermode virtual address %p\n", vaddr);
		DEBUG_PRINT("invalid usermode virtual address %jx\n", vaddr);
		return -EINVAL;
	}

	if (((uintptr_t)vaddr & MASK_2MB) || (len & MASK_2MB)) {
		DEBUG_PRINT("invalid %s parameters, vaddr=%p len=%ju\n",
		DEBUG_PRINT("invalid %s parameters, vaddr=%jx len=%ju\n",
			    __func__, vaddr, len);
		return -EINVAL;
	}
@@ -449,7 +452,8 @@ spdk_mem_unregister(void *vaddr, size_t len)

		if (seg_len > 0 && (reg & REG_MAP_NOTIFY_START)) {
			TAILQ_FOREACH_REVERSE(map, &g_spdk_mem_maps, spdk_mem_map_head, tailq) {
				rc = map->ops.notify_cb(map->cb_ctx, map, SPDK_MEM_MAP_NOTIFY_UNREGISTER, seg_vaddr, seg_len);
				rc = map->ops.notify_cb(map->cb_ctx, map, SPDK_MEM_MAP_NOTIFY_UNREGISTER,
							(void *)seg_vaddr, seg_len);
				if (rc != 0) {
					pthread_mutex_unlock(&g_spdk_mem_map_mutex);
					return rc;
@@ -468,7 +472,8 @@ spdk_mem_unregister(void *vaddr, size_t len)

	if (seg_len > 0) {
		TAILQ_FOREACH_REVERSE(map, &g_spdk_mem_maps, spdk_mem_map_head, tailq) {
			rc = map->ops.notify_cb(map->cb_ctx, map, SPDK_MEM_MAP_NOTIFY_UNREGISTER, seg_vaddr, seg_len);
			rc = map->ops.notify_cb(map->cb_ctx, map, SPDK_MEM_MAP_NOTIFY_UNREGISTER,
						(void *)seg_vaddr, seg_len);
			if (rc != 0) {
				pthread_mutex_unlock(&g_spdk_mem_map_mutex);
				return rc;