Re: Patch to add read and write fua bit options to the SG engine

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

 



Hi,

On 15 March 2018 at 03:59, Kris Davis <Kris.Davis@xxxxxxx> wrote:
> I like to submit the patch below to add read and write fua bit options to the SG engine.  It adds a readfua=bool, and writefua=bool options in the SG engine, which causes the "force unit access" bits to be set in the read and write operations respectively.  I patterned the code changes from what I found in the libaio engine option code.  So, I also added a "__FIO_OPT_G_SG" enum to optgroup.h, which seemed to follow the pattern - but I really don't understand where or how the enum settings values in the options are used, so I'm unsure.

If you don't need different I/Os to have different FUA states (if they
were ever supported in the sg ioengine could trims via
unmaps/write_sames be FUA'd?) could you overload direct=1 for this
purpose?

-- 
Sitsofe | http://sucs.org/~sits/

On 15 March 2018 at 03:59, Kris Davis <Kris.Davis@xxxxxxx> wrote:
> I like to submit the patch below to add read and write fua bit options to the SG engine.  It adds a readfua=bool, and writefua=bool options in the SG engine, which causes the "force unit access" bits to be set in the read and write operations respectively.  I patterned the code changes from what I found in the libaio engine option code.  So, I also added a "__FIO_OPT_G_SG" enum to optgroup.h, which seemed to follow the pattern - but I really don't understand where or how the enum settings values in the options are used, so I'm unsure.
> Thanks
> Kris Davis
>
>
>
> diff --git a/HOWTO b/HOWTO
> index acb9e97..4f9d26a 100644
> --- a/HOWTO
> +++ b/HOWTO
> @@ -1747,6 +1747,7 @@
>                         :manpage:`read(2)` and :manpage:`write(2)` for asynchronous
>                         I/O. Requires :option:`filename` option to specify either block or
>                         character devices.
> +                       The sg engine includes engine specific options.
>
>                 **null**
>                         Doesn't transfer any data, just pretends to.  This is mainly used to
> @@ -2068,6 +2069,17 @@
>         multiple paths exist between the client and the server or in certain loopback
>         configurations.
>
> +.. option:: readfua=bool : [sg]
> +
> +       With readfua option set to 1, read operations include the
> +       the force unit access (fua) flag.
> +
> +.. option:: writefua=bool : [sg]
> +
> +       With writefua option set to 1, write operations include the
> +       the force unit access (fua) flag.
> +
> +
>  I/O depth
>  ~~~~~~~~~
>
> diff --git a/engines/sg.c b/engines/sg.c
> index 4540b57..f240755 100644
> --- a/engines/sg.c
> +++ b/engines/sg.c
> @@ -12,8 +12,42 @@
>  #include <sys/poll.h>
>
>  #include "../fio.h"
> +#include "../optgroup.h"
>
>  #ifdef FIO_HAVE_SGIO
> +
> +
> +struct sg_options {
> +       void *pad;
> +       unsigned int readfua;
> +       unsigned int writefua;
> +};
> +
> +static struct fio_option options[] = {
> +       {
> +               .name   = "readfua",
> +               .lname  = "sg engine read fua flag support",
> +               .type   = FIO_OPT_BOOL,
> +               .off1   = offsetof(struct sg_options, readfua),
> +               .help   = "Set FUA flag (force unit access) for all Read operations",
> +               .def    = "0",
> +               .category = FIO_OPT_C_ENGINE,
> +               .group  = FIO_OPT_G_SG,
> +       },
> +       {
> +               .name   = "writefua",
> +               .lname  = "sg engine write fua flag support",
> +               .type   = FIO_OPT_BOOL,
> +               .off1   = offsetof(struct sg_options, writefua),
> +               .help   = "Set FUA flag (force unit access) for all Write operations",
> +               .def    = "0",
> +               .category = FIO_OPT_C_ENGINE,
> +               .group  = FIO_OPT_G_SG,
> +       },
> +       {
> +               .name   = NULL,
> +       },
> +};
>
>  #define MAX_10B_LBA  0xFFFFFFFFULL
>  #define SCSI_TIMEOUT_MS 30000   // 30 second timeout; currently no method to override
> @@ -267,6 +301,7 @@
>  static int fio_sgio_prep(struct thread_data *td, struct io_u *io_u)
>  {
>         struct sg_io_hdr *hdr = &io_u->hdr;
> +       struct sg_options *o = td->eo;
>         struct sgio_data *sd = td->io_ops_data;
>         long long nr_blocks, lba;
>
> @@ -286,6 +321,10 @@
>                         hdr->cmdp[0] = 0x28; // read(10)
>                 else
>                         hdr->cmdp[0] = 0x88; // read(16)
> +
> +               if (o->readfua)
> +                       hdr->cmdp[1] |= 0x08;
> +
>         } else if (io_u->ddir == DDIR_WRITE) {
>                 sgio_hdr_init(sd, hdr, io_u, 1);
>
> @@ -294,6 +333,10 @@
>                         hdr->cmdp[0] = 0x2a; // write(10)
>                 else
>                         hdr->cmdp[0] = 0x8a; // write(16)
> +
> +               if (o->writefua)
> +                       hdr->cmdp[1] |= 0x08;
> +
>         } else {
>                 sgio_hdr_init(sd, hdr, io_u, 0);
>                 hdr->dxfer_direction = SG_DXFER_NONE;
> @@ -822,6 +865,8 @@
>         .close_file     = generic_close_file,
>         .get_file_size  = fio_sgio_get_file_size,
>         .flags          = FIO_SYNCIO | FIO_RAWIO,
> +       .options        = options,
> +       .option_struct_size     = sizeof(struct sg_options)
>  };
>
>  #else /* FIO_HAVE_SGIO */
> diff --git a/optgroup.h b/optgroup.h
> index 815ac16..d5e968d 100644
> --- a/optgroup.h
> +++ b/optgroup.h
> @@ -55,10 +55,11 @@
>         __FIO_OPT_G_LIBAIO,
>         __FIO_OPT_G_ACT,
>         __FIO_OPT_G_LATPROF,
> -        __FIO_OPT_G_RBD,
> -        __FIO_OPT_G_GFAPI,
> -        __FIO_OPT_G_MTD,
> +       __FIO_OPT_G_RBD,
> +       __FIO_OPT_G_GFAPI,
> +       __FIO_OPT_G_MTD,
>         __FIO_OPT_G_HDFS,
> +       __FIO_OPT_G_SG,
>         __FIO_OPT_G_NR,
>
>         FIO_OPT_G_RATE          = (1ULL << __FIO_OPT_G_RATE),
> @@ -93,6 +94,7 @@
>         FIO_OPT_G_GFAPI         = (1ULL << __FIO_OPT_G_GFAPI),
>         FIO_OPT_G_MTD           = (1ULL << __FIO_OPT_G_MTD),
>         FIO_OPT_G_HDFS          = (1ULL << __FIO_OPT_G_HDFS),
> +       FIO_OPT_G_SG            = (1ULL << __FIO_OPT_G_SG),
>         FIO_OPT_G_INVALID       = (1ULL << __FIO_OPT_G_NR),
>  };
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe fio" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



-- 
Sitsofe | http://sucs.org/~sits/
--
To unsubscribe from this list: send the line "unsubscribe fio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[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