engines:io_uring: update arguments to fetch nvme data
authorAnkit Kumar <ankit.kumar@samsung.com>
Mon, 14 Aug 2023 14:57:39 +0000 (20:27 +0530)
committerVincent Fu <vincent.fu@samsung.com>
Mon, 14 Aug 2023 14:27:33 +0000 (10:27 -0400)
This is a prep patch to keep number of arguments for fio_nvme_get_info
in check. The follow up patches will enable metadata, protection info.

Signed-off-by: Ankit Kumar <ankit.kumar@samsung.com>
Link: https://lore.kernel.org/r/20230814145747.114725-3-ankit.kumar@samsung.com
Signed-off-by: Vincent Fu <vincent.fu@samsung.com>
engines/io_uring.c
engines/nvme.c
engines/nvme.h

index 0906546349a4a526d57e10156ccbfbe65e769ab0..30d9ccd79803b96a7496b941341de6f3f85b001a 100644 (file)
@@ -1086,30 +1086,24 @@ static int fio_ioring_cmd_open_file(struct thread_data *td, struct fio_file *f)
 
        if (o->cmd_type == FIO_URING_CMD_NVME) {
                struct nvme_data *data = NULL;
-               unsigned int nsid, lba_size = 0;
-               __u32 ms = 0;
+               unsigned int lba_size = 0;
                __u64 nlba = 0;
                int ret;
 
                /* Store the namespace-id and lba size. */
                data = FILE_ENG_DATA(f);
                if (data == NULL) {
-                       ret = fio_nvme_get_info(f, &nsid, &lba_size, &ms, &nlba);
-                       if (ret)
-                               return ret;
-
                        data = calloc(1, sizeof(struct nvme_data));
-                       data->nsid = nsid;
-                       if (ms)
-                               data->lba_ext = lba_size + ms;
-                       else
-                               data->lba_shift = ilog2(lba_size);
+                       ret = fio_nvme_get_info(f, &nlba, data);
+                       if (ret) {
+                               free(data);
+                               return ret;
+                       }
 
                        FILE_SET_ENG_DATA(f, data);
                }
 
-               assert(data->lba_shift < 32);
-               lba_size = data->lba_ext ? data->lba_ext : (1U << data->lba_shift);
+               lba_size = data->lba_ext ? data->lba_ext : data->lba_size;
 
                for_each_rw_ddir(ddir) {
                        if (td->o.min_bs[ddir] % lba_size ||
@@ -1173,23 +1167,17 @@ static int fio_ioring_cmd_get_file_size(struct thread_data *td,
 
        if (o->cmd_type == FIO_URING_CMD_NVME) {
                struct nvme_data *data = NULL;
-               unsigned int nsid, lba_size = 0;
-               __u32 ms = 0;
                __u64 nlba = 0;
                int ret;
 
-               ret = fio_nvme_get_info(f, &nsid, &lba_size, &ms, &nlba);
-               if (ret)
-                       return ret;
-
                data = calloc(1, sizeof(struct nvme_data));
-               data->nsid = nsid;
-               if (ms)
-                       data->lba_ext = lba_size + ms;
-               else
-                       data->lba_shift = ilog2(lba_size);
+               ret = fio_nvme_get_info(f, &nlba, data);
+               if (ret) {
+                       free(data);
+                       return ret;
+               }
 
-               f->real_file_size = lba_size * nlba;
+               f->real_file_size = data->lba_size * nlba;
                fio_file_set_size_known(f);
 
                FILE_SET_ENG_DATA(f, data);
index b18ad4c28a054db6a4d6d93bc2904650fd3599b4..7e891eeda7e4d5ba134dfff5c4191b1e70e39fdd 100644 (file)
@@ -99,8 +99,7 @@ static int nvme_identify(int fd, __u32 nsid, enum nvme_identify_cns cns,
        return ioctl(fd, NVME_IOCTL_ADMIN_CMD, &cmd);
 }
 
-int fio_nvme_get_info(struct fio_file *f, __u32 *nsid, __u32 *lba_sz,
-                     __u32 *ms, __u64 *nlba)
+int fio_nvme_get_info(struct fio_file *f, __u64 *nlba, struct nvme_data *data)
 {
        struct nvme_id_ns ns;
        int namespace_id;
@@ -137,7 +136,7 @@ int fio_nvme_get_info(struct fio_file *f, __u32 *nsid, __u32 *lba_sz,
                return err;
        }
 
-       *nsid = namespace_id;
+       data->nsid = namespace_id;
 
        /*
         * 16 or 64 as maximum number of supported LBA formats.
@@ -149,21 +148,26 @@ int fio_nvme_get_info(struct fio_file *f, __u32 *nsid, __u32 *lba_sz,
        else
                format_idx = (ns.flbas & 0xf) + (((ns.flbas >> 5) & 0x3) << 4);
 
-       *lba_sz = 1 << ns.lbaf[format_idx].ds;
+       data->lba_size = 1 << ns.lbaf[format_idx].ds;
 
        /*
         * Only extended LBA can be supported.
         * Bit 4 for flbas indicates if metadata is transferred at the end of
         * logical block creating an extended LBA.
         */
-       *ms = le16_to_cpu(ns.lbaf[format_idx].ms);
-       if (*ms && !((ns.flbas >> 4) & 0x1)) {
+       data->ms = le16_to_cpu(ns.lbaf[format_idx].ms);
+       if (data->ms && !((ns.flbas >> 4) & 0x1)) {
                log_err("%s: only extended logical block can be supported\n",
                        f->file_name);
                err = -ENOTSUP;
                goto out;
        }
 
+       if (data->ms)
+               data->lba_ext = data->lba_size + data->ms;
+       else
+               data->lba_shift = ilog2(data->lba_size);
+
        /* Check for end to end data protection support */
        if (ns.dps & 0x3) {
                log_err("%s: end to end data protection not supported\n",
index 238471dd76b94f1dd063eee7449ed9e2354a6abd..e742b14fb8d68a52307250f5c49ea063b33e8c2c 100644 (file)
@@ -88,7 +88,9 @@ enum nvme_zns_zs {
 struct nvme_data {
        __u32 nsid;
        __u32 lba_shift;
+       __u32 lba_size;
        __u32 lba_ext;
+       __u16 ms;
 };
 
 struct nvme_lbaf {
@@ -219,8 +221,7 @@ struct nvme_dsm_range {
 int fio_nvme_iomgmt_ruhs(struct thread_data *td, struct fio_file *f,
                         struct nvme_fdp_ruh_status *ruhs, __u32 bytes);
 
-int fio_nvme_get_info(struct fio_file *f, __u32 *nsid, __u32 *lba_sz,
-                     __u32 *ms, __u64 *nlba);
+int fio_nvme_get_info(struct fio_file *f, __u64 *nlba, struct nvme_data *data);
 
 int fio_nvme_uring_cmd_prep(struct nvme_uring_cmd *cmd, struct io_u *io_u,
                            struct iovec *iov, struct nvme_dsm_range *dsm);