From e749b5d3ec5562fe7fe177f0a21a2c6b20965a5f Mon Sep 17 00:00:00 2001 From: Ziye Yang Date: Wed, 30 Dec 2020 22:52:07 +0800 Subject: [PATCH] nvme: Add the interface to get the optimal polling group This patch is used to add spdk_nvme_poll_group_get_optimal public API. Signed-off-by: Ziye Yang Change-Id: Iee34c89e0e1ff1f81167b18e198c144ca28f71de Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/3311 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Shuhei Matsumoto Reviewed-by: Aleksey Marchuk Reviewed-by: Ben Walker --- CHANGELOG.md | 6 ++++++ include/spdk/nvme.h | 11 +++++++++++ lib/nvme/Makefile | 4 ++-- lib/nvme/nvme_internal.h | 3 +++ lib/nvme/nvme_poll_group.c | 14 ++++++++++++++ lib/nvme/nvme_transport.c | 11 +++++++++++ lib/nvme/spdk_nvme.map | 1 + .../nvme/nvme_poll_group.c/nvme_poll_group_ut.c | 6 ++++++ 8 files changed, 54 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef048a0ef..96ad26659 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ ## v21.04: (Upcoming Release) +### nvme + +Added `spdk_nvme_qpair_get_optimal_poll_group` function and `qpair_get_optimal_poll_group` +function pointer in spdk_nvmf_transport_ops structure in order to add the qpair to the most +suitable polling group. + ## v21.01: ### bdev diff --git a/include/spdk/nvme.h b/include/spdk/nvme.h index 45b9f94e1..28b3d3871 100644 --- a/include/spdk/nvme.h +++ b/include/spdk/nvme.h @@ -2186,6 +2186,15 @@ typedef void (*spdk_nvme_disconnected_qpair_cb)(struct spdk_nvme_qpair *qpair, */ struct spdk_nvme_poll_group *spdk_nvme_poll_group_create(void *ctx); +/** + * Get a optimal poll group. + * + * \param qpair The qpair to get the optimal poll group. + * + * \return Pointer to the optimal poll group, or NULL if not found. + */ +struct spdk_nvme_poll_group *spdk_nvme_qpair_get_optimal_poll_group(struct spdk_nvme_qpair *qpair); + /** * Add an spdk_nvme_qpair to a poll group. qpairs may only be added to * a poll group if they are in the disconnected state; i.e. either they were @@ -3408,6 +3417,8 @@ struct spdk_nvme_transport_ops { void (*admin_qpair_abort_aers)(struct spdk_nvme_qpair *qpair); struct spdk_nvme_transport_poll_group *(*poll_group_create)(void); + struct spdk_nvme_transport_poll_group *(*qpair_get_optimal_poll_group)( + struct spdk_nvme_qpair *qpair); int (*poll_group_add)(struct spdk_nvme_transport_poll_group *tgroup, struct spdk_nvme_qpair *qpair); diff --git a/lib/nvme/Makefile b/lib/nvme/Makefile index fcc9d2923..5b7ff614f 100644 --- a/lib/nvme/Makefile +++ b/lib/nvme/Makefile @@ -34,8 +34,8 @@ SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..) include $(SPDK_ROOT_DIR)/mk/spdk.common.mk -SO_VER := 4 -SO_MINOR := 2 +SO_VER := 5 +SO_MINOR := 0 C_SRCS = nvme_ctrlr_cmd.c nvme_ctrlr.c nvme_fabric.c nvme_ns_cmd.c nvme_ns.c nvme_pcie_common.c nvme_pcie.c nvme_qpair.c nvme.c nvme_quirks.c nvme_transport.c nvme_uevent.c \ nvme_ctrlr_ocssd_cmd.c nvme_ns_ocssd_cmd.c nvme_tcp.c nvme_opal.c nvme_io_msg.c nvme_poll_group.c nvme_zns.c diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index 162668002..4f5da3a84 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -1315,6 +1315,9 @@ int nvme_transport_qpair_iterate_requests(struct spdk_nvme_qpair *qpair, struct spdk_nvme_transport_poll_group *nvme_transport_poll_group_create( const struct spdk_nvme_transport *transport); +struct spdk_nvme_transport_poll_group *nvme_transport_qpair_get_optimal_poll_group( + const struct spdk_nvme_transport *transport, + struct spdk_nvme_qpair *qpair); int nvme_transport_poll_group_add(struct spdk_nvme_transport_poll_group *tgroup, struct spdk_nvme_qpair *qpair); int nvme_transport_poll_group_remove(struct spdk_nvme_transport_poll_group *tgroup, diff --git a/lib/nvme/nvme_poll_group.c b/lib/nvme/nvme_poll_group.c index 291f55e63..587ed1e2d 100644 --- a/lib/nvme/nvme_poll_group.c +++ b/lib/nvme/nvme_poll_group.c @@ -50,6 +50,20 @@ spdk_nvme_poll_group_create(void *ctx) return group; } +struct spdk_nvme_poll_group * +spdk_nvme_qpair_get_optimal_poll_group(struct spdk_nvme_qpair *qpair) +{ + struct spdk_nvme_transport_poll_group *tgroup; + + tgroup = nvme_transport_qpair_get_optimal_poll_group(qpair->transport, qpair); + + if (tgroup == NULL) { + return NULL; + } + + return tgroup->group; +} + int spdk_nvme_poll_group_add(struct spdk_nvme_poll_group *group, struct spdk_nvme_qpair *qpair) { diff --git a/lib/nvme/nvme_transport.c b/lib/nvme/nvme_transport.c index 30501633f..bd2292150 100644 --- a/lib/nvme/nvme_transport.c +++ b/lib/nvme/nvme_transport.c @@ -448,6 +448,17 @@ nvme_transport_poll_group_create(const struct spdk_nvme_transport *transport) return group; } +struct spdk_nvme_transport_poll_group * +nvme_transport_qpair_get_optimal_poll_group(const struct spdk_nvme_transport *transport, + struct spdk_nvme_qpair *qpair) +{ + if (transport->ops.qpair_get_optimal_poll_group) { + return transport->ops.qpair_get_optimal_poll_group(qpair); + } else { + return NULL; + } +} + int nvme_transport_poll_group_add(struct spdk_nvme_transport_poll_group *tgroup, struct spdk_nvme_qpair *qpair) diff --git a/lib/nvme/spdk_nvme.map b/lib/nvme/spdk_nvme.map index e2e4da623..033464365 100644 --- a/lib/nvme/spdk_nvme.map +++ b/lib/nvme/spdk_nvme.map @@ -141,6 +141,7 @@ spdk_nvme_ns_cmd_comparev_with_md; spdk_nvme_ns_cmd_compare_with_md; + spdk_nvme_qpair_get_optimal_poll_group; spdk_nvme_qpair_process_completions; spdk_nvme_qpair_get_failure_reason; spdk_nvme_qpair_add_cmd_error_injection; diff --git a/test/unit/lib/nvme/nvme_poll_group.c/nvme_poll_group_ut.c b/test/unit/lib/nvme/nvme_poll_group.c/nvme_poll_group_ut.c index 1503a49c5..88375006f 100644 --- a/test/unit/lib/nvme/nvme_poll_group.c/nvme_poll_group_ut.c +++ b/test/unit/lib/nvme/nvme_poll_group.c/nvme_poll_group_ut.c @@ -63,6 +63,12 @@ int g_destroy_return_value = 0; TAILQ_HEAD(nvme_transport_list, spdk_nvme_transport) g_spdk_nvme_transports = TAILQ_HEAD_INITIALIZER(g_spdk_nvme_transports); +DEFINE_STUB(nvme_transport_qpair_get_optimal_poll_group, + struct spdk_nvme_transport_poll_group *, + (const struct spdk_nvme_transport *transport, + struct spdk_nvme_qpair *qpair), + NULL); + static void unit_test_disconnected_qpair_cb(struct spdk_nvme_qpair *qpair, void *poll_group_ctx) {