traces: add dtrace probes around qpair/controller/subsystem

Add dtrace probes aroung qpair/controller/subsystem management
to help with debugging issue #2055.

Change-Id: I0b981bffadee3fe4172ad6916c059bf357959dde
Signed-off-by: Krzysztof Karas <krzysztof.karas@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/10237
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
This commit is contained in:
Krzysztof Karas 2021-11-15 11:25:38 +00:00 committed by Tomasz Zawadzki
parent daacb4264a
commit d11601e87f
5 changed files with 159 additions and 4 deletions

View File

@ -350,6 +350,9 @@ nvmf_ctrlr_create(struct spdk_nvmf_subsystem *subsystem,
ctrlr->cntlid = connect_data->cntlid; ctrlr->cntlid = connect_data->cntlid;
} }
SPDK_DTRACE_PROBE3(nvmf_ctrlr_create, ctrlr, subsystem->subnqn,
spdk_thread_get_id(req->qpair->group->thread));
STAILQ_INIT(&ctrlr->async_events); STAILQ_INIT(&ctrlr->async_events);
TAILQ_INIT(&ctrlr->log_head); TAILQ_INIT(&ctrlr->log_head);
ctrlr->subsys = subsystem; ctrlr->subsys = subsystem;
@ -483,6 +486,9 @@ _nvmf_ctrlr_destruct(void *ctx)
struct spdk_nvmf_reservation_log *log, *log_tmp; struct spdk_nvmf_reservation_log *log, *log_tmp;
struct spdk_nvmf_async_event_completion *event, *event_tmp; struct spdk_nvmf_async_event_completion *event, *event_tmp;
SPDK_DTRACE_PROBE3(nvmf_ctrlr_destruct, ctrlr, ctrlr->subsys->subnqn,
spdk_thread_get_id(ctrlr->thread));
assert(spdk_get_thread() == ctrlr->thread); assert(spdk_get_thread() == ctrlr->thread);
assert(ctrlr->in_destruct); assert(ctrlr->in_destruct);
@ -524,6 +530,9 @@ nvmf_ctrlr_add_io_qpair(void *ctx)
struct spdk_nvmf_ctrlr *ctrlr = qpair->ctrlr; struct spdk_nvmf_ctrlr *ctrlr = qpair->ctrlr;
struct spdk_nvmf_qpair *admin_qpair = ctrlr->admin_qpair; struct spdk_nvmf_qpair *admin_qpair = ctrlr->admin_qpair;
SPDK_DTRACE_PROBE4(nvmf_ctrlr_add_io_qpair, ctrlr, req->qpair, req->qpair->qid,
spdk_thread_get_id(ctrlr->thread));
/* Unit test will check qpair->ctrlr after calling spdk_nvmf_ctrlr_connect. /* Unit test will check qpair->ctrlr after calling spdk_nvmf_ctrlr_connect.
* For error case, the value should be NULL. So set it to NULL at first. * For error case, the value should be NULL. So set it to NULL at first.
*/ */

View File

@ -117,10 +117,9 @@ nvmf_tgt_create_poll_group(void *io_device, void *ctx_buf)
uint32_t sid; uint32_t sid;
int rc; int rc;
SPDK_DTRACE_PROBE1(nvmf_create_poll_group, spdk_thread_get_id(thread));
TAILQ_INIT(&group->tgroups); TAILQ_INIT(&group->tgroups);
TAILQ_INIT(&group->qpairs); TAILQ_INIT(&group->qpairs);
group->thread = thread;
TAILQ_FOREACH(transport, &tgt->transports, link) { TAILQ_FOREACH(transport, &tgt->transports, link) {
rc = nvmf_poll_group_add_transport(group, transport); rc = nvmf_poll_group_add_transport(group, transport);
@ -154,7 +153,8 @@ nvmf_tgt_create_poll_group(void *io_device, void *ctx_buf)
pthread_mutex_unlock(&tgt->mutex); pthread_mutex_unlock(&tgt->mutex);
group->poller = SPDK_POLLER_REGISTER(nvmf_poll_group_poll, group, 0); group->poller = SPDK_POLLER_REGISTER(nvmf_poll_group_poll, group, 0);
group->thread = thread;
SPDK_DTRACE_PROBE1(nvmf_create_poll_group, spdk_thread_get_id(thread));
return 0; return 0;
} }
@ -754,6 +754,8 @@ void spdk_nvmf_tgt_add_transport(struct spdk_nvmf_tgt *tgt,
{ {
struct spdk_nvmf_tgt_add_transport_ctx *ctx; struct spdk_nvmf_tgt_add_transport_ctx *ctx;
SPDK_DTRACE_PROBE2(nvmf_tgt_add_transport, transport, tgt->name);
if (spdk_nvmf_tgt_get_transport(tgt, transport->ops->name)) { if (spdk_nvmf_tgt_get_transport(tgt, transport->ops->name)) {
cb_fn(cb_arg, -EEXIST); cb_fn(cb_arg, -EEXIST);
return; /* transport already created */ return; /* transport already created */
@ -1159,6 +1161,7 @@ nvmf_poll_group_add_transport(struct spdk_nvmf_poll_group *group,
SPDK_ERRLOG("Unable to create poll group for transport\n"); SPDK_ERRLOG("Unable to create poll group for transport\n");
return -1; return -1;
} }
SPDK_DTRACE_PROBE2(nvmf_transport_poll_group_create, transport, spdk_thread_get_id(group->thread));
tgroup->group = group; tgroup->group = group;
TAILQ_INSERT_TAIL(&group->tgroups, tgroup, link); TAILQ_INSERT_TAIL(&group->tgroups, tgroup, link);
@ -1366,6 +1369,9 @@ fini:
cb_fn(cb_arg, rc); cb_fn(cb_arg, rc);
} }
SPDK_DTRACE_PROBE2(nvmf_poll_group_add_subsystem, spdk_thread_get_id(group->thread),
subsystem->subnqn);
return rc; return rc;
} }
@ -1482,6 +1488,9 @@ nvmf_poll_group_remove_subsystem(struct spdk_nvmf_poll_group *group,
struct nvmf_qpair_disconnect_many_ctx *ctx; struct nvmf_qpair_disconnect_many_ctx *ctx;
uint32_t i; uint32_t i;
SPDK_DTRACE_PROBE3(nvmf_poll_group_remove_subsystem, group, spdk_thread_get_id(group->thread),
subsystem->subnqn);
ctx = calloc(1, sizeof(struct nvmf_qpair_disconnect_many_ctx)); ctx = calloc(1, sizeof(struct nvmf_qpair_disconnect_many_ctx));
if (!ctx) { if (!ctx) {
SPDK_ERRLOG("Unable to allocate memory for context to remove poll subsystem\n"); SPDK_ERRLOG("Unable to allocate memory for context to remove poll subsystem\n");

View File

@ -333,6 +333,8 @@ spdk_nvmf_subsystem_create(struct spdk_nvmf_tgt *tgt,
tgt->subsystems[sid] = subsystem; tgt->subsystems[sid] = subsystem;
SPDK_DTRACE_PROBE1(nvmf_subsystem_create, subsystem->subnqn);
return subsystem; return subsystem;
} }
@ -441,6 +443,8 @@ spdk_nvmf_subsystem_destroy(struct spdk_nvmf_subsystem *subsystem, nvmf_subsyste
return -EINVAL; return -EINVAL;
} }
SPDK_DTRACE_PROBE1(nvmf_subsystem_destroy, subsystem->subnqn);
assert(spdk_get_thread() == subsystem->thread); assert(spdk_get_thread() == subsystem->thread);
if (subsystem->state != SPDK_NVMF_SUBSYSTEM_INACTIVE) { if (subsystem->state != SPDK_NVMF_SUBSYSTEM_INACTIVE) {
@ -847,6 +851,8 @@ spdk_nvmf_subsystem_add_host(struct spdk_nvmf_subsystem *subsystem, const char *
snprintf(host->nqn, sizeof(host->nqn), "%s", hostnqn); snprintf(host->nqn, sizeof(host->nqn), "%s", hostnqn);
SPDK_DTRACE_PROBE2(nvmf_subsystem_add_host, subsystem->subnqn, host->nqn);
TAILQ_INSERT_HEAD(&subsystem->hosts, host, link); TAILQ_INSERT_HEAD(&subsystem->hosts, host, link);
if (!TAILQ_EMPTY(&subsystem->listeners)) { if (!TAILQ_EMPTY(&subsystem->listeners)) {
@ -871,6 +877,8 @@ spdk_nvmf_subsystem_remove_host(struct spdk_nvmf_subsystem *subsystem, const cha
return -ENOENT; return -ENOENT;
} }
SPDK_DTRACE_PROBE2(nvmf_subsystem_remove_host, subsystem->subnqn, host->nqn);
nvmf_subsystem_remove_host(subsystem, host); nvmf_subsystem_remove_host(subsystem, host);
if (!TAILQ_EMPTY(&subsystem->listeners)) { if (!TAILQ_EMPTY(&subsystem->listeners)) {
@ -1150,6 +1158,9 @@ spdk_nvmf_subsystem_add_listener(struct spdk_nvmf_subsystem *subsystem,
rc = transport->ops->listen_associate(transport, subsystem, trid); rc = transport->ops->listen_associate(transport, subsystem, trid);
} }
SPDK_DTRACE_PROBE4(nvmf_subsystem_add_listener, subsystem->subnqn, listener->trid->trtype,
listener->trid->traddr, listener->trid->trsvcid);
_nvmf_subsystem_add_listener_done(listener, rc); _nvmf_subsystem_add_listener_done(listener, rc);
} }
@ -1169,6 +1180,9 @@ spdk_nvmf_subsystem_remove_listener(struct spdk_nvmf_subsystem *subsystem,
return -ENOENT; return -ENOENT;
} }
SPDK_DTRACE_PROBE4(nvmf_subsystem_remove_listener, subsystem->subnqn, listener->trid->trtype,
listener->trid->traddr, listener->trid->trsvcid);
_nvmf_subsystem_remove_listener(subsystem, listener, false); _nvmf_subsystem_remove_listener(subsystem, listener, false);
return 0; return 0;
@ -1371,6 +1385,8 @@ nvmf_ns_change_msg(void *ns_ctx)
struct subsystem_ns_change_ctx *ctx = ns_ctx; struct subsystem_ns_change_ctx *ctx = ns_ctx;
int rc; int rc;
SPDK_DTRACE_PROBE2(nvmf_ns_change, ctx->nsid, ctx->subsystem->subnqn);
rc = spdk_nvmf_subsystem_pause(ctx->subsystem, ctx->nsid, ctx->cb_fn, ctx); rc = spdk_nvmf_subsystem_pause(ctx->subsystem, ctx->nsid, ctx->cb_fn, ctx);
if (rc) { if (rc) {
if (rc == -EBUSY) { if (rc == -EBUSY) {
@ -1715,6 +1731,8 @@ spdk_nvmf_subsystem_add_ns_ext(struct spdk_nvmf_subsystem *subsystem, const char
nvmf_subsystem_ns_changed(subsystem, opts.nsid); nvmf_subsystem_ns_changed(subsystem, opts.nsid);
SPDK_DTRACE_PROBE2(nvmf_subsystem_add_ns, subsystem->subnqn, ns->nsid);
return opts.nsid; return opts.nsid;
err_subsystem_add_ns: err_subsystem_add_ns:
@ -1726,8 +1744,8 @@ err_ns_reservation_restore:
spdk_bdev_module_release_bdev(ns->bdev); spdk_bdev_module_release_bdev(ns->bdev);
spdk_bdev_close(ns->desc); spdk_bdev_close(ns->desc);
free(ns); free(ns);
return 0;
return 0;
} }
static uint32_t static uint32_t
@ -1943,6 +1961,8 @@ nvmf_subsystem_add_ctrlr(struct spdk_nvmf_subsystem *subsystem, struct spdk_nvmf
TAILQ_INSERT_TAIL(&subsystem->ctrlrs, ctrlr, link); TAILQ_INSERT_TAIL(&subsystem->ctrlrs, ctrlr, link);
SPDK_DTRACE_PROBE3(nvmf_subsystem_add_ctrlr, subsystem->subnqn, ctrlr, ctrlr->hostnqn);
return 0; return 0;
} }
@ -1950,6 +1970,8 @@ void
nvmf_subsystem_remove_ctrlr(struct spdk_nvmf_subsystem *subsystem, nvmf_subsystem_remove_ctrlr(struct spdk_nvmf_subsystem *subsystem,
struct spdk_nvmf_ctrlr *ctrlr) struct spdk_nvmf_ctrlr *ctrlr)
{ {
SPDK_DTRACE_PROBE3(nvmf_subsystem_remove_ctrlr, subsystem->subnqn, ctrlr, ctrlr->hostnqn);
assert(spdk_get_thread() == subsystem->thread); assert(spdk_get_thread() == subsystem->thread);
assert(subsystem == ctrlr->subsys); assert(subsystem == ctrlr->subsys);
SPDK_DEBUGLOG(nvmf, "remove ctrlr %p from subsys %p %s\n", ctrlr, subsystem, subsystem->subnqn); SPDK_DEBUGLOG(nvmf, "remove ctrlr %p from subsys %p %s\n", ctrlr, subsystem, subsystem->subnqn);

View File

@ -501,6 +501,7 @@ nvmf_transport_poll_group_create(struct spdk_nvmf_transport *transport)
free(bufs); free(bufs);
} }
return group; return group;
} }
@ -544,6 +545,9 @@ nvmf_transport_poll_group_add(struct spdk_nvmf_transport_poll_group *group,
qpair->transport = group->transport; qpair->transport = group->transport;
} }
SPDK_DTRACE_PROBE3(nvmf_transport_poll_group_add, qpair, qpair->qid,
spdk_thread_get_id(group->group->thread));
return group->transport->ops->poll_group_add(group, qpair); return group->transport->ops->poll_group_add(group, qpair);
} }
@ -553,6 +557,9 @@ nvmf_transport_poll_group_remove(struct spdk_nvmf_transport_poll_group *group,
{ {
int rc = ENOTSUP; int rc = ENOTSUP;
SPDK_DTRACE_PROBE3(nvmf_transport_poll_group_remove, qpair, qpair->qid,
spdk_thread_get_id(group->group->thread));
assert(qpair->transport == group->transport); assert(qpair->transport == group->transport);
if (group->transport->ops->poll_group_remove) { if (group->transport->ops->poll_group_remove) {
rc = group->transport->ops->poll_group_remove(group, qpair); rc = group->transport->ops->poll_group_remove(group, qpair);

View File

@ -81,3 +81,111 @@ usdt:__EXE__:nvmf_ctrlr_add_qpair {
elapsed / (uint64)(1000 * 1000), elapsed % (uint64)(1000 * 1000), elapsed / (uint64)(1000 * 1000), elapsed % (uint64)(1000 * 1000),
str(arg3), arg1, arg2, str(arg4)); str(arg3), arg1, arg2, str(arg4));
} }
usdt:__EXE__:nvmf_subsystem_add_host {
printf("%d.%06d: subsystem: %s add host: %s\n",
elapsed / (uint64)(1000 * 1000), elapsed % (uint64)(1000 * 1000),
str(arg1), str(arg2));
}
usdt:__EXE__:nvmf_subsystem_remove_host {
printf("%d.%06d: subsystem: %s remove host: %s\n",
elapsed / (uint64)(1000 * 1000), elapsed % (uint64)(1000 * 1000),
str(arg1), str(arg2));
}
usdt:__EXE__:nvmf_subsystem_add_listener {
printf("%d.%06d: subsystem: %d add listener with trtype: %d, traddr: %s, trsvcid: %s\n",
elapsed / (uint64)(1000 * 1000), elapsed % (uint64)(1000 * 1000),
arg1, arg2, str(arg3), str(arg4));
}
usdt:__EXE__:nvmf_subsystem_remove_listener {
printf("%d.%06d: subsystem: %d remove listener with trtype: %d, traddr: %s, trsvcid: %s\n",
elapsed / (uint64)(1000 * 1000), elapsed % (uint64)(1000 * 1000),
arg1, arg2, str(arg3), str(arg4));
}
usdt:__EXE__:nvmf_subsystem_create {
printf("%d.%06d: create subsystem: %s\n",
elapsed / (uint64)(1000 * 1000), elapsed % (uint64)(1000 * 1000),
str(arg1));
}
usdt:__EXE__:nvmf_subsystem_destroy {
printf("%d.%06d: destroy subsystem: %s\n",
elapsed / (uint64)(1000 * 1000), elapsed % (uint64)(1000 * 1000),
str(arg1));
}
usdt:__EXE__:nvmf_ns_change {
printf("%d.%06d: namespace change: %d for subsystem: %s\n",
elapsed / (uint64)(1000 * 1000), elapsed % (uint64)(1000 * 1000),
arg1, str(arg2));
}
usdt:__EXE__:nvmf_subsystem_add_ns {
printf("%d.%06d: subsystem: %s add namespace: %d\n",
elapsed / (uint64)(1000 * 1000), elapsed % (uint64)(1000 * 1000),
str(arg1), arg2);
}
usdt:__EXE__:nvmf_subsystem_add_ctrlr {
printf("%d.%06d: subsystem: %s add controller: %p on host: %s\n",
elapsed / (uint64)(1000 * 1000), elapsed % (uint64)(1000 * 1000),
str(arg1), arg2, str(arg3));
}
usdt:__EXE__:nvmf_subsystem_remove_ctrlr {
printf("%d.%06d: subsystem: %s remove controller: %p on host: %s\n",
elapsed / (uint64)(1000 * 1000), elapsed % (uint64)(1000 * 1000),
str(arg1), arg2, str(arg3));
}
usdt:__EXE__:nvmf_transport_poll_group_add {
printf("%d.%06d: add qpair: %p with id: %d to poll group on thread: %lu\n",
elapsed / (uint64)(1000 * 1000), elapsed % (uint64)(1000 * 1000),
arg1, arg2, arg3);
}
usdt:__EXE__:nvmf_transport_poll_group_remove {
printf("%d.%06d: remove qpair: %p with id: %d from poll group on thread: %lu\n",
elapsed / (uint64)(1000 * 1000), elapsed % (uint64)(1000 * 1000),
arg1, arg2, arg3);
}
usdt:__EXE__:nvmf_tgt_add_transport {
printf("%d.%06d: add transport: %p to target: %s\n",
elapsed / (uint64)(1000 * 1000), elapsed % (uint64)(1000 * 1000),
arg1, str(arg2));
}
usdt:__EXE__:nvmf_poll_group_add_subsystem {
printf("%d.%06d: poll group: %p add subsystem: %s\n",
elapsed / (uint64)(1000 * 1000), elapsed % (uint64)(1000 * 1000),
arg1, str(arg2));
}
usdt:__EXE__:nvmf_poll_group_remove_subsystem {
printf("%d.%06d: poll group: %p on thread: %lu remove subsystem: %s\n",
elapsed / (uint64)(1000 * 1000), elapsed % (uint64)(1000 * 1000),
arg1, arg2, str(arg3));
}
usdt:__EXE__:nvmf_ctrlr_create {
printf("%d.%06d: create ctrlr: %p on subsystem: %s on thread: %lu\n",
elapsed / (uint64)(1000 * 1000), elapsed % (uint64)(1000 * 1000),
arg1, str(arg2), arg3);
}
usdt:__EXE__:nvmf_ctrlr_destruct {
printf("%d.%06d: destroy ctrlr: %p on subsystem: %s on thread: %lu\n",
elapsed / (uint64)(1000 * 1000), elapsed % (uint64)(1000 * 1000),
arg1, str(arg2), arg3);
}
usdt:__EXE__:nvmf_ctrlr_add_io_qpair {
printf("%d.%06d: ctrlr: %p add io qpair: %p with id: %d on thread: %lu\n",
elapsed / (uint64)(1000 * 1000), elapsed % (uint64)(1000 * 1000),
arg1, arg2, arg3, arg4);
}