nvme: pretty print dptr

Signed-off-by: Jacek Kalwas <jacek.kalwas@intel.com>
Change-Id: I576878fbbafc3d17617ceeec99e40565be7d5d3d
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/3213
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
This commit is contained in:
Jacek Kalwas 2020-07-05 04:31:25 +02:00 committed by Tomasz Zawadzki
parent 64f05eb5c5
commit 4d9ab1e9a1

View File

@ -34,6 +34,8 @@
#include "nvme_internal.h"
#include "spdk/nvme_ocssd.h"
#define NVME_CMD_DPTR_STR_SIZE 256
static int nvme_qpair_resubmit_request(struct spdk_nvme_qpair *qpair, struct nvme_request *req);
struct nvme_string {
@ -127,6 +129,24 @@ static const struct nvme_string io_opcode[] = {
{ 0xFFFF, "IO COMMAND" }
};
static const struct nvme_string sgl_type[] = {
{ SPDK_NVME_SGL_TYPE_DATA_BLOCK, "DATA BLOCK" },
{ SPDK_NVME_SGL_TYPE_BIT_BUCKET, "BIT BUCKET" },
{ SPDK_NVME_SGL_TYPE_SEGMENT, "SEGMENT" },
{ SPDK_NVME_SGL_TYPE_LAST_SEGMENT, "LAST SEGMENT" },
{ SPDK_NVME_SGL_TYPE_TRANSPORT_DATA_BLOCK, "TRANSPORT DATA BLOCK" },
{ SPDK_NVME_SGL_TYPE_VENDOR_SPECIFIC, "VENDOR SPECIFIC" },
{ 0xFFFF, "RESERVED" }
};
static const struct nvme_string sgl_subtype[] = {
{ SPDK_NVME_SGL_SUBTYPE_ADDRESS, "ADDRESS" },
{ SPDK_NVME_SGL_SUBTYPE_OFFSET, "OFFSET" },
{ SPDK_NVME_SGL_SUBTYPE_TRANSPORT, "TRANSPORT" },
{ SPDK_NVME_SGL_SUBTYPE_INVALIDATE_KEY, "INVALIDATE KEY" },
{ 0xFFFF, "RESERVED" }
};
static const char *
nvme_get_string(const struct nvme_string *strings, uint16_t value)
{
@ -143,46 +163,113 @@ nvme_get_string(const struct nvme_string *strings, uint16_t value)
return entry->str;
}
static void
nvme_get_sgl_unkeyed(char *buf, size_t size, struct spdk_nvme_cmd *cmd)
{
struct spdk_nvme_sgl_descriptor *sgl = &cmd->dptr.sgl1;
snprintf(buf, size, " len:0x%x", sgl->unkeyed.length);
}
static void
nvme_get_sgl_keyed(char *buf, size_t size, struct spdk_nvme_cmd *cmd)
{
struct spdk_nvme_sgl_descriptor *sgl = &cmd->dptr.sgl1;
snprintf(buf, size, " len:0x%x key:0x%x", sgl->keyed.length, sgl->keyed.key);
}
static void
nvme_get_sgl(char *buf, size_t size, struct spdk_nvme_cmd *cmd)
{
struct spdk_nvme_sgl_descriptor *sgl = &cmd->dptr.sgl1;
int c;
c = snprintf(buf, size, "SGL %s %s 0x%" PRIx64, nvme_get_string(sgl_type, sgl->generic.type),
nvme_get_string(sgl_subtype, sgl->generic.subtype), sgl->address);
assert(c >= 0 && (size_t)c < size);
if (sgl->generic.type == SPDK_NVME_SGL_TYPE_KEYED_DATA_BLOCK) {
nvme_get_sgl_unkeyed(buf + c, size - c, cmd);
}
if (sgl->generic.type == SPDK_NVME_SGL_TYPE_DATA_BLOCK) {
nvme_get_sgl_keyed(buf + c, size - c, cmd);
}
}
static void
nvme_get_prp(char *buf, size_t size, struct spdk_nvme_cmd *cmd)
{
snprintf(buf, size, "PRP1 0x%" PRIx64 " PRP2 0x%" PRIx64, cmd->dptr.prp.prp1, cmd->dptr.prp.prp2);
}
static void
nvme_get_dptr(char *buf, size_t size, struct spdk_nvme_cmd *cmd)
{
if (spdk_nvme_opc_get_data_transfer(cmd->opc) != SPDK_NVME_DATA_NONE) {
switch (cmd->psdt) {
case SPDK_NVME_PSDT_PRP:
nvme_get_prp(buf, size, cmd);
break;
case SPDK_NVME_PSDT_SGL_MPTR_CONTIG:
case SPDK_NVME_PSDT_SGL_MPTR_SGL:
nvme_get_sgl(buf, size, cmd);
break;
default:
;
}
}
}
static void
nvme_admin_qpair_print_command(uint16_t qid, struct spdk_nvme_cmd *cmd)
{
assert(cmd != NULL);
struct spdk_nvmf_capsule_cmd *fcmd = (void *)cmd;
char dptr[NVME_CMD_DPTR_STR_SIZE] = {'\0'};
assert(cmd != NULL);
nvme_get_dptr(dptr, sizeof(dptr), cmd);
switch ((int)cmd->opc) {
case SPDK_NVME_OPC_SET_FEATURES:
case SPDK_NVME_OPC_GET_FEATURES:
SPDK_NOTICELOG("%s %s cid:%d cdw10:%08x\n",
SPDK_NOTICELOG("%s %s cid:%d cdw10:%08x %s\n",
nvme_get_string(admin_opcode, cmd->opc), nvme_get_string(feat_opcode,
cmd->cdw10_bits.set_features.fid), cmd->cid, cmd->cdw10);
cmd->cdw10_bits.set_features.fid), cmd->cid, cmd->cdw10, dptr);
break;
case SPDK_NVME_OPC_FABRIC:
SPDK_NOTICELOG("%s %s qid:%d cid:%d\n",
SPDK_NOTICELOG("%s %s qid:%d cid:%d %s\n",
nvme_get_string(admin_opcode, cmd->opc), nvme_get_string(fabric_opcode, fcmd->fctype), qid,
fcmd->cid);
fcmd->cid, dptr);
break;
default:
SPDK_NOTICELOG("%s (%02x) qid:%d cid:%d nsid:%x cdw10:%08x cdw11:%08x\n",
SPDK_NOTICELOG("%s (%02x) qid:%d cid:%d nsid:%x cdw10:%08x cdw11:%08x %s\n",
nvme_get_string(admin_opcode, cmd->opc), cmd->opc, qid, cmd->cid, cmd->nsid, cmd->cdw10,
cmd->cdw11);
cmd->cdw11, dptr);
}
}
static void
nvme_io_qpair_print_command(uint16_t qid, struct spdk_nvme_cmd *cmd)
{
char dptr[NVME_CMD_DPTR_STR_SIZE] = {'\0'};
assert(cmd != NULL);
nvme_get_dptr(dptr, sizeof(dptr), cmd);
switch ((int)cmd->opc) {
case SPDK_NVME_OPC_WRITE:
case SPDK_NVME_OPC_READ:
case SPDK_NVME_OPC_WRITE_UNCORRECTABLE:
case SPDK_NVME_OPC_COMPARE:
SPDK_NOTICELOG("%s sqid:%d cid:%d nsid:%d "
"lba:%llu len:%d\n",
"lba:%llu len:%d %s\n",
nvme_get_string(io_opcode, cmd->opc), qid, cmd->cid, cmd->nsid,
((unsigned long long)cmd->cdw11 << 32) + cmd->cdw10,
(cmd->cdw12 & 0xFFFF) + 1);
(cmd->cdw12 & 0xFFFF) + 1, dptr);
break;
case SPDK_NVME_OPC_FLUSH:
case SPDK_NVME_OPC_DATASET_MANAGEMENT: