mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 21:21:41 +00:00
block: Allow BIO-based drivers to use blk_revalidate_disk_zones()
In preparation for allowing BIO based device drivers to use zone write plugging and its zone append emulation, allow these drivers to call blk_revalidate_disk_zones() so that all zone resources necessary to zone write plugging can be initialized. To do so, remove the check in blk_revalidate_disk_zones() restricting the use of this function to mq request-based drivers to allow also BIO-based drivers to use it. This is safe to do as long as the BIO-based block device queue is already setup and usable, as it should, and can be safely frozen. The helper function disk_need_zone_resources() is added to control the allocation and initialization of the zone write plug hash table and of the conventional zone bitmap only for mq devices and for BIO-based devices that require zone append emulation. Signed-off-by: Damien Le Moal <dlemoal@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Hannes Reinecke <hare@suse.de> Reviewed-by: Bart Van Assche <bvanassche@acm.org> Tested-by: Hans Holmberg <hans.holmberg@wdc.com> Tested-by: Dennis Maisenbacher <dennis.maisenbacher@wdc.com> Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com> Link: https://lore.kernel.org/r/20240408014128.205141-12-dlemoal@kernel.org Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
9b1ce7f0c6
commit
946dd71ed8
@ -1512,12 +1512,28 @@ void disk_free_zone_resources(struct gendisk *disk)
|
||||
disk->nr_zones = 0;
|
||||
}
|
||||
|
||||
static inline bool disk_need_zone_resources(struct gendisk *disk)
|
||||
{
|
||||
/*
|
||||
* All mq zoned devices need zone resources so that the block layer
|
||||
* can automatically handle write BIO plugging. BIO-based device drivers
|
||||
* (e.g. DM devices) are normally responsible for handling zone write
|
||||
* ordering and do not need zone resources, unless the driver requires
|
||||
* zone append emulation.
|
||||
*/
|
||||
return queue_is_mq(disk->queue) ||
|
||||
queue_emulates_zone_append(disk->queue);
|
||||
}
|
||||
|
||||
static int disk_revalidate_zone_resources(struct gendisk *disk,
|
||||
unsigned int nr_zones)
|
||||
{
|
||||
struct queue_limits *lim = &disk->queue->limits;
|
||||
unsigned int pool_size;
|
||||
|
||||
if (!disk_need_zone_resources(disk))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* If the device has no limit on the maximum number of open and active
|
||||
* zones, use BLK_ZONE_WPLUG_DEFAULT_POOL_SIZE.
|
||||
@ -1635,6 +1651,9 @@ static int blk_revalidate_zone_cb(struct blk_zone *zone, unsigned int idx,
|
||||
disk->disk_name);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (!disk_need_zone_resources(disk))
|
||||
break;
|
||||
if (!args->conv_zones_bitmap) {
|
||||
args->conv_zones_bitmap =
|
||||
blk_alloc_zone_bitmap(q->node, args->nr_zones);
|
||||
@ -1666,10 +1685,11 @@ static int blk_revalidate_zone_cb(struct blk_zone *zone, unsigned int idx,
|
||||
/*
|
||||
* We need to track the write pointer of all zones that are not
|
||||
* empty nor full. So make sure we have a zone write plug for
|
||||
* such zone.
|
||||
* such zone if the device has a zone write plug hash table.
|
||||
*/
|
||||
wp_offset = blk_zone_wp_offset(zone);
|
||||
if (wp_offset && wp_offset < zone_sectors) {
|
||||
if (disk->zone_wplugs_hash &&
|
||||
wp_offset && wp_offset < zone_sectors) {
|
||||
zwplug = disk_get_and_lock_zone_wplug(disk, zone->start,
|
||||
GFP_NOIO, &flags);
|
||||
if (!zwplug)
|
||||
@ -1700,8 +1720,8 @@ static int blk_revalidate_zone_cb(struct blk_zone *zone, unsigned int idx,
|
||||
* be called within the disk ->revalidate method for blk-mq based drivers.
|
||||
* Before calling this function, the device driver must already have set the
|
||||
* device zone size (chunk_sector limit) and the max zone append limit.
|
||||
* For BIO based drivers, this function cannot be used. BIO based device drivers
|
||||
* only need to set disk->nr_zones so that the sysfs exposed value is correct.
|
||||
* BIO based drivers can also use this function as long as the device queue
|
||||
* can be safely frozen.
|
||||
* If the @update_driver_data callback function is not NULL, the callback is
|
||||
* executed with the device request queue frozen after all zones have been
|
||||
* checked.
|
||||
@ -1718,8 +1738,6 @@ int blk_revalidate_disk_zones(struct gendisk *disk,
|
||||
|
||||
if (WARN_ON_ONCE(!blk_queue_is_zoned(q)))
|
||||
return -EIO;
|
||||
if (WARN_ON_ONCE(!queue_is_mq(q)))
|
||||
return -EIO;
|
||||
|
||||
if (!capacity)
|
||||
return -ENODEV;
|
||||
|
Loading…
Reference in New Issue
Block a user