• Damien Le Moal's avatar
    ata: libata: Improve CDL resource management · 602bcf21
    Damien Le Moal authored
    The ncq_sense_buf buffer field of struct ata_port is allocated and used
    only for devices that support the Command Duration Limits (CDL) feature.
    However, the cdl buffer of struct ata_device, which is used to cache the
    command duration limits log page for devices supporting CDL is always
    allocated as part of struct ata_device, which is wasteful of memory for
    devices that do not support this feature.
    
    Clean this up by defining both buffers as part of the new ata_cdl
    structure and allocating this structure only for devices that support
    the CDL feature. This new structure is attached to struct ata_device
    using the cdl pointer.
    
    The functions ata_dev_init_cdl_resources() and
    ata_dev_cleanup_cdl_resources() are defined to manage this new structure
    allocation, initialization and freeing when a port is removed or a
    device disabled. ata_dev_init_cdl_resources() is called from
    ata_dev_config_cdl() only for devices that support CDL.
    ata_dev_cleanup_cdl_resources() is called from ata_dev_free_resources()
    to free the ata_cdl structure when a device is being disabled by EH.
    
    Note that the name of the former cdl log buffer of struct ata_device is
    changed to desc_log_buf to make it clearer that it is a buffer for the
    limit descriptors log page.
    
    This change reduces the size of struct ata_device, thus reducing memory
    usage for ATA devices that do not support the CDL feature.
    Signed-off-by: default avatarDamien Le Moal <dlemoal@kernel.org>
    Reviewed-by: default avatarNiklas Cassel <cassel@kernel.org>
    602bcf21
libata-sata.c 43.2 KB