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) {