Provide new tunable hw.nvme.verbose_cmd_dump

The nvme drive dumps only the most relevant details about a command when it
fails. However, there are times this is not sufficient (such as debugging weird
issues for a new drive with a vendor). Setting hw.nvme.verbose_cmd_dump=1
in loader.conf will enable more complete debugging information about each
command that fails.

Reviewed by: rpokala
Sponsored by: Netflix
Differential Version: https://reviews.freebsd.org/D20988
This commit is contained in:
Warner Losh 2019-07-18 21:58:51 +00:00
parent f95dfdbe69
commit c75bdc044d
4 changed files with 25 additions and 0 deletions

View File

@ -151,6 +151,17 @@ This value may also be set in the kernel config file with
.Bd -literal -offset indent
.Cd options NVME_USE_NVD=0
.Ed
.Pp
When there is an error,
.Nm
prints only the most relevant information about the command by default.
To enable dumping of all information about the command, set the following tunable
value in
.Xr loader.conf 5 :
.Bd -literal -offset indent
hw.nvme.verbose_cmd_dump=1
.Ed
.Pp
.Sh SYSCTL VARIABLES
The following controller-level sysctls are currently implemented:
.Bl -tag -width indent

View File

@ -54,6 +54,9 @@ struct nvme_consumer nvme_consumer[NVME_MAX_CONSUMERS];
uma_zone_t nvme_request_zone;
int32_t nvme_retry_count;
int nvme_verbose_cmd_dump;
TUNABLE_INT("hw.nvme.verbose_cmd_dump", &nvme_verbose_cmd_dump);
MALLOC_DEFINE(M_NVME, "nvme", "nvme(4) memory allocations");

View File

@ -114,6 +114,7 @@ MALLOC_DECLARE(M_NVME);
extern uma_zone_t nvme_request_zone;
extern int32_t nvme_retry_count;
extern int32_t nvme_verbose_cmd_dump;
struct nvme_completion_poll_status {

View File

@ -178,6 +178,16 @@ nvme_qpair_print_command(struct nvme_qpair *qpair, struct nvme_command *cmd)
nvme_admin_qpair_print_command(qpair, cmd);
else
nvme_io_qpair_print_command(qpair, cmd);
if (nvme_verbose_cmd_dump) {
nvme_printf(qpair->ctrlr,
"nsid:%#x rsvd2:%#x rsvd3:%#x mptr:%#jx prp1:%#jx prp2:%#jx\n",
cmd->nsid, cmd->rsvd2, cmd->rsvd3, (uintmax_t)cmd->mptr,
(uintmax_t)cmd->prp1, (uintmax_t)cmd->prp2);
nvme_printf(qpair->ctrlr,
"cdw10: %#x cdw11:%#x cdw12:%#x cdw13:%#x cdw14:%#x cdw15:%#x\n",
cmd->cdw10, cmd->cdw11, cmd->cdw12, cmd->cdw13, cmd->cdw14,
cmd->cdw15);
}
}
struct nvme_status_string {