Message ID | 20240131130400.625836-6-hch@lst.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [01/14] block: move max_{open,active}_zones to struct queue_limits | expand |
On 1/31/24 05:03, Christoph Hellwig wrote: > Add a new max_user_discard_sectors limit that mirrors max_user_sectors > and stores the value that the user manually set. This now allows > updates of the max_hw_discard_sectors to not worry about the user > limit. > > Signed-off-by: Christoph Hellwig <hch@lst.de> > Reviewed-by: Hannes Reinecke <hare@suse.de> > --- > Looks good. Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com> -ck
On Wed, Jan 31, 2024 at 02:03:51PM +0100, Christoph Hellwig wrote: > static ssize_t queue_discard_max_store(struct request_queue *q, > const char *page, size_t count) > { > - unsigned long max_discard; > - ssize_t ret = queue_var_store(&max_discard, page, count); > + unsigned long max_discard_bytes; > + ssize_t ret; > > + ret = queue_var_store(&max_discard_bytes, page, count); > if (ret < 0) > return ret; > > - if (max_discard & (q->limits.discard_granularity - 1)) > + if (max_discard_bytes & (q->limits.discard_granularity - 1)) > return -EINVAL; > > - max_discard >>= 9; > - if (max_discard > UINT_MAX) > + if ((max_discard_bytes >> SECTOR_SHIFT) > UINT_MAX) > return -EINVAL; > > - if (max_discard > q->limits.max_hw_discard_sectors) > - max_discard = q->limits.max_hw_discard_sectors; > - > - q->limits.max_discard_sectors = max_discard; > + q->limits.max_user_discard_sectors = max_discard_bytes >> SECTOR_SHIFT; > + q->limits.max_discard_sectors = > + min_not_zero(q->limits.max_hw_discard_sectors, > + q->limits.max_user_discard_sectors); s/min_not_zero/min Otherwise the whole series looks pretty good! And with that: Reviewed-by: Keith Busch <kbusch@kernel.org>
On Wed, Jan 31, 2024 at 05:36:18PM -0700, Keith Busch wrote: > > + q->limits.max_user_discard_sectors = max_discard_bytes >> SECTOR_SHIFT; > > + q->limits.max_discard_sectors = > > + min_not_zero(q->limits.max_hw_discard_sectors, > > + q->limits.max_user_discard_sectors); > > s/min_not_zero/min Yes. Fixed up right after when converting to the limits based update, but this does create a bisection hazard as-is.
diff --git a/block/blk-settings.c b/block/blk-settings.c index 0706367f6f014f..50d4a88b80161d 100644 --- a/block/blk-settings.c +++ b/block/blk-settings.c @@ -47,6 +47,7 @@ void blk_set_default_limits(struct queue_limits *lim) lim->max_zone_append_sectors = 0; lim->max_discard_sectors = 0; lim->max_hw_discard_sectors = 0; + lim->max_user_discard_sectors = UINT_MAX; lim->max_secure_erase_sectors = 0; lim->discard_granularity = 512; lim->discard_alignment = 0; @@ -193,7 +194,9 @@ int blk_validate_limits(struct queue_limits *lim) if (!lim->max_segments) lim->max_segments = BLK_MAX_SEGMENTS; - lim->max_discard_sectors = lim->max_hw_discard_sectors; + lim->max_discard_sectors = + min(lim->max_hw_discard_sectors, lim->max_user_discard_sectors); + if (!lim->max_discard_segments) lim->max_discard_segments = 1; @@ -370,8 +373,11 @@ EXPORT_SYMBOL(blk_queue_chunk_sectors); void blk_queue_max_discard_sectors(struct request_queue *q, unsigned int max_discard_sectors) { - q->limits.max_hw_discard_sectors = max_discard_sectors; - q->limits.max_discard_sectors = max_discard_sectors; + struct queue_limits *lim = &q->limits; + + lim->max_hw_discard_sectors = max_discard_sectors; + lim->max_discard_sectors = + min(max_discard_sectors, lim->max_user_discard_sectors); } EXPORT_SYMBOL(blk_queue_max_discard_sectors); diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c index 26607f9825cb05..54e10604ddb1dd 100644 --- a/block/blk-sysfs.c +++ b/block/blk-sysfs.c @@ -174,23 +174,23 @@ static ssize_t queue_discard_max_show(struct request_queue *q, char *page) static ssize_t queue_discard_max_store(struct request_queue *q, const char *page, size_t count) { - unsigned long max_discard; - ssize_t ret = queue_var_store(&max_discard, page, count); + unsigned long max_discard_bytes; + ssize_t ret; + ret = queue_var_store(&max_discard_bytes, page, count); if (ret < 0) return ret; - if (max_discard & (q->limits.discard_granularity - 1)) + if (max_discard_bytes & (q->limits.discard_granularity - 1)) return -EINVAL; - max_discard >>= 9; - if (max_discard > UINT_MAX) + if ((max_discard_bytes >> SECTOR_SHIFT) > UINT_MAX) return -EINVAL; - if (max_discard > q->limits.max_hw_discard_sectors) - max_discard = q->limits.max_hw_discard_sectors; - - q->limits.max_discard_sectors = max_discard; + q->limits.max_user_discard_sectors = max_discard_bytes >> SECTOR_SHIFT; + q->limits.max_discard_sectors = + min_not_zero(q->limits.max_hw_discard_sectors, + q->limits.max_user_discard_sectors); return ret; } diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 5b5d3b238de1e7..700ec5055b668d 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -290,6 +290,7 @@ struct queue_limits { unsigned int io_opt; unsigned int max_discard_sectors; unsigned int max_hw_discard_sectors; + unsigned int max_user_discard_sectors; unsigned int max_secure_erase_sectors; unsigned int max_write_zeroes_sectors; unsigned int max_zone_append_sectors;