[PATCH 06/13] block: use zone condition to determine conventional zones
Bart Van Assche
bvanassche at acm.org
Fri Oct 31 14:04:23 PDT 2025
On 10/30/25 11:13 PM, Damien Le Moal wrote:
> zone. This increases the memory usage from 1 bit per zone to 1 bytes per
1 bytes -> 1 byte
> +bool bdev_zone_is_seq(struct block_device *bdev, sector_t sector)
> +{
> + struct gendisk *disk = bdev->bd_disk;
> + unsigned int zno = disk_zone_no(disk, sector);
> + bool is_seq = false;
> + u8 *zones_cond;
> +
> + if (!bdev_is_zoned(bdev))
> + return false;
> +
> + rcu_read_lock();
> + zones_cond = rcu_dereference(disk->zones_cond);
> + if (zones_cond)
> + is_seq = zones_cond[zno] != BLK_ZONE_COND_NOT_WP;
> + rcu_read_unlock();
> +
> + return is_seq;
> +}
> +EXPORT_SYMBOL_GPL(bdev_zone_is_seq);
'zno' should be compared to the size of the zones_cond[] array before
using 'zno' as an array index.
> static int disk_revalidate_zone_resources(struct gendisk *disk,
> - unsigned int nr_zones)
> + struct blk_revalidate_zone_args *args)
> {
> struct queue_limits *lim = &disk->queue->limits;
> unsigned int pool_size;
>
> + args->disk = disk;
> + args->nr_zones =
> + DIV_ROUND_UP_ULL(get_capacity(disk), lim->chunk_sectors);
> +
> + /* Cached zone conditions: 1 byte per zone */
> + args->zones_cond = kzalloc(args->nr_zones, GFP_NOIO);
> + if (!args->zones_cond)
> + return -ENOMEM;
Why args->nr_zones as array size instead of args->nr_conv_zones? The
patch description says that this array is only used for conventional
zones.
> /*
> * Some devices can advertize zone resource limits that are larger than
advertize -> advertise
Thanks,
Bart.
More information about the Linux-nvme
mailing list