Skip to content

Commit f1a3294

Browse files
ikegami-tigaw
authored andcommitted
nvme: rework nvme_io command
libnvme changed the API for the nvme_io command. Update the callsite accordingly. Signed-off-by: Tokunori Ikegami <[email protected]>
1 parent 5663a35 commit f1a3294

1 file changed

Lines changed: 74 additions & 55 deletions

File tree

nvme.c

Lines changed: 74 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -7974,23 +7974,24 @@ unsigned long long elapsed_utime(struct timeval start_time,
79747974

79757975
static int submit_io(int opcode, char *command, const char *desc, int argc, char **argv)
79767976
{
7977+
_cleanup_nvme_transport_handle_ struct nvme_transport_handle *hdl = NULL;
7978+
_cleanup_nvme_global_ctx_ struct nvme_global_ctx *ctx = NULL;
7979+
unsigned long long buffer_size = 0, mbuffer_size = 0;
7980+
_cleanup_free_ struct nvme_nvm_id_ns *nvm_ns = NULL;
7981+
_cleanup_huge_ struct nvme_mem_huge mh = { 0, };
7982+
_cleanup_free_ struct nvme_id_ns *ns = NULL;
7983+
unsigned int logical_block_size = 0;
79777984
struct timeval start_time, end_time;
7978-
void *buffer;
79797985
_cleanup_free_ void *mbuffer = NULL;
7980-
int err = 0;
79817986
_cleanup_fd_ int dfd = -1, mfd = -1;
7982-
int flags, pi_size;
7983-
int mode = 0644;
7987+
__u8 lba_index, sts = 0, pif = 0;
79847988
__u16 control = 0, nblocks = 0;
7989+
struct nvme_passthru_cmd cmd;
7990+
int flags, pi_size;
79857991
__u32 dsmgmt = 0;
7986-
unsigned int logical_block_size = 0;
7987-
unsigned long long buffer_size = 0, mbuffer_size = 0;
7988-
_cleanup_huge_ struct nvme_mem_huge mh = { 0, };
7989-
_cleanup_nvme_global_ctx_ struct nvme_global_ctx *ctx = NULL;
7990-
_cleanup_nvme_transport_handle_ struct nvme_transport_handle *hdl = NULL;
7991-
_cleanup_free_ struct nvme_nvm_id_ns *nvm_ns = NULL;
7992-
_cleanup_free_ struct nvme_id_ns *ns = NULL;
7993-
__u8 lba_index, sts = 0, pif = 0;
7992+
int mode = 0644;
7993+
void *buffer;
7994+
int err = 0;
79947995
__u16 ms;
79957996

79967997
const char *start_block_addr = "64-bit addr of first block to access";
@@ -8090,8 +8091,10 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char
80908091
err = open_exclusive(&ctx, &hdl, argc, argv, cfg.force);
80918092
if (err) {
80928093
if (err == -EBUSY) {
8093-
fprintf(stderr, "Failed to open %s.\n", basename(argv[optind]));
8094-
fprintf(stderr, "Namespace is currently busy.\n");
8094+
fprintf(stderr, "Failed to open %s.\n",
8095+
basename(argv[optind]));
8096+
fprintf(stderr,
8097+
"Namespace is currently busy.\n");
80958098
if (!cfg.force)
80968099
fprintf(stderr,
80978100
"Use the force [--force] option to ignore that.\n");
@@ -8105,7 +8108,8 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char
81058108
if (!cfg.namespace_id) {
81068109
err = nvme_get_nsid(hdl, &cfg.namespace_id);
81078110
if (err < 0) {
8108-
nvme_show_error("get-namespace-id: %s", nvme_strerror(-err));
8111+
nvme_show_error("get-namespace-id: %s",
8112+
nvme_strerror(-err));
81098113
return err;
81108114
}
81118115
}
@@ -8123,7 +8127,8 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char
81238127
control |= NVME_IO_STC;
81248128
if (cfg.dtype) {
81258129
if (cfg.dtype > 0xf) {
8126-
nvme_show_error("Invalid directive type, %x", cfg.dtype);
8130+
nvme_show_error("Invalid directive type, %x",
8131+
cfg.dtype);
81278132
return -EINVAL;
81288133
}
81298134
control |= cfg.dtype << 4;
@@ -8198,19 +8203,26 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char
81988203

81998204
buffer_size = ((long long)cfg.block_count + 1) * logical_block_size;
82008205
if (cfg.data_size < buffer_size)
8201-
nvme_show_error("Rounding data size to fit block count (%lld bytes)", buffer_size);
8206+
nvme_show_error(
8207+
"Rounding data size to fit block count (%lld bytes)",
8208+
buffer_size);
82028209
else
82038210
buffer_size = cfg.data_size;
82048211

82058212
if (argconfig_parse_seen(opts, "block-count")) {
82068213
/* Use the value provided */
82078214
nblocks = cfg.block_count;
82088215
} else {
8209-
/* Get the required block count. Note this is a zeroes based value. */
8210-
nblocks = ((buffer_size + (logical_block_size - 1)) / logical_block_size) - 1;
8216+
/*
8217+
* Get the required block count. Note this is a zeroes based
8218+
* value.
8219+
*/
8220+
nblocks = ((buffer_size + (logical_block_size - 1)) /
8221+
logical_block_size) - 1;
82118222

82128223
/* Update the data size based on the required block count */
8213-
buffer_size = ((unsigned long long)nblocks + 1) * logical_block_size;
8224+
buffer_size = ((unsigned long long)nblocks + 1) *
8225+
logical_block_size;
82148226
}
82158227

82168228
buffer = nvme_alloc_huge(buffer_size, &mh);
@@ -8222,8 +8234,9 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char
82228234
if (cfg.metadata_size) {
82238235
mbuffer_size = ((unsigned long long)cfg.block_count + 1) * ms;
82248236
if (ms && cfg.metadata_size < mbuffer_size)
8225-
nvme_show_error("Rounding metadata size to fit block count (%lld bytes)",
8226-
mbuffer_size);
8237+
nvme_show_error(
8238+
"Rounding metadata size to fit block count (%lld bytes)",
8239+
mbuffer_size);
82278240
else
82288241
mbuffer_size = cfg.metadata_size;
82298242

@@ -8240,7 +8253,9 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char
82408253
err = read(dfd, (void *)buffer, cfg.data_size);
82418254
if (err < 0) {
82428255
err = -errno;
8243-
nvme_show_error("failed to read data buffer from input file %s", strerror(errno));
8256+
nvme_show_error(
8257+
"failed to read data buffer from input file %s",
8258+
strerror(errno));
82448259
return err;
82458260
}
82468261
}
@@ -8249,7 +8264,9 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char
82498264
err = read(mfd, (void *)mbuffer, mbuffer_size);
82508265
if (err < 0) {
82518266
err = -errno;
8252-
nvme_show_error("failed to read meta-data buffer from input file %s", strerror(errno));
8267+
nvme_show_error(
8268+
"failed to read meta-data buffer from input file %s",
8269+
strerror(errno));
82538270
return err;
82548271
}
82558272
}
@@ -8260,55 +8277,57 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char
82608277
printf("flags : %02x\n", 0);
82618278
printf("control : %04x\n", control);
82628279
printf("nblocks : %04x\n", nblocks);
8263-
printf("metadata : %"PRIx64"\n", (uint64_t)(uintptr_t)mbuffer);
8264-
printf("addr : %"PRIx64"\n", (uint64_t)(uintptr_t)buffer);
8265-
printf("slba : %"PRIx64"\n", (uint64_t)cfg.start_block);
8280+
printf("metadata : %"PRIx64"\n",
8281+
(uint64_t)(uintptr_t)mbuffer);
8282+
printf("addr : %"PRIx64"\n",
8283+
(uint64_t)(uintptr_t)buffer);
8284+
printf("slba : %"PRIx64"\n",
8285+
(uint64_t)cfg.start_block);
82668286
printf("dsmgmt : %08x\n", dsmgmt);
8267-
printf("reftag : %"PRIx64"\n", (uint64_t)cfg.ref_tag);
8287+
printf("reftag : %"PRIx64"\n",
8288+
(uint64_t)cfg.ref_tag);
82688289
printf("apptag : %04x\n", cfg.app_tag);
82698290
printf("appmask : %04x\n", cfg.app_tag_mask);
82708291
printf("storagetagcheck : %04x\n", cfg.storage_tag_check);
8271-
printf("storagetag : %"PRIx64"\n", (uint64_t)cfg.storage_tag);
8292+
printf("storagetag : %"PRIx64"\n",
8293+
(uint64_t)cfg.storage_tag);
82728294
printf("pif : %02x\n", pif);
82738295
printf("sts : %02x\n", sts);
82748296
}
82758297
if (nvme_cfg.dry_run)
82768298
return 0;
82778299

8278-
struct nvme_io_args args = {
8279-
.args_size = sizeof(args),
8280-
.nsid = cfg.namespace_id,
8281-
.slba = cfg.start_block,
8282-
.nlb = nblocks,
8283-
.control = control,
8284-
.dsm = cfg.dsmgmt,
8285-
.sts = sts,
8286-
.pif = pif,
8287-
.dspec = cfg.dspec,
8288-
.reftag = (__u32)cfg.ref_tag,
8289-
.reftag_u64 = cfg.ref_tag,
8290-
.apptag = cfg.app_tag,
8291-
.appmask = cfg.app_tag_mask,
8292-
.storage_tag = cfg.storage_tag,
8293-
.data_len = buffer_size,
8294-
.data = buffer,
8295-
.metadata_len = mbuffer_size,
8296-
.metadata = mbuffer,
8297-
.timeout = nvme_cfg.timeout,
8298-
.result = NULL,
8299-
};
83008300
gettimeofday(&start_time, NULL);
8301-
err = nvme_io(hdl, &args, opcode);
8301+
nvme_init_io(&cmd, opcode, cfg.namespace_id, cfg.start_block, buffer,
8302+
buffer_size, mbuffer, mbuffer_size);
8303+
cmd.cdw12 = NVME_FIELD_ENCODE(nblocks,
8304+
NVME_IOCS_COMMON_CDW12_NLB_SHIFT,
8305+
NVME_IOCS_COMMON_CDW12_NLB_MASK) |
8306+
NVME_FIELD_ENCODE(control,
8307+
NVME_IOCS_COMMON_CDW12_CONTROL_SHIFT,
8308+
NVME_IOCS_COMMON_CDW12_CONTROL_MASK);
8309+
cmd.cdw13 = NVME_FIELD_ENCODE(cfg.dspec,
8310+
NVME_IOCS_COMMON_CDW13_DSPEC_SHIFT,
8311+
NVME_IOCS_COMMON_CDW13_DSPEC_MASK) |
8312+
NVME_FIELD_ENCODE(cfg.dsmgmt,
8313+
NVME_IOCS_COMMON_CDW13_DSM_SHIFT,
8314+
NVME_IOCS_COMMON_CDW13_DSM_MASK);
8315+
nvme_init_var_size_tags(&cmd, pif, sts, cfg.ref_tag, cfg.storage_tag);
8316+
nvme_init_app_tag(&cmd, cfg.app_tag, cfg.app_tag_mask);
8317+
err = nvme_submit_admin_passthru(hdl, &cmd, NULL);
83028318
gettimeofday(&end_time, NULL);
83038319
if (cfg.latency)
8304-
printf(" latency: %s: %llu us\n", command, elapsed_utime(start_time, end_time));
8320+
printf(" latency: %s: %llu us\n",
8321+
command, elapsed_utime(start_time, end_time));
83058322
if (err < 0) {
83068323
nvme_show_error("submit-io: %s", nvme_strerror(-err));
83078324
} else if (err) {
83088325
nvme_show_status(err);
83098326
} else {
8310-
if (!(opcode & 1) && write(dfd, (void *)buffer, buffer_size) < 0) {
8311-
nvme_show_error("write: %s: failed to write buffer to output file",
8327+
if (!(opcode & 1) &&
8328+
write(dfd, (void *)buffer, buffer_size) < 0) {
8329+
nvme_show_error(
8330+
"write: %s: failed to write buffer to output file",
83128331
strerror(errno));
83138332
err = -EINVAL;
83148333
} else if (!(opcode & 1) && cfg.metadata_size &&

0 commit comments

Comments
 (0)