Commit 85be1014 authored by Jim Harris's avatar Jim Harris Committed by Konrad Sztyber
Browse files

nvme: add spdk_nvme_ctrlr_get_numa_id()



By default, transports will just return SPDK_ENV_NUMA_ID_ANY.
Future patches will add support to populate this on a
transport-by-transport basis.

Note that transports define their own ctrlr object, and embed
spdk_nvmf_ctrlr inside of it. They use calloc() to allocate
the structure. This means that the new numa_id member will always
be set to 0. So we add numa_id_valid (which is also 0 by default)
so that we can detect whether that 0 is a real numa_id set by the
transport, or was just the default value implicitly set by transports
that don't support numa_ids.

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


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
parent 00bbcea0
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -1357,6 +1357,19 @@ uint32_t spdk_nvme_ctrlr_get_num_ns(struct spdk_nvme_ctrlr *ctrlr);
 */
struct spdk_pci_device *spdk_nvme_ctrlr_get_pci_device(struct spdk_nvme_ctrlr *ctrlr);

/**
 * Get the NUMA ID for the given NVMe controller.
 *
 * For network-based transports, the NUMA ID will be correlated to the
 * network interface.
 *
 * \param ctrlr Opaque handle to NVMe controller
 *
 * \return NUMA ID of the NVMe controller, or SPDK_ENV_NUMA_ID_ANY if
 *         the NUMA ID is unknown
 */
int32_t spdk_nvme_ctrlr_get_numa_id(struct spdk_nvme_ctrlr *ctrlr);

/**
 * Get the maximum data transfer size of a given NVMe controller.
 *
+10 −0
Original line number Diff line number Diff line
@@ -4723,6 +4723,16 @@ spdk_nvme_ctrlr_get_pci_device(struct spdk_nvme_ctrlr *ctrlr)
	return nvme_ctrlr_proc_get_devhandle(ctrlr);
}

int32_t
spdk_nvme_ctrlr_get_numa_id(struct spdk_nvme_ctrlr *ctrlr)
{
	if (ctrlr->numa.id_valid) {
		return ctrlr->numa.id;
	} else {
		return SPDK_ENV_NUMA_ID_ANY;
	}
}

uint32_t
spdk_nvme_ctrlr_get_max_xfer_size(const struct spdk_nvme_ctrlr *ctrlr)
{
+6 −0
Original line number Diff line number Diff line
@@ -981,6 +981,12 @@ struct spdk_nvme_ctrlr {

	struct spdk_nvme_transport_id	trid;

	struct {
		/** Is numa.id valid? Ensures numa.id == 0 is interpreted correctly. */
		uint32_t		id_valid : 1;
		int32_t			id : 31;
	} numa;

	union spdk_nvme_cap_register	cap;
	union spdk_nvme_vs_register	vs;

+1 −0
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@
	spdk_nvme_ctrlr_get_pmrsz;
	spdk_nvme_ctrlr_get_num_ns;
	spdk_nvme_ctrlr_get_pci_device;
	spdk_nvme_ctrlr_get_numa_id;
	spdk_nvme_ctrlr_get_max_xfer_size;
	spdk_nvme_ctrlr_get_max_sges;
	spdk_nvme_ctrlr_is_active_ns;
+17 −0
Original line number Diff line number Diff line
@@ -3412,6 +3412,22 @@ test_nvme_ctrlr_disable(void)
	nvme_ctrlr_destruct(&ctrlr);
}

static void
test_nvme_numa_id(void)
{
	struct spdk_nvme_ctrlr ctrlr = {};

	ctrlr.numa.id = 3;
	ctrlr.numa.id_valid = 0;
	CU_ASSERT(spdk_nvme_ctrlr_get_numa_id(&ctrlr) == SPDK_ENV_NUMA_ID_ANY);

	ctrlr.numa.id_valid = 1;
	CU_ASSERT(spdk_nvme_ctrlr_get_numa_id(&ctrlr) == 3);

	ctrlr.numa.id = SPDK_ENV_NUMA_ID_ANY;
	CU_ASSERT(spdk_nvme_ctrlr_get_numa_id(&ctrlr) == SPDK_ENV_NUMA_ID_ANY);
}

int
main(int argc, char **argv)
{
@@ -3469,6 +3485,7 @@ main(int argc, char **argv)
	CU_ADD_TEST(suite, test_nvme_ctrlr_get_memory_domains);
	CU_ADD_TEST(suite, test_nvme_transport_ctrlr_ready);
	CU_ADD_TEST(suite, test_nvme_ctrlr_disable);
	CU_ADD_TEST(suite, test_nvme_numa_id);

	num_failures = spdk_ut_run_tests(argc, argv, NULL);
	CU_cleanup_registry();