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 <changpeng.liu@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13538
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com>
This commit is contained in:
Changpeng Liu 2022-07-11 09:39:35 +08:00 committed by Konrad Sztyber
parent 806744b7c8
commit c88345ab3d
5 changed files with 40 additions and 33 deletions

View File

@ -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,

View File

@ -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[] = {

View File

@ -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);

View File

@ -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);

View File

@ -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: