Re: [PATCH 2/9] fio: create over-arching data placement option

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



-               .lname  = "FDP Placement ID select",
+               .name   = "dataplacement",

Wondering if instead of dataplacement we should use data_placement. I
am ok either way.

On Mon, Apr 22, 2024 at 11:26 PM Vincent Fu <vincentfu@xxxxxxxxx> wrote:
>
> Since FDP and streams are similar, we should have an over-arching data
> placement option that encompasses both of these frameworks instead of
> having separate sets of similar options for FDP and streams.
>
> With a common set of options, users will be able to select the data
> placement strategy (fdp or streams), the placement identifiers to use,
> and the algorithm for selecting from the list of placement identifiers.
>
> The original set of FDP options is retained for backward compatibility.
>
> No functional change.
>
> Signed-off-by: Vincent Fu <vincent.fu@xxxxxxxxxxx>
> ---
>  cconv.c          | 18 +++++++++-------
>  dataplacement.c  | 14 ++++++-------
>  dataplacement.h  | 11 ++++++++--
>  filesetup.c      |  2 +-
>  init.c           | 10 ++++++++-
>  io_u.c           |  2 +-
>  options.c        | 54 +++++++++++++++++++++++++++++++++++-------------
>  server.h         |  2 +-
>  thread_options.h | 15 +++++++-------
>  9 files changed, 86 insertions(+), 42 deletions(-)
>
> diff --git a/cconv.c b/cconv.c
> index ead47248..16112248 100644
> --- a/cconv.c
> +++ b/cconv.c
> @@ -354,10 +354,11 @@ int convert_thread_options_to_cpu(struct thread_options *o,
>                 o->merge_blktrace_iters[i].u.f = fio_uint64_to_double(le64_to_cpu(top->merge_blktrace_iters[i].u.i));
>
>         o->fdp = le32_to_cpu(top->fdp);
> -       o->fdp_pli_select = le32_to_cpu(top->fdp_pli_select);
> -       o->fdp_nrpli = le32_to_cpu(top->fdp_nrpli);
> -       for (i = 0; i < o->fdp_nrpli; i++)
> -               o->fdp_plis[i] = le32_to_cpu(top->fdp_plis[i]);
> +       o->dp_type = le32_to_cpu(top->dp_type);
> +       o->dp_id_select = le32_to_cpu(top->dp_id_select);
> +       o->dp_nr_ids = le32_to_cpu(top->dp_nr_ids);
> +       for (i = 0; i < o->dp_nr_ids; i++)
> +               o->dp_ids[i] = le32_to_cpu(top->dp_ids[i]);
>  #if 0
>         uint8_t cpumask[FIO_TOP_STR_MAX];
>         uint8_t verify_cpumask[FIO_TOP_STR_MAX];
> @@ -652,10 +653,11 @@ void convert_thread_options_to_net(struct thread_options_pack *top,
>                 top->merge_blktrace_iters[i].u.i = __cpu_to_le64(fio_double_to_uint64(o->merge_blktrace_iters[i].u.f));
>
>         top->fdp = cpu_to_le32(o->fdp);
> -       top->fdp_pli_select = cpu_to_le32(o->fdp_pli_select);
> -       top->fdp_nrpli = cpu_to_le32(o->fdp_nrpli);
> -       for (i = 0; i < o->fdp_nrpli; i++)
> -               top->fdp_plis[i] = cpu_to_le32(o->fdp_plis[i]);
> +       top->dp_type = cpu_to_le32(o->dp_type);
> +       top->dp_id_select = cpu_to_le32(o->dp_id_select);
> +       top->dp_nr_ids = cpu_to_le32(o->dp_nr_ids);
> +       for (i = 0; i < o->dp_nr_ids; i++)
> +               top->dp_ids[i] = cpu_to_le32(o->dp_ids[i]);
>  #if 0
>         uint8_t cpumask[FIO_TOP_STR_MAX];
>         uint8_t verify_cpumask[FIO_TOP_STR_MAX];
> diff --git a/dataplacement.c b/dataplacement.c
> index 7518d193..a7170863 100644
> --- a/dataplacement.c
> +++ b/dataplacement.c
> @@ -59,13 +59,13 @@ static int init_ruh_info(struct thread_data *td, struct fio_file *f)
>         if (ruhs->nr_ruhs > FDP_MAX_RUHS)
>                 ruhs->nr_ruhs = FDP_MAX_RUHS;
>
> -       if (td->o.fdp_nrpli == 0) {
> +       if (td->o.dp_nr_ids == 0) {
>                 f->ruhs_info = ruhs;
>                 return 0;
>         }
>
> -       for (i = 0; i < td->o.fdp_nrpli; i++) {
> -               if (td->o.fdp_plis[i] >= ruhs->nr_ruhs) {
> +       for (i = 0; i < td->o.dp_nr_ids; i++) {
> +               if (td->o.dp_ids[i] >= ruhs->nr_ruhs) {
>                         ret = -EINVAL;
>                         goto out;
>                 }
> @@ -77,9 +77,9 @@ static int init_ruh_info(struct thread_data *td, struct fio_file *f)
>                 goto out;
>         }
>
> -       tmp->nr_ruhs = td->o.fdp_nrpli;
> -       for (i = 0; i < td->o.fdp_nrpli; i++)
> -               tmp->plis[i] = ruhs->plis[td->o.fdp_plis[i]];
> +       tmp->nr_ruhs = td->o.dp_nr_ids;
> +       for (i = 0; i < td->o.dp_nr_ids; i++)
> +               tmp->plis[i] = ruhs->plis[td->o.dp_ids[i]];
>         f->ruhs_info = tmp;
>  out:
>         sfree(ruhs);
> @@ -119,7 +119,7 @@ void dp_fill_dspec_data(struct thread_data *td, struct io_u *io_u)
>                 return;
>         }
>
> -       if (td->o.fdp_pli_select == FIO_FDP_RR) {
> +       if (td->o.dp_id_select == FIO_DP_RR) {
>                 if (ruhs->pli_loc >= ruhs->nr_ruhs)
>                         ruhs->pli_loc = 0;
>
> diff --git a/dataplacement.h b/dataplacement.h
> index 72bd4c08..b6ceb5bc 100644
> --- a/dataplacement.h
> +++ b/dataplacement.h
> @@ -5,15 +5,22 @@
>
>  #define FDP_DIR_DTYPE  2
>  #define FDP_MAX_RUHS   128
> +#define FIO_MAX_DP_IDS         16
>
>  /*
>   * How fio chooses what placement identifier to use next. Choice of
>   * uniformly random, or roundrobin.
>   */
> +enum {
> +       FIO_DP_RANDOM   = 0x1,
> +       FIO_DP_RR       = 0x2,
> +};
> +
>
>  enum {
> -       FIO_FDP_RANDOM  = 0x1,
> -       FIO_FDP_RR      = 0x2,
> +       FIO_DP_NONE     = 0x0,
> +       FIO_DP_FDP      = 0x1,
> +       FIO_DP_STREAMS  = 0x2,
>  };
>
>  struct fio_ruhs_info {
> diff --git a/filesetup.c b/filesetup.c
> index 8923f2b3..6fbfced5 100644
> --- a/filesetup.c
> +++ b/filesetup.c
> @@ -1411,7 +1411,7 @@ done:
>
>         td_restore_runstate(td, old_state);
>
> -       if (td->o.fdp) {
> +       if (td->o.dp_type == FIO_DP_FDP) {
>                 err = dp_init(td);
>                 if (err)
>                         goto err_out;
> diff --git a/init.c b/init.c
> index 7a0b14a3..ff3e9a90 100644
> --- a/init.c
> +++ b/init.c
> @@ -1015,7 +1015,15 @@ static int fixup_options(struct thread_data *td)
>                 ret |= 1;
>         }
>
> -
> +       if (td->o.fdp) {
> +               if (fio_option_is_set(&td->o, dp_type) &&
> +                       (td->o.dp_type == FIO_DP_STREAMS || td->o.dp_type == FIO_DP_NONE)) {
> +                       log_err("fio: fdp=1 is not compatible with dataplacement={streams, none}\n");
> +                       ret |= 1;
> +               } else {
> +                       td->o.dp_type = FIO_DP_FDP;
> +               }
> +       }
>         return ret;
>  }
>
> diff --git a/io_u.c b/io_u.c
> index 735d9005..e9b94c48 100644
> --- a/io_u.c
> +++ b/io_u.c
> @@ -1065,7 +1065,7 @@ static int fill_io_u(struct thread_data *td, struct io_u *io_u)
>                 }
>         }
>
> -       if (td->o.fdp)
> +       if (td->o.dp_type == FIO_DP_FDP)
>                 dp_fill_dspec_data(td, io_u);
>
>         if (io_u->offset + io_u->buflen > io_u->file->real_file_size) {
> diff --git a/options.c b/options.c
> index de935efc..09a24652 100644
> --- a/options.c
> +++ b/options.c
> @@ -270,12 +270,12 @@ static int str_fdp_pli_cb(void *data, const char *input)
>         strip_blank_front(&str);
>         strip_blank_end(str);
>
> -       while ((v = strsep(&str, ",")) != NULL && i < FIO_MAX_PLIS)
> -               td->o.fdp_plis[i++] = strtoll(v, NULL, 0);
> +       while ((v = strsep(&str, ",")) != NULL && i < FIO_MAX_DP_IDS)
> +               td->o.dp_ids[i++] = strtoll(v, NULL, 0);
>         free(p);
>
> -       qsort(td->o.fdp_plis, i, sizeof(*td->o.fdp_plis), fio_fdp_cmp);
> -       td->o.fdp_nrpli = i;
> +       qsort(td->o.dp_ids, i, sizeof(*td->o.dp_ids), fio_fdp_cmp);
> +       td->o.dp_nr_ids = i;
>
>         return 0;
>  }
> @@ -3710,32 +3710,58 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
>                 .group  = FIO_OPT_G_INVALID,
>         },
>         {
> -               .name   = "fdp_pli_select",
> -               .lname  = "FDP Placement ID select",
> +               .name   = "dataplacement",
> +               .lname  = "Data Placement interface",
>                 .type   = FIO_OPT_STR,
> -               .off1   = offsetof(struct thread_options, fdp_pli_select),
> -               .help   = "Select which FDP placement ID to use next",
> +               .off1   = offsetof(struct thread_options, dp_type),
> +               .help   = "Data Placement interface to use",
> +               .def    = "none",
> +               .category = FIO_OPT_C_IO,
> +               .group  = FIO_OPT_G_INVALID,
> +               .posval = {
> +                         { .ival = "none",
> +                           .oval = FIO_DP_NONE,
> +                           .help = "Do not specify a data placement interface",
> +                         },
> +                         { .ival = "fdp",
> +                           .oval = FIO_DP_FDP,
> +                           .help = "Use Flexible Data Placement interface",
> +                         },
> +                         { .ival = "streams",
> +                           .oval = FIO_DP_STREAMS,
> +                           .help = "Use Streams interface",
> +                         },
> +               },
> +       },
> +       {
> +               .name   = "plid_select",
> +               .alias  = "fdp_pli_select",
> +               .lname  = "Data Placement ID selection strategy",
> +               .type   = FIO_OPT_STR,
> +               .off1   = offsetof(struct thread_options, dp_id_select),
> +               .help   = "Strategy for selecting next Data Placement ID",
>                 .def    = "roundrobin",
>                 .category = FIO_OPT_C_IO,
>                 .group  = FIO_OPT_G_INVALID,
>                 .posval = {
>                           { .ival = "random",
> -                           .oval = FIO_FDP_RANDOM,
> +                           .oval = FIO_DP_RANDOM,
>                             .help = "Choose a Placement ID at random (uniform)",
>                           },
>                           { .ival = "roundrobin",
> -                           .oval = FIO_FDP_RR,
> +                           .oval = FIO_DP_RR,
>                             .help = "Round robin select Placement IDs",
>                           },
>                 },
>         },
>         {
> -               .name   = "fdp_pli",
> -               .lname  = "FDP Placement ID indicies",
> +               .name   = "plids",
> +               .alias  = "fdp_pli",
> +               .lname  = "Stream IDs/Data Placement ID indices",
>                 .type   = FIO_OPT_STR,
>                 .cb     = str_fdp_pli_cb,
> -               .off1   = offsetof(struct thread_options, fdp_plis),
> -               .help   = "Sets which placement ids to use (defaults to all)",
> +               .off1   = offsetof(struct thread_options, dp_ids),
> +               .help   = "Sets which Data Placement ids to use (defaults to all for FDP)",
>                 .hide   = 1,
>                 .category = FIO_OPT_C_IO,
>                 .group  = FIO_OPT_G_INVALID,
> diff --git a/server.h b/server.h
> index 6d2659b0..83ce449b 100644
> --- a/server.h
> +++ b/server.h
> @@ -51,7 +51,7 @@ struct fio_net_cmd_reply {
>  };
>
>  enum {
> -       FIO_SERVER_VER                  = 103,
> +       FIO_SERVER_VER                  = 104,
>
>         FIO_SERVER_MAX_FRAGMENT_PDU     = 1024,
>         FIO_SERVER_MAX_CMD_MB           = 2048,
> diff --git a/thread_options.h b/thread_options.h
> index c2e71518..a36b7909 100644
> --- a/thread_options.h
> +++ b/thread_options.h
> @@ -391,11 +391,11 @@ struct thread_options {
>         fio_fp64_t zrt;
>         fio_fp64_t zrf;
>
> -#define FIO_MAX_PLIS 16
>         unsigned int fdp;
> -       unsigned int fdp_pli_select;
> -       unsigned int fdp_plis[FIO_MAX_PLIS];
> -       unsigned int fdp_nrpli;
> +       unsigned int dp_type;
> +       unsigned int dp_id_select;
> +       unsigned int dp_ids[FIO_MAX_DP_IDS];
> +       unsigned int dp_nr_ids;
>
>         unsigned int log_entries;
>         unsigned int log_prio;
> @@ -709,9 +709,10 @@ struct thread_options_pack {
>         uint32_t log_prio;
>
>         uint32_t fdp;
> -       uint32_t fdp_pli_select;
> -       uint32_t fdp_plis[FIO_MAX_PLIS];
> -       uint32_t fdp_nrpli;
> +       uint32_t dp_type;
> +       uint32_t dp_id_select;
> +       uint32_t dp_ids[FIO_MAX_DP_IDS];
> +       uint32_t dp_nr_ids;
>
>         uint32_t num_range;
>         /*
> --
> 2.43.0
>
>





[Index of Archives]     [Linux Kernel]     [Linux SCSI]     [Linux IDE]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux