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:
parent
64f05eb5c5
commit
4d9ab1e9a1
@ -34,6 +34,8 @@
|
|||||||
#include "nvme_internal.h"
|
#include "nvme_internal.h"
|
||||||
#include "spdk/nvme_ocssd.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);
|
static int nvme_qpair_resubmit_request(struct spdk_nvme_qpair *qpair, struct nvme_request *req);
|
||||||
|
|
||||||
struct nvme_string {
|
struct nvme_string {
|
||||||
@ -127,6 +129,24 @@ static const struct nvme_string io_opcode[] = {
|
|||||||
{ 0xFFFF, "IO COMMAND" }
|
{ 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 *
|
static const char *
|
||||||
nvme_get_string(const struct nvme_string *strings, uint16_t value)
|
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;
|
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
|
static void
|
||||||
nvme_admin_qpair_print_command(uint16_t qid, struct spdk_nvme_cmd *cmd)
|
nvme_admin_qpair_print_command(uint16_t qid, struct spdk_nvme_cmd *cmd)
|
||||||
{
|
{
|
||||||
assert(cmd != NULL);
|
|
||||||
struct spdk_nvmf_capsule_cmd *fcmd = (void *)cmd;
|
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) {
|
switch ((int)cmd->opc) {
|
||||||
case SPDK_NVME_OPC_SET_FEATURES:
|
case SPDK_NVME_OPC_SET_FEATURES:
|
||||||
case SPDK_NVME_OPC_GET_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,
|
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;
|
break;
|
||||||
case SPDK_NVME_OPC_FABRIC:
|
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,
|
nvme_get_string(admin_opcode, cmd->opc), nvme_get_string(fabric_opcode, fcmd->fctype), qid,
|
||||||
fcmd->cid);
|
fcmd->cid, dptr);
|
||||||
break;
|
break;
|
||||||
default:
|
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,
|
nvme_get_string(admin_opcode, cmd->opc), cmd->opc, qid, cmd->cid, cmd->nsid, cmd->cdw10,
|
||||||
cmd->cdw11);
|
cmd->cdw11, dptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
nvme_io_qpair_print_command(uint16_t qid, struct spdk_nvme_cmd *cmd)
|
nvme_io_qpair_print_command(uint16_t qid, struct spdk_nvme_cmd *cmd)
|
||||||
{
|
{
|
||||||
|
char dptr[NVME_CMD_DPTR_STR_SIZE] = {'\0'};
|
||||||
|
|
||||||
assert(cmd != NULL);
|
assert(cmd != NULL);
|
||||||
|
|
||||||
|
nvme_get_dptr(dptr, sizeof(dptr), cmd);
|
||||||
|
|
||||||
switch ((int)cmd->opc) {
|
switch ((int)cmd->opc) {
|
||||||
case SPDK_NVME_OPC_WRITE:
|
case SPDK_NVME_OPC_WRITE:
|
||||||
case SPDK_NVME_OPC_READ:
|
case SPDK_NVME_OPC_READ:
|
||||||
case SPDK_NVME_OPC_WRITE_UNCORRECTABLE:
|
case SPDK_NVME_OPC_WRITE_UNCORRECTABLE:
|
||||||
case SPDK_NVME_OPC_COMPARE:
|
case SPDK_NVME_OPC_COMPARE:
|
||||||
SPDK_NOTICELOG("%s sqid:%d cid:%d nsid:%d "
|
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,
|
nvme_get_string(io_opcode, cmd->opc), qid, cmd->cid, cmd->nsid,
|
||||||
((unsigned long long)cmd->cdw11 << 32) + cmd->cdw10,
|
((unsigned long long)cmd->cdw11 << 32) + cmd->cdw10,
|
||||||
(cmd->cdw12 & 0xFFFF) + 1);
|
(cmd->cdw12 & 0xFFFF) + 1, dptr);
|
||||||
break;
|
break;
|
||||||
case SPDK_NVME_OPC_FLUSH:
|
case SPDK_NVME_OPC_FLUSH:
|
||||||
case SPDK_NVME_OPC_DATASET_MANAGEMENT:
|
case SPDK_NVME_OPC_DATASET_MANAGEMENT:
|
||||||
|
Loading…
Reference in New Issue
Block a user