• Damien Le Moal's avatar
    block: Add independent access ranges support · a2247f19
    Damien Le Moal authored
    The Concurrent Positioning Ranges VPD page (for SCSI) and data log page
    (for ATA) contain parameters describing the set of contiguous LBAs that
    can be served independently by a single LUN multi-actuator hard-disk.
    Similarly, a logically defined block device composed of multiple disks
    can in some cases execute requests directed at different sector ranges
    in parallel. A dm-linear device aggregating 2 block devices together is
    an example.
    
    This patch implements support for exposing a block device independent
    access ranges to the user through sysfs to allow optimizing device
    accesses to increase performance.
    
    To describe the set of independent sector ranges of a device (actuators
    of a multi-actuator HDDs or table entries of a dm-linear device),
    The type struct blk_independent_access_ranges is introduced. This
    structure describes the sector ranges using an array of
    struct blk_independent_access_range structures. This range structure
    defines the start sector and number of sectors of the access range.
    The ranges in the array cannot overlap and must contain all sectors
    within the device capacity.
    
    The function disk_set_independent_access_ranges() allows a device
    driver to signal to the block layer that a device has multiple
    independent access ranges.  In this case, a struct
    blk_independent_access_ranges is attached to the device request queue
    by the function disk_set_independent_access_ranges(). The function
    disk_alloc_independent_access_ranges() is provided for drivers to
    allocate this structure.
    
    struct blk_independent_access_ranges contains kobjects (struct kobject)
    to expose to the user through sysfs the set of independent access ranges
    supported by a device. When the device is initialized, sysfs
    registration of the ranges information is done from blk_register_queue()
    using the block layer internal function
    disk_register_independent_access_ranges(). If a driver calls
    disk_set_independent_access_ranges() for a registered queue, e.g. when a
    device is revalidated, disk_set_independent_access_ranges() will execute
    disk_register_independent_access_ranges() to update the sysfs attribute
    files.  The sysfs file structure created starts from the
    independent_access_ranges sub-directory and contains the start sector
    and number of sectors of each range, with the information for each range
    grouped in numbered sub-directories.
    
    E.g. for a dual actuator HDD, the user sees:
    
    $ tree /sys/block/sdk/queue/independent_access_ranges/
    /sys/block/sdk/queue/independent_access_ranges/
    |-- 0
    |   |-- nr_sectors
    |   `-- sector
    `-- 1
        |-- nr_sectors
        `-- sector
    
    For a regular device with a single access range, the
    independent_access_ranges sysfs directory does not exist.
    
    Device revalidation may lead to changes to this structure and to the
    attribute values. When manipulated, the queue sysfs_lock and
    sysfs_dir_lock mutexes are held for atomicity, similarly to how the
    blk-mq and elevator sysfs queue sub-directories are protected.
    
    The code related to the management of independent access ranges is
    added in the new file block/blk-ia-ranges.c.
    Signed-off-by: default avatarDamien Le Moal <damien.lemoal@wdc.com>
    Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
    Reviewed-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    Reviewed-by: default avatarKeith Busch <kbusch@kernel.org>
    Link: https://lore.kernel.org/r/20211027022223.183838-2-damien.lemoal@wdc.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    a2247f19
Makefile 1.7 KB