mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-23 05:56:14 -04:00
block: use zone condition to determine conventional zones
The conv_zones_bitmap field of struct gendisk is used to define a bitmap to identify the conventional zones of a zoned block device. The bit for a zone is set in this bitmap if the zone is a conventional one, that is, if the zone type is BLK_ZONE_TYPE_CONVENTIONAL. For such zone, this always corresponds to the zone condition BLK_ZONE_COND_NOT_WP. In other words, conv_zones_bitmap tracks a single condition of the zones of a zoned block device. In preparation for tracking more zone conditions, change conv_zones_bitmap into an array of zone conditions, using 1 byte per zone. This increases the memory usage from 1 bit per zone to 1 byte per zone, that is, from 16 KiB to about 100 KiB for a 30 TB SMR HDD with 256 MiB zones. This is a trade-off to allow fast cached report zones later on top of this change. Rename the conv_zones_bitmap field of struct gendisk to zones_cond. Add a blk_revalidate_zone_cond() function to initialize the zones_cond array of a disk during device scan and to update it on device revalidation. Move the allocation of the zones_cond array to disk_revalidate_zone_resources(), making sure that this array is always allocated, even for devices that do not need zone write plugs (zone resources), to ensure that bdev_zone_is_seq() can be re-implemented to use the zone condition array in place of the conv zones bitmap. Finally, the function bdev_zone_is_seq() is rewritten to use a test on the condition of the target zone. Signed-off-by: Damien Le Moal <dlemoal@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com> Reviewed-by: Hannes Reinecke <hare@suse.de> Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
committed by
Jens Axboe
parent
ca1a897fb2
commit
6e945ffb65
@@ -196,7 +196,7 @@ struct gendisk {
|
||||
unsigned int nr_zones;
|
||||
unsigned int zone_capacity;
|
||||
unsigned int last_zone_capacity;
|
||||
unsigned long __rcu *conv_zones_bitmap;
|
||||
u8 __rcu *zones_cond;
|
||||
unsigned int zone_wplugs_hash_bits;
|
||||
atomic_t nr_zone_wplugs;
|
||||
spinlock_t zone_wplugs_lock;
|
||||
@@ -925,12 +925,20 @@ static inline unsigned int bdev_zone_capacity(struct block_device *bdev,
|
||||
{
|
||||
return disk_zone_capacity(bdev->bd_disk, pos);
|
||||
}
|
||||
|
||||
bool bdev_zone_is_seq(struct block_device *bdev, sector_t sector);
|
||||
|
||||
#else /* CONFIG_BLK_DEV_ZONED */
|
||||
static inline unsigned int disk_nr_zones(struct gendisk *disk)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline bool bdev_zone_is_seq(struct block_device *bdev, sector_t sector)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool bio_needs_zone_write_plugging(struct bio *bio)
|
||||
{
|
||||
return false;
|
||||
@@ -1533,33 +1541,6 @@ static inline bool bdev_is_zone_aligned(struct block_device *bdev,
|
||||
return bdev_is_zone_start(bdev, sector);
|
||||
}
|
||||
|
||||
/**
|
||||
* bdev_zone_is_seq - check if a sector belongs to a sequential write zone
|
||||
* @bdev: block device to check
|
||||
* @sector: sector number
|
||||
*
|
||||
* Check if @sector on @bdev is contained in a sequential write required zone.
|
||||
*/
|
||||
static inline bool bdev_zone_is_seq(struct block_device *bdev, sector_t sector)
|
||||
{
|
||||
bool is_seq = false;
|
||||
|
||||
#if IS_ENABLED(CONFIG_BLK_DEV_ZONED)
|
||||
if (bdev_is_zoned(bdev)) {
|
||||
struct gendisk *disk = bdev->bd_disk;
|
||||
unsigned long *bitmap;
|
||||
|
||||
rcu_read_lock();
|
||||
bitmap = rcu_dereference(disk->conv_zones_bitmap);
|
||||
is_seq = !bitmap ||
|
||||
!test_bit(disk_zone_no(disk, sector), bitmap);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
#endif
|
||||
|
||||
return is_seq;
|
||||
}
|
||||
|
||||
int blk_zone_issue_zeroout(struct block_device *bdev, sector_t sector,
|
||||
sector_t nr_sects, gfp_t gfp_mask);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user