Commit f914cd2e authored by Jacek Kalwas's avatar Jacek Kalwas Committed by Tomasz Zawadzki
Browse files

dma: add a default "system" domain



This allows components to say they are memory domain aware, but don't
necessarily have a special memory domain they can access.

Change-Id: I9073c8297c1af0391c9472c16baf74ad255d7762
Signed-off-by: default avatarBen Walker <ben@nvidia.com>
Signed-off-by: default avatarJacek Kalwas <jacek.kalwas@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/21910


Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Community-CI: Mellanox Build Bot
parent 02035b01
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -353,6 +353,12 @@ struct spdk_memory_domain *spdk_memory_domain_get_first(const char *id);
struct spdk_memory_domain *spdk_memory_domain_get_next(struct spdk_memory_domain *prev,
		const char *id);

/**
 * Get the System memory domain.
 *
 * \return Pointer to the System memory domain.
 */
struct spdk_memory_domain *spdk_memory_domain_get_system_domain(void);

#ifdef __cplusplus
}
+20 −0
Original line number Diff line number Diff line
@@ -22,6 +22,24 @@ struct spdk_memory_domain {
	char *id;
};

static struct spdk_memory_domain g_system_domain = {
	.type = SPDK_DMA_DEVICE_TYPE_DMA,
	.id = "system",
};

static void
__attribute__((constructor))
_memory_domain_register(void)
{
	TAILQ_INSERT_TAIL(&g_dma_memory_domains, &g_system_domain, link);
}

struct spdk_memory_domain *
spdk_memory_domain_get_system_domain(void)
{
	return &g_system_domain;
}

int
spdk_memory_domain_create(struct spdk_memory_domain **_domain, enum spdk_dma_device_type type,
			  struct spdk_memory_domain_ctx *ctx, const char *id)
@@ -156,6 +174,8 @@ spdk_memory_domain_destroy(struct spdk_memory_domain *domain)
		return;
	}

	assert(domain != &g_system_domain);

	pthread_mutex_lock(&g_dma_mutex);
	TAILQ_REMOVE(&g_dma_memory_domains, domain, link);
	pthread_mutex_unlock(&g_dma_mutex);
+1 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
	spdk_memory_domain_memzero;
	spdk_memory_domain_get_first;
	spdk_memory_domain_get_next;
	spdk_memory_domain_get_system_domain;

	local: *;
};
+12 −5
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ test_dma(void)
	void *test_ibv_pd = (void *)0xdeadbeaf;
	struct iovec src_iov = {}, dst_iov = {};
	struct spdk_memory_domain *domain = NULL, *domain_2 = NULL, *domain_3 = NULL;
	struct spdk_memory_domain *system_domain;
	struct spdk_memory_domain_rdma_ctx rdma_ctx = { .ibv_pd = test_ibv_pd };
	struct spdk_memory_domain_ctx memory_domain_ctx = { .user_ctx = &rdma_ctx };
	struct spdk_memory_domain_ctx *stored_memory_domain_ctx;
@@ -72,6 +73,9 @@ test_dma(void)
	const char *id;
	int rc;

	system_domain = spdk_memory_domain_get_system_domain();
	CU_ASSERT(system_domain != NULL);

	/* Create memory domain. No device ptr, expect fail */
	rc = spdk_memory_domain_create(NULL, SPDK_DMA_DEVICE_TYPE_RDMA, &memory_domain_ctx, "test");
	CU_ASSERT(rc != 0);
@@ -201,30 +205,33 @@ test_dma(void)
	CU_ASSERT(spdk_memory_domain_get_next(domain_2, "test_2") == domain_3);
	CU_ASSERT(spdk_memory_domain_get_next(domain_3, "test_2") == NULL);

	CU_ASSERT(spdk_memory_domain_get_first(NULL) == domain);
	CU_ASSERT(spdk_memory_domain_get_first(NULL) == system_domain);
	CU_ASSERT(spdk_memory_domain_get_next(system_domain, NULL) == domain);
	CU_ASSERT(spdk_memory_domain_get_next(domain, NULL) == domain_2);
	CU_ASSERT(spdk_memory_domain_get_next(domain_2, NULL) == domain_3);
	CU_ASSERT(spdk_memory_domain_get_next(domain_3, NULL) == NULL);

	/* Remove 2nd device, repeat iteration */
	spdk_memory_domain_destroy(domain_2);
	CU_ASSERT(spdk_memory_domain_get_first(NULL) == domain);
	CU_ASSERT(spdk_memory_domain_get_first(NULL) == system_domain);
	CU_ASSERT(spdk_memory_domain_get_next(system_domain, NULL) == domain);
	CU_ASSERT(spdk_memory_domain_get_next(domain, NULL) == domain_3);
	CU_ASSERT(spdk_memory_domain_get_next(domain_3, NULL) == NULL);

	/* Remove 3rd device, repeat iteration */
	spdk_memory_domain_destroy(domain_3);
	CU_ASSERT(spdk_memory_domain_get_first(NULL) == domain);
	CU_ASSERT(spdk_memory_domain_get_first(NULL) == system_domain);
	CU_ASSERT(spdk_memory_domain_get_next(system_domain, NULL) == domain);
	CU_ASSERT(spdk_memory_domain_get_next(domain, NULL) == NULL);
	CU_ASSERT(spdk_memory_domain_get_first("test_2") == NULL);

	/* Destroy memory domain, domain == NULL */
	spdk_memory_domain_destroy(NULL);
	CU_ASSERT(spdk_memory_domain_get_first(NULL) == domain);
	CU_ASSERT(spdk_memory_domain_get_first(NULL) == system_domain);

	/* Destroy memory domain */
	spdk_memory_domain_destroy(domain);
	CU_ASSERT(spdk_memory_domain_get_first(NULL) == NULL);
	CU_ASSERT(spdk_memory_domain_get_first(NULL) == system_domain);
}

int