On Thu, Jul 03, 2025 at 07:36:19PM +0900, Damien Le Moal wrote: > The function ata_log_supported() tests if a log page is supported by a > device using the General Purpose Log Directory log page, which lists the > size of all surported log pages. However, this log page is read from the > device using ata_read_log_page() every time ata_log_supported() is > called. That is not necessary. > > Avoid reading the General Purpose Log Directory log page by caching its > content in the gp_log_dir buffer defined as part of struct ata_device. > The functions ata_read_log_directory() and ata_clear_log_directory() are > introduced to manage this buffer. ata_clear_log_directory() zero-fill > the gp_log_dir buffer every time ata_dev_configure() is called, that is, > when the device is first scanned and when it is being revalidated. > The function ata_log_supported() is modified to call > ata_read_log_directory() instead of ata_read_log_page(). > > The function ata_read_log_directory() calls ata_read_log_page() to read > the General Purpose Log Directory log page from the device only if the > first 16-bits word of the log is not equal to 0x0001, that is, it is not > equal to the ACS mandated value for the log version. > > With this, the log page is read from the device only once for every > ata_dev_configure() call. For instance, with pr_debug enabled, a call > to ata_dev_configure() before this patch generates the following log > page accesses: > > ata3.00: read log page - log 0x0, page 0x0 > ata3.00: read log page - log 0x13, page 0x0 > ata3.00: read log page - log 0x0, page 0x0 > ata3.00: read log page - log 0x12, page 0x0 > ata3.00: read log page - log 0x0, page 0x0 > ata3.00: read log page - log 0x30, page 0x0 > ata3.00: read log page - log 0x30, page 0x8 > ata3.00: read log page - log 0x0, page 0x0 > ata3.00: read log page - log 0x0, page 0x0 > ata3.00: read log page - log 0x0, page 0x0 > ata3.00: read log page - log 0x30, page 0x0 > ata3.00: read log page - log 0x0, page 0x0 > ata3.00: read log page - log 0x30, page 0x0 > ata3.00: read log page - log 0x30, page 0x3 > ata3.00: read log page - log 0x30, page 0x4 > ata3.00: read log page - log 0x18, page 0x0 > > That is, the general purpose log directory page is read 7 times. > With this patch applied, the number of accesses to this log page is > reduced to one: > > ata3.00: read log page - log 0x0, page 0x0 > ata3.00: read log page - log 0x13, page 0x0 > ata3.00: read log page - log 0x12, page 0x0 > ata3.00: read log page - log 0x30, page 0x0 > ata3.00: read log page - log 0x30, page 0x8 > ata3.00: read log page - log 0x30, page 0x0 > ata3.00: read log page - log 0x30, page 0x0 > ata3.00: read log page - log 0x30, page 0x3 > ata3.00: read log page - log 0x30, page 0x4 > ata3.00: read log page - log 0x18, page 0x0 > > Signed-off-by: Damien Le Moal <dlemoal@xxxxxxxxxx> Reviewed-by: Niklas Cassel <cassel@xxxxxxxxxx>