From c88345ab3db034f461aded434c4bd01aa9e681fa Mon Sep 17 00:00:00 2001 From: Changpeng Liu Date: Mon, 11 Jul 2022 09:39:35 +0800 Subject: [PATCH] nvme: apply `nvme_pcie_poll_group_get_stats` to vfio-user Both PCIE and VFIO-USER can use the same APIs to get IO queue pair statistic data, so merge them here. Change-Id: Iadf9ead2bd5abaf11d2ef5d1884acb67369f85bb Signed-off-by: Changpeng Liu Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13538 Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Konrad Sztyber Reviewed-by: Aleksey Marchuk --- lib/nvme/nvme_pcie.c | 33 -------------------------------- lib/nvme/nvme_pcie_common.c | 33 ++++++++++++++++++++++++++++++++ lib/nvme/nvme_pcie_internal.h | 4 ++++ lib/nvme/nvme_vfio_user.c | 2 ++ module/bdev/nvme/bdev_nvme_rpc.c | 1 + 5 files changed, 40 insertions(+), 33 deletions(-) diff --git a/lib/nvme/nvme_pcie.c b/lib/nvme/nvme_pcie.c index d724d1ce1..d19e771c4 100644 --- a/lib/nvme/nvme_pcie.c +++ b/lib/nvme/nvme_pcie.c @@ -1048,39 +1048,6 @@ spdk_nvme_pcie_set_hotplug_filter(spdk_nvme_pcie_hotplug_filter_cb filter_cb) g_hotplug_filter_cb = filter_cb; } -static int -nvme_pcie_poll_group_get_stats(struct spdk_nvme_transport_poll_group *tgroup, - struct spdk_nvme_transport_poll_group_stat **_stats) -{ - struct nvme_pcie_poll_group *group; - struct spdk_nvme_transport_poll_group_stat *stats; - - if (tgroup == NULL || _stats == NULL) { - SPDK_ERRLOG("Invalid stats or group pointer\n"); - return -EINVAL; - } - - group = SPDK_CONTAINEROF(tgroup, struct nvme_pcie_poll_group, group); - stats = calloc(1, sizeof(*stats)); - if (!stats) { - SPDK_ERRLOG("Can't allocate memory for RDMA stats\n"); - return -ENOMEM; - } - stats->trtype = SPDK_NVME_TRANSPORT_PCIE; - memcpy(&stats->pcie, &group->stats, sizeof(group->stats)); - - *_stats = stats; - - return 0; -} - -static void -nvme_pcie_poll_group_free_stats(struct spdk_nvme_transport_poll_group *tgroup, - struct spdk_nvme_transport_poll_group_stat *stats) -{ - free(stats); -} - static struct spdk_pci_id nvme_pci_driver_id[] = { { .class_id = SPDK_PCI_CLASS_NVME, diff --git a/lib/nvme/nvme_pcie_common.c b/lib/nvme/nvme_pcie_common.c index a531ee020..3657d1f83 100644 --- a/lib/nvme/nvme_pcie_common.c +++ b/lib/nvme/nvme_pcie_common.c @@ -1777,6 +1777,39 @@ nvme_pcie_poll_group_destroy(struct spdk_nvme_transport_poll_group *tgroup) return 0; } +int +nvme_pcie_poll_group_get_stats(struct spdk_nvme_transport_poll_group *tgroup, + struct spdk_nvme_transport_poll_group_stat **_stats) +{ + struct nvme_pcie_poll_group *group; + struct spdk_nvme_transport_poll_group_stat *stats; + + if (tgroup == NULL || _stats == NULL) { + SPDK_ERRLOG("Invalid stats or group pointer\n"); + return -EINVAL; + } + + group = SPDK_CONTAINEROF(tgroup, struct nvme_pcie_poll_group, group); + stats = calloc(1, sizeof(*stats)); + if (!stats) { + SPDK_ERRLOG("Can't allocate memory for RDMA stats\n"); + return -ENOMEM; + } + stats->trtype = SPDK_NVME_TRANSPORT_PCIE; + memcpy(&stats->pcie, &group->stats, sizeof(group->stats)); + + *_stats = stats; + + return 0; +} + +void +nvme_pcie_poll_group_free_stats(struct spdk_nvme_transport_poll_group *tgroup, + struct spdk_nvme_transport_poll_group_stat *stats) +{ + free(stats); +} + SPDK_TRACE_REGISTER_FN(nvme_pcie, "nvme_pcie", TRACE_GROUP_NVME_PCIE) { struct spdk_trace_tpoint_opts opts[] = { diff --git a/lib/nvme/nvme_pcie_internal.h b/lib/nvme/nvme_pcie_internal.h index b7d90e78c..f3f81083f 100644 --- a/lib/nvme/nvme_pcie_internal.h +++ b/lib/nvme/nvme_pcie_internal.h @@ -329,6 +329,10 @@ struct spdk_nvme_qpair *nvme_pcie_ctrlr_create_io_qpair(struct spdk_nvme_ctrlr * const struct spdk_nvme_io_qpair_opts *opts); int nvme_pcie_ctrlr_delete_io_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *qpair); int nvme_pcie_qpair_submit_request(struct spdk_nvme_qpair *qpair, struct nvme_request *req); +int nvme_pcie_poll_group_get_stats(struct spdk_nvme_transport_poll_group *tgroup, + struct spdk_nvme_transport_poll_group_stat **_stats); +void nvme_pcie_poll_group_free_stats(struct spdk_nvme_transport_poll_group *tgroup, + struct spdk_nvme_transport_poll_group_stat *stats); struct spdk_nvme_transport_poll_group *nvme_pcie_poll_group_create(void); int nvme_pcie_poll_group_connect_qpair(struct spdk_nvme_qpair *qpair); diff --git a/lib/nvme/nvme_vfio_user.c b/lib/nvme/nvme_vfio_user.c index 09d74b381..46f2434c5 100644 --- a/lib/nvme/nvme_vfio_user.c +++ b/lib/nvme/nvme_vfio_user.c @@ -344,6 +344,8 @@ const struct spdk_nvme_transport_ops vfio_ops = { .poll_group_remove = nvme_pcie_poll_group_remove, .poll_group_process_completions = nvme_pcie_poll_group_process_completions, .poll_group_destroy = nvme_pcie_poll_group_destroy, + .poll_group_get_stats = nvme_pcie_poll_group_get_stats, + .poll_group_free_stats = nvme_pcie_poll_group_free_stats }; SPDK_NVME_TRANSPORT_REGISTER(vfio, &vfio_ops); diff --git a/module/bdev/nvme/bdev_nvme_rpc.c b/module/bdev/nvme/bdev_nvme_rpc.c index 45823e976..47176d767 100644 --- a/module/bdev/nvme/bdev_nvme_rpc.c +++ b/module/bdev/nvme/bdev_nvme_rpc.c @@ -1160,6 +1160,7 @@ rpc_bdev_nvme_stats_per_channel(struct spdk_io_channel_iter *i) rpc_bdev_nvme_rdma_stats(ctx->w, tr_stat); break; case SPDK_NVME_TRANSPORT_PCIE: + case SPDK_NVME_TRANSPORT_VFIOUSER: rpc_bdev_nvme_pcie_stats(ctx->w, tr_stat); break; case SPDK_NVME_TRANSPORT_TCP: