Christoph, On 2/21/18 11:48, Damien Le Moal wrote: > Christoph, > > On 2/21/18 11:39, Christoph Hellwig wrote: >> On Tue, Feb 20, 2018 at 03:06:10PM +0900, Damien Le Moal wrote: >>> For a zoned block device mount, an array of zone types for the device is >>> allocated and initialized in order to determine if a section is stored >>> on a sequential zone (zone reset needed) or a conventional zone (no zone >>> reset needed and regular discard applies). Considering this usage, the >>> zone types stored in memory can be replaced with a bitmap to indicate >>> equivalent information, that is, if a zone is sequential or not. This >>> reduces the memory usage for the device mount by roughly 8 (on a 14TB >>> disk with zones of 256 MB, the zone type array consumes 13x4KB pages >>> while the bitmap uses only 2x4KB pages. >>> >>> This patch changes the f2fs_dev_info structure blkz_type field to the >>> bitmap blkz_seq. Access to this bitmap is done using the function >>> f2fs_blkz_is_seq(), which is a rewrite of the function get_blkz_type(). >> >> Is there any way we could just provide a block layer helper to >> figure this out so that the file system code could be simplified even >> more? > > I thought about that before sending the patch... > > For a physical drive, the block device queue already has the bitmap > indicating sequential zones, and a helper could be used in that case. > But that is not true if the FS block device is a logical device provided > by something like dm. E.g. if the FS mounts a zoned block device that is > a part of a real disk split by dm-linear, then there is no sequential > zone bitmap available, and the FS has to discover that by itself. > > Currently, the sequential zone bitmap is initialized in the scsi driver > only. We could move that initialization to the block device layer at > some point when the bdev is created and requests can be sent to the > underlying dev, but before the bdev is exposed. Any suggestion of an > appropriate place to do that ? I do not see any obvious path that works > in all cases (real disks and dm). Answering to myself :) I was thinking of optimizing by reusing the request queue sequentila zone bitmap. But you may have been thinking of something more simple like: struct blk_zone_info { unsigned int nr_zones; unsigned long *seq_zones: }; struct blk_zone_info *blk_get_zone_info(struct block_device *bdev); void blk_put_zone_info(struct block_device *bdev); bool blk_zone_is_seq(struct block_device *bdev, sector_t sect); Which is in essence what f2fs currently code. That is easy to write. To avoid a lot of report zones, the blk_zone_info structure can be added to the block device struct for caching (the zone types and number of zones never change, even with hybrid SMR drives). Would this be better ? Best regards. -- Damien Le Moal, Western Digital