Commit 566d17cd authored by Jinlong Chen's avatar Jinlong Chen Committed by Jim Harris
Browse files

env: handle possible DPDK errors in mem_map_init



rte_mem_event_callback_register and rte_memseg_contig_walk could fail,
handle the failures correctly in mem_map_init.

Change-Id: I4d3333086c45779f58f5c45f4120c00a2cdbdd01
Signed-off-by: default avatarJinlong Chen <chenjinlong.cjl@alibaba-inc.com>
Reviewed-on: https://review.spdk.io/c/spdk/spdk/+/25520


Reviewed-by: default avatarJim Harris <jim.harris@nvidia.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK Automated Test System <spdkbot@gmail.com>
Reviewed-by: default avatarKonrad Sztyber <ksztyber@nvidia.com>
parent 78797fcf
Loading
Loading
Loading
Loading
+54 −3
Original line number Diff line number Diff line
@@ -723,9 +723,36 @@ memory_iter_cb(const struct rte_memseg_list *msl,
	return spdk_mem_register(ms->addr, len);
}

static bool g_mem_event_cb_registered = false;

static int
mem_map_mem_event_callback_register(void)
{
	int rc;

	rc = rte_mem_event_callback_register("spdk", memory_hotplug_cb, NULL);
	if (rc != 0) {
		return rc;
	}

	g_mem_event_cb_registered = true;
	return 0;
}

static void
mem_map_mem_event_callback_unregister(void)
{
	if (g_mem_event_cb_registered) {
		g_mem_event_cb_registered = false;
		rte_mem_event_callback_unregister("spdk", NULL);
	}
}

int
mem_map_init(bool legacy_mem)
{
	int rc;

	g_legacy_mem = legacy_mem;

	g_mem_reg_map = spdk_mem_map_alloc(0, NULL, NULL);
@@ -734,15 +761,39 @@ mem_map_init(bool legacy_mem)
		return -ENOMEM;
	}

	if (!g_huge_pages) {
		return 0;
	}

	if (!g_legacy_mem) {
		/**
		 * To prevent DPDK complaining, only register the callback when
		 * we are not in legacy mem mode.
		 */
		rc = mem_map_mem_event_callback_register();
		if (rc != 0) {
			DEBUG_PRINT("memory event callback registration failed, rc = %d\n", rc);
			goto err_free_reg_map;
		}
	}

	/*
	 * Walk all DPDK memory segments and register them
	 * with the main memory map
	 */
	if (g_huge_pages) {
		rte_mem_event_callback_register("spdk", memory_hotplug_cb, NULL);
		rte_memseg_contig_walk(memory_iter_cb, NULL);
	rc = rte_memseg_contig_walk(memory_iter_cb, NULL);
	if (rc != 0) {
		DEBUG_PRINT("memory segments walking failed, rc = %d\n", rc);
		goto err_unregister_mem_cb;
	}

	return 0;

err_unregister_mem_cb:
	mem_map_mem_event_callback_unregister();
err_free_reg_map:
	spdk_mem_map_free(&g_mem_reg_map);
	return rc;
}

bool
+1 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ DEFINE_STUB(rte_mem_virt2memseg, struct rte_memseg *,
DEFINE_STUB(spdk_env_dpdk_external_init, bool, (void), true);
DEFINE_STUB(rte_mem_event_callback_register, int,
	    (const char *name, rte_mem_event_callback_t clb, void *arg), 0);
DEFINE_STUB(rte_mem_event_callback_unregister, int, (const char *name, void *arg), 0);
DEFINE_STUB(rte_mem_virt2iova, rte_iova_t, (const void *virtaddr), 0);
DEFINE_STUB(rte_eal_iova_mode, enum rte_iova_mode, (void), RTE_IOVA_VA);
DEFINE_STUB(rte_vfio_is_enabled, int, (const char *modname), 0);