nvmf/rdma: Add RDMA polling statistics

RDMA polling statistics: number of polls and number of completion
entries returned.

Signed-off-by: Evgeniy Kochetov <evgeniik@mellanox.com>
Change-Id: Iabcf2cb6f6a35f595b89b58cdfcd177a637dda13
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/445289
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Evgeniy Kochetov 2019-05-23 14:26:50 +03:00 committed by Jim Harris
parent 43bb4e6b1f
commit 38ab383a8f
4 changed files with 70 additions and 2 deletions

View File

@ -4176,7 +4176,19 @@ Example response:
"pending_bdev_io": 1721,
"transports": [
{
"trtype": "RDMA"
"trtype": "RDMA",
"devices": [
{
"name": "mlx5_1",
"polls": 1536729,
"completions": 0
},
{
"name": "mlx5_0",
"polls": 1536729,
"completions": 18667357
}
]
}
]
}

View File

@ -85,11 +85,18 @@ struct spdk_nvmf_poll_group_stat {
uint64_t pending_bdev_io;
};
struct spdk_nvmf_rdma_device_stat {
const char *name;
uint64_t polls;
uint64_t completions;
};
struct spdk_nvmf_transport_poll_group_stat {
spdk_nvme_transport_type_t trtype;
union {
struct {
int dummy;
uint64_t num_devices;
struct spdk_nvmf_rdma_device_stat *devices;
} rdma;
};
};

View File

@ -1612,11 +1612,23 @@ static void
write_nvmf_transport_stats(struct spdk_json_write_ctx *w,
struct spdk_nvmf_transport_poll_group_stat *stat)
{
uint64_t i;
spdk_json_write_object_begin(w);
spdk_json_write_named_string(w, "trtype",
spdk_nvme_transport_id_trtype_str(stat->trtype));
switch (stat->trtype) {
case SPDK_NVME_TRANSPORT_RDMA:
spdk_json_write_named_array_begin(w, "devices");
for (i = 0; i < stat->rdma.num_devices; ++i) {
spdk_json_write_object_begin(w);
spdk_json_write_named_string(w, "name", stat->rdma.devices[i].name);
spdk_json_write_named_uint64(w, "polls", stat->rdma.devices[i].polls);
spdk_json_write_named_uint64(w, "completions", stat->rdma.devices[i].completions);
spdk_json_write_object_end(w);
}
spdk_json_write_array_end(w);
break;
default:
break;
}

View File

@ -409,6 +409,11 @@ struct spdk_nvmf_rdma_qpair {
bool last_wqe_reached;
};
struct spdk_nvmf_rdma_poller_stat {
uint64_t completions;
uint64_t polls;
};
struct spdk_nvmf_rdma_poller {
struct spdk_nvmf_rdma_device *device;
struct spdk_nvmf_rdma_poll_group *group;
@ -424,6 +429,7 @@ struct spdk_nvmf_rdma_poller {
struct ibv_srq *srq;
struct spdk_nvmf_rdma_resources *resources;
struct spdk_nvmf_rdma_poller_stat stat;
TAILQ_HEAD(, spdk_nvmf_rdma_qpair) qpairs;
@ -3420,6 +3426,9 @@ spdk_nvmf_rdma_poller_poll(struct spdk_nvmf_rdma_transport *rtransport,
return -1;
}
rpoller->stat.polls++;
rpoller->stat.completions += reaped;
for (i = 0; i < reaped; i++) {
rdma_wr = (struct spdk_nvmf_rdma_wr *)wc[i].wr_id;
@ -3654,6 +3663,10 @@ spdk_nvmf_rdma_poll_group_get_stat(struct spdk_nvmf_tgt *tgt,
struct spdk_io_channel *ch;
struct spdk_nvmf_poll_group *group;
struct spdk_nvmf_transport_poll_group *tgroup;
struct spdk_nvmf_rdma_poll_group *rgroup;
struct spdk_nvmf_rdma_poller *rpoller;
struct spdk_nvmf_rdma_device_stat *device_stat;
uint64_t num_devices = 0;
if (tgt == NULL || stat == NULL) {
return -EINVAL;
@ -3669,6 +3682,27 @@ spdk_nvmf_rdma_poll_group_get_stat(struct spdk_nvmf_tgt *tgt,
return -ENOMEM;
}
(*stat)->trtype = SPDK_NVME_TRANSPORT_RDMA;
rgroup = SPDK_CONTAINEROF(tgroup, struct spdk_nvmf_rdma_poll_group, group);
/* Count devices to allocate enough memory */
TAILQ_FOREACH(rpoller, &rgroup->pollers, link) {
++num_devices;
}
(*stat)->rdma.devices = calloc(num_devices, sizeof(struct spdk_nvmf_rdma_device_stat));
if (!(*stat)->rdma.devices) {
SPDK_ERRLOG("Failed to allocate NVMf RDMA devices statistics\n");
free(*stat);
return -ENOMEM;
}
(*stat)->rdma.num_devices = num_devices;
num_devices = 0;
TAILQ_FOREACH(rpoller, &rgroup->pollers, link) {
device_stat = &(*stat)->rdma.devices[num_devices++];
device_stat->name = ibv_get_device_name(rpoller->device->context->device);
device_stat->polls = rpoller->stat.polls;
device_stat->completions = rpoller->stat.completions;
}
return 0;
}
}
@ -3678,6 +3712,9 @@ spdk_nvmf_rdma_poll_group_get_stat(struct spdk_nvmf_tgt *tgt,
static void
spdk_nvmf_rdma_poll_group_free_stat(struct spdk_nvmf_transport_poll_group_stat *stat)
{
if (stat) {
free(stat->rdma.devices);
}
free(stat);
}