From: Mike Snitzer <snitzer@redhat.com>
To: Damien Le Moal <damien.lemoal@wdc.com>
Cc: linux-block@vger.kernel.org, Jens Axboe <axboe@kernel.dk>,
linux-scsi@vger.kernel.org,
"Martin K . Petersen" <martin.petersen@oracle.com>,
dm-devel@redhat.com, Christoph Hellwig <hch@lst.de>,
Matias Bjorling <matias.bjorling@wdc.com>
Subject: Re: [PATCH 10/11] block: add a report_zones method
Date: Wed, 10 Oct 2018 10:15:19 -0400 [thread overview]
Message-ID: <20181010141518.GA9454@redhat.com> (raw)
In-Reply-To: <20181010015239.24930-11-damien.lemoal@wdc.com>
On Tue, Oct 09 2018 at 9:52pm -0400,
Damien Le Moal <damien.lemoal@wdc.com> wrote:
> From: Christoph Hellwig <hch@lst.de>
>
> Dispatching a report zones command through the request queue is a major
> pain due to the command reply payload rewriting necessary. Given that
> blkdev_report_zones() is executing everything synchronously, implement
> report zones as a block device file operation instead, allowing major
> simplification of the code in many places.
>
> sd, null-blk, dm-linear and dm-flakey being the only block device
> drivers supporting exposing zoned block devices, these drivers are
> modified to provide the device side implementation of the
> report_zones() block device file operation.
>
> For dm-linear and dm-flakey, a new report_zones() target type operation
> is defined so that the upper block layer call can be propagated down to
> the underlying devices of the dm targets.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> [Damien]
> * Changed method block_device argument to gendisk
> * Various bug fixes and improvements
> * Added support for null_blk, dm-linear and dm-flakey.
> Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
I like that this patch removes the need for endio from dm-linear, etc.
Very welcomed.
> ---
> block/blk-core.c | 1 -
> block/blk-mq-debugfs.c | 1 -
> block/blk-zoned.c | 164 ++++++++++-----------------------
> drivers/block/null_blk.h | 11 ++-
> drivers/block/null_blk_main.c | 23 +----
> drivers/block/null_blk_zoned.c | 57 +++---------
> drivers/md/dm-flakey.c | 28 ++++--
> drivers/md/dm-linear.c | 31 ++++---
> drivers/md/dm.c | 150 ++++++++++++++++--------------
<snip>
> diff --git a/drivers/md/dm.c b/drivers/md/dm.c
> index 20f7e4ef5342..e9fb3c706ef6 100644
> --- a/drivers/md/dm.c
> +++ b/drivers/md/dm.c
> @@ -1156,79 +1203,48 @@ EXPORT_SYMBOL_GPL(dm_accept_partial_bio);
>
> /*
> * The zone descriptors obtained with a zone report indicate
> - * zone positions within the target device. The zone descriptors
> - * must be remapped to match their position within the dm device.
> - * A target may call dm_remap_zone_report after completion of a
> - * REQ_OP_ZONE_REPORT bio to remap the zone descriptors obtained
> - * from the target device mapping to the dm device.
> + * zone positions within the underlying device of the target. The zone
> + * descriptors must be remapped to match their position within the dm device.
> + * The caller target should obtain the zones information using
> + * blkdev_report_zones() to ensure that remapping for partition offset is
> + * already handled.
> */
> -void dm_remap_zone_report(struct dm_target *ti, struct bio *bio, sector_t start)
> +void dm_remap_zone_report(struct dm_target *ti, sector_t start,
> + struct blk_zone *zones, unsigned int *nr_zones)
> {
> #ifdef CONFIG_BLK_DEV_ZONED
> - struct dm_target_io *tio = container_of(bio, struct dm_target_io, clone);
> - struct bio *report_bio = tio->io->orig_bio;
> - struct blk_zone_report_hdr *hdr = NULL;
> struct blk_zone *zone;
> - unsigned int nr_rep = 0;
> - unsigned int ofst;
> - struct bio_vec bvec;
> - struct bvec_iter iter;
> - void *addr;
> -
> - if (bio->bi_status)
> - return;
> + unsigned int nrz = *nr_zones;
> + int i;
>
> /*
> - * Remap the start sector of the reported zones. For sequential zones,
> - * also remap the write pointer position.
> + * Remap the start sector and write pointer position of the zones in
> + * the array. Since we may have obtained from the target underlying
> + * device more zones that the target size, also adjust the number
> + * of zones.
> */
> - bio_for_each_segment(bvec, report_bio, iter) {
> - addr = kmap_atomic(bvec.bv_page);
> -
> - /* Remember the report header in the first page */
> - if (!hdr) {
> - hdr = addr;
> - ofst = sizeof(struct blk_zone_report_hdr);
> - } else
> - ofst = 0;
> -
> - /* Set zones start sector */
> - while (hdr->nr_zones && ofst < bvec.bv_len) {
> - zone = addr + ofst;
> - if (zone->start >= start + ti->len) {
> - hdr->nr_zones = 0;
> - break;
> - }
> - zone->start = zone->start + ti->begin - start;
> - if (zone->type != BLK_ZONE_TYPE_CONVENTIONAL) {
> - if (zone->cond == BLK_ZONE_COND_FULL)
> - zone->wp = zone->start + zone->len;
> - else if (zone->cond == BLK_ZONE_COND_EMPTY)
> - zone->wp = zone->start;
> - else
> - zone->wp = zone->wp + ti->begin - start;
> - }
> - ofst += sizeof(struct blk_zone);
> - hdr->nr_zones--;
> - nr_rep++;
> + for (i = 0; i < nrz; i++) {
> + zone = zones + i;
> + if (zone->start >= start + ti->len) {
> + memset(zone, 0, sizeof(struct blk_zone) * (nrz - i));
> + break;
> }
>
> - if (addr != hdr)
> - kunmap_atomic(addr);
> -
> - if (!hdr->nr_zones)
> - break;
> - }
> + zone->start = zone->start + ti->begin - start;
> + if (zone->type == BLK_ZONE_TYPE_CONVENTIONAL)
> + continue;
>
> - if (hdr) {
> - hdr->nr_zones = nr_rep;
> - kunmap_atomic(hdr);
> + if (zone->cond == BLK_ZONE_COND_FULL)
> + zone->wp = zone->start + zone->len;
> + else if (zone->cond == BLK_ZONE_COND_EMPTY)
> + zone->wp = zone->start;
> + else
> + zone->wp = zone->wp + ti->begin - start;
> }
>
> - bio_advance(report_bio, report_bio->bi_iter.bi_size);
> -
> + *nr_zones = i;
> #else /* !CONFIG_BLK_DEV_ZONED */
> - bio->bi_status = BLK_STS_NOTSUPP;
> + *nr_zones = 0;
> #endif
> }
> EXPORT_SYMBOL_GPL(dm_remap_zone_report);
Doesn't this hunk need to get rebased given your latest <= 4.19 stable@
fix? I've also tweaked that fix slightly to avoid line wrapping, I'm
more relaxed about that aspect of code-style if it helps readability.
Please rebase ontop of:
https://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.git/commit/?h=dm-4.19&id=9864cd5dc54cade89fd4b0954c2e522841aa247c
I'll be sending this to gregkh in the last dm pull for 4.19 final today
or tomorrow.
Thanks,
Mike
next prev parent reply other threads:[~2018-10-10 14:15 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-10 1:52 [PATCH 00/11] Zoned block device support improvements Damien Le Moal
2018-10-10 1:52 ` [PATCH 01/11] scsi: sd_zbc: Rearrange code Damien Le Moal
2018-10-10 13:25 ` Christoph Hellwig
2018-10-10 1:52 ` [PATCH 02/11] scsi: sd_zbc: Reduce boot device scan and revalidate time Damien Le Moal
2018-10-10 13:26 ` Christoph Hellwig
2018-10-10 1:52 ` [PATCH 03/11] scsi: sd_zbc: Fix sd_zbc_check_zones() error checks Damien Le Moal
2018-10-10 13:26 ` Christoph Hellwig
2018-10-10 1:52 ` [PATCH 04/11] block: Introduce blkdev_nr_zones() helper Damien Le Moal
2018-10-10 13:26 ` Christoph Hellwig
2018-10-10 1:52 ` [PATCH 05/11] block: Limit allocation of zone descriptors for report zones Damien Le Moal
2018-10-10 13:27 ` Christoph Hellwig
2018-10-10 1:52 ` [PATCH 06/11] block: Introduce BLKGETZONESZ ioctl Damien Le Moal
2018-10-10 13:27 ` Christoph Hellwig
2018-10-10 16:53 ` [dm-devel] " Bart Van Assche
2018-10-10 1:52 ` [PATCH 07/11] block: Introduce BLKGETNRZONES ioctl Damien Le Moal
2018-10-10 13:27 ` Christoph Hellwig
2018-10-10 1:52 ` [PATCH 08/11] block: Improve zone reset execution Damien Le Moal
2018-10-10 13:28 ` Christoph Hellwig
2018-10-10 1:52 ` [PATCH 09/11] block: Expose queue nr_zones in sysfs Damien Le Moal
2018-10-10 13:28 ` Christoph Hellwig
2018-10-10 14:05 ` kbuild test robot
2018-10-10 18:44 ` kbuild test robot
2018-10-10 1:52 ` [PATCH 10/11] block: add a report_zones method Damien Le Moal
2018-10-10 14:15 ` Mike Snitzer [this message]
2018-10-10 16:15 ` Mike Snitzer
2018-10-10 14:40 ` kbuild test robot
2018-10-10 15:34 ` Mike Snitzer
2018-10-10 16:25 ` kbuild test robot
2018-10-10 1:52 ` [PATCH 11/11] block: Introduce revalidate_disk_zones() Damien Le Moal
2018-10-10 13:34 ` Christoph Hellwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181010141518.GA9454@redhat.com \
--to=snitzer@redhat.com \
--cc=axboe@kernel.dk \
--cc=damien.lemoal@wdc.com \
--cc=dm-devel@redhat.com \
--cc=hch@lst.de \
--cc=linux-block@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=matias.bjorling@wdc.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).