Message ID | 20230818193546.2014874-10-bvanassche@acm.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Improve performance for zoned UFS devices | expand |
On 2023-08-18 15:34, Bart Van Assche wrote: > Zone write locking is not used for zoned devices if the block driver > reports that it preserves the order of write commands. Make it easier to > test not using zone write locking by adding support for setting the > driver_preserves_write_order flag. > > Cc: Martin K. Petersen <martin.petersen@oracle.com> > Cc: Douglas Gilbert <dgilbert@interlog.com> > Cc: Damien Le Moal <dlemoal@kernel.org> > Cc: Christoph Hellwig <hch@lst.de> > Cc: Ming Lei <ming.lei@redhat.com> > Signed-off-by: Bart Van Assche <bvanassche@acm.org> Acked-by: Douglas Gilbert <dgilbert@interlog.com> > --- > drivers/scsi/scsi_debug.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c > index 9c0af50501f9..1ea4925d2c2f 100644 > --- a/drivers/scsi/scsi_debug.c > +++ b/drivers/scsi/scsi_debug.c > @@ -832,6 +832,7 @@ static int dix_reads; > static int dif_errors; > > /* ZBC global data */ > +static bool sdeb_preserves_write_order; > static bool sdeb_zbc_in_use; /* true for host-aware and host-managed disks */ > static int sdeb_zbc_zone_cap_mb; > static int sdeb_zbc_zone_size_mb; > @@ -5138,9 +5139,13 @@ static struct sdebug_dev_info *find_build_dev_info(struct scsi_device *sdev) > > static int scsi_debug_slave_alloc(struct scsi_device *sdp) > { > + struct request_queue *q = sdp->request_queue; > + > if (sdebug_verbose) > pr_info("slave_alloc <%u %u %u %llu>\n", > sdp->host->host_no, sdp->channel, sdp->id, sdp->lun); > + if (sdeb_preserves_write_order) > + q->limits.driver_preserves_write_order = true; > return 0; > } > > @@ -5755,6 +5760,8 @@ module_param_named(statistics, sdebug_statistics, bool, S_IRUGO | S_IWUSR); > module_param_named(strict, sdebug_strict, bool, S_IRUGO | S_IWUSR); > module_param_named(submit_queues, submit_queues, int, S_IRUGO); > module_param_named(poll_queues, poll_queues, int, S_IRUGO); > +module_param_named(preserves_write_order, sdeb_preserves_write_order, bool, > + S_IRUGO); > module_param_named(tur_ms_to_ready, sdeb_tur_ms_to_ready, int, S_IRUGO); > module_param_named(unmap_alignment, sdebug_unmap_alignment, int, S_IRUGO); > module_param_named(unmap_granularity, sdebug_unmap_granularity, int, S_IRUGO); > @@ -5812,6 +5819,8 @@ MODULE_PARM_DESC(ndelay, "response delay in nanoseconds (def=0 -> ignore)"); > MODULE_PARM_DESC(no_lun_0, "no LU number 0 (def=0 -> have lun 0)"); > MODULE_PARM_DESC(no_rwlock, "don't protect user data reads+writes (def=0)"); > MODULE_PARM_DESC(no_uld, "stop ULD (e.g. sd driver) attaching (def=0))"); > +MODULE_PARM_DESC(preserves_write_order, > + "Whether or not to inform the block layer that this driver preserves the order of WRITE commands (def=0)"); > MODULE_PARM_DESC(num_parts, "number of partitions(def=0)"); > MODULE_PARM_DESC(num_tgts, "number of targets per host to simulate(def=1)"); > MODULE_PARM_DESC(opt_blks, "optimal transfer length in blocks (def=1024)");
diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c index 9c0af50501f9..1ea4925d2c2f 100644 --- a/drivers/scsi/scsi_debug.c +++ b/drivers/scsi/scsi_debug.c @@ -832,6 +832,7 @@ static int dix_reads; static int dif_errors; /* ZBC global data */ +static bool sdeb_preserves_write_order; static bool sdeb_zbc_in_use; /* true for host-aware and host-managed disks */ static int sdeb_zbc_zone_cap_mb; static int sdeb_zbc_zone_size_mb; @@ -5138,9 +5139,13 @@ static struct sdebug_dev_info *find_build_dev_info(struct scsi_device *sdev) static int scsi_debug_slave_alloc(struct scsi_device *sdp) { + struct request_queue *q = sdp->request_queue; + if (sdebug_verbose) pr_info("slave_alloc <%u %u %u %llu>\n", sdp->host->host_no, sdp->channel, sdp->id, sdp->lun); + if (sdeb_preserves_write_order) + q->limits.driver_preserves_write_order = true; return 0; } @@ -5755,6 +5760,8 @@ module_param_named(statistics, sdebug_statistics, bool, S_IRUGO | S_IWUSR); module_param_named(strict, sdebug_strict, bool, S_IRUGO | S_IWUSR); module_param_named(submit_queues, submit_queues, int, S_IRUGO); module_param_named(poll_queues, poll_queues, int, S_IRUGO); +module_param_named(preserves_write_order, sdeb_preserves_write_order, bool, + S_IRUGO); module_param_named(tur_ms_to_ready, sdeb_tur_ms_to_ready, int, S_IRUGO); module_param_named(unmap_alignment, sdebug_unmap_alignment, int, S_IRUGO); module_param_named(unmap_granularity, sdebug_unmap_granularity, int, S_IRUGO); @@ -5812,6 +5819,8 @@ MODULE_PARM_DESC(ndelay, "response delay in nanoseconds (def=0 -> ignore)"); MODULE_PARM_DESC(no_lun_0, "no LU number 0 (def=0 -> have lun 0)"); MODULE_PARM_DESC(no_rwlock, "don't protect user data reads+writes (def=0)"); MODULE_PARM_DESC(no_uld, "stop ULD (e.g. sd driver) attaching (def=0))"); +MODULE_PARM_DESC(preserves_write_order, + "Whether or not to inform the block layer that this driver preserves the order of WRITE commands (def=0)"); MODULE_PARM_DESC(num_parts, "number of partitions(def=0)"); MODULE_PARM_DESC(num_tgts, "number of targets per host to simulate(def=1)"); MODULE_PARM_DESC(opt_blks, "optimal transfer length in blocks (def=1024)");
Zone write locking is not used for zoned devices if the block driver reports that it preserves the order of write commands. Make it easier to test not using zone write locking by adding support for setting the driver_preserves_write_order flag. Cc: Martin K. Petersen <martin.petersen@oracle.com> Cc: Douglas Gilbert <dgilbert@interlog.com> Cc: Damien Le Moal <dlemoal@kernel.org> Cc: Christoph Hellwig <hch@lst.de> Cc: Ming Lei <ming.lei@redhat.com> Signed-off-by: Bart Van Assche <bvanassche@acm.org> --- drivers/scsi/scsi_debug.c | 9 +++++++++ 1 file changed, 9 insertions(+)