Re: [PATCH v6 04/11] ata: libata: Print quirks applied to devices

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 7/31/24 16:27, Geert Uytterhoeven wrote:
> Hi Damien,
> 
> On Wed, Jul 31, 2024 at 1:39 AM Damien Le Moal <dlemoal@xxxxxxxxxx> wrote:
>> On 7/30/24 19:09, Geert Uytterhoeven wrote:
>>> On Fri, 26 Jul 2024, Damien Le Moal wrote:
>>>> Introduce the function ata_dev_print_quirks() to print the quirk flags
>>>> that will be applied to a scanned device. This new function is called
>>>> from ata_dev_quirks() when a match on a device model or device model
>>>> and revision is found for a device in the __ata_dev_quirks array.
>>>>
>>>> To implement this function, the ATA_QUIRK_ flags are redefined using
>>>> the new enum ata_quirk which defines the bit shift for each quirk
>>>> flag. The array of strings ata_quirk_names is used to define the name
>>>> of each flag, which are printed by ata_dev_print_quirks().
>>>>
>>>> Example output for a device listed in the __ata_dev_quirks array and
>>>> which has the ATA_QUIRK_DISABLE flag applied:
>>>>
>>>> [10193.461270] ata1: SATA link up 6.0 Gbps (SStatus 133 SControl 300)
>>>> [10193.469190] ata1.00: Model 'ASMT109x- Config', rev '2143 5', applying quirks: disable
>>>> [10193.469195] ata1.00: unsupported device, disabling
>>>> [10193.481564] ata1.00: disable device
>>>>
>>>> enum ata_quirk also defines the __ATA_QUIRK_MAX value as one plus the
>>>> last quirk flag defined. This value is used in ata_dev_quirks() to add a
>>>> build time check that all quirk flags fit within the unsigned int
>>>> (32-bits) quirks field of struct ata_device.
>>>>
>>>> Signed-off-by: Damien Le Moal <dlemoal@xxxxxxxxxx>
>>>> Reviewed-by: Igor Pylypiv <ipylypiv@xxxxxxxxxx>
>>>
>>> Thanks for your patch, which is now commit 58157d607aecb4e0 ("ata:
>>> libata: Print quirks applied to devices") in libata/for-next.
>>>
>>> During boot-up on Salvator-XS (using rcar-sata), the quirk info is
>>> printed not once, but four times.  Is that intentional?
>>
>> Not at all. I tested on x86 with AHCI and see this message only once. So it
>> could be that different drivers may need some tweaks to avoid this spamming.
>> Though it is strange that the initialization or resume path takes this path 4
>> times, meaning that the quirks are applied 4 times. Need to look into that.
>> What is the driver for rcar-sata ? Compatible string for it would be fine.
> 
> drivers/ata/sata_rcar.c, using renesas,rcar-gen3-sata.
> 
> I added a WARN() to ata_dev_quirks() to show backtraces:
> 
> Call trace:
>  ata_dev_quirks+0x98/0x19c
>  ata_dev_configure+0x74/0x12d8
>  ata_eh_recover+0x8d8/0xd08
>  ata_do_eh+0x50/0xa8
>  ata_sff_error_handler+0xd0/0xec
>  ata_bmdma_error_handler+0x7c/0x12c
>  ata_scsi_port_error_handler+0xc8/0x5f8
>  ata_scsi_error+0x90/0xcc
>  scsi_error_handler+0x148/0x308
>  kthread+0xe4/0xf4
>  ret_from_fork+0x10/0x20

OK. So it is ata_dev_configure() being called many times from EH. Weird.
But I have not a lot of experience with the bmdma drivers.
Need to look into that.

In the meantime, can you try this ?

diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 10d61c7523f0..24344de57428 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -76,7 +76,7 @@ static unsigned int ata_dev_init_params(struct ata_device *dev,
                                        u16 heads, u16 sectors);
 static unsigned int ata_dev_set_xfermode(struct ata_device *dev);
 static void ata_dev_xfermask(struct ata_device *dev);
-static unsigned int ata_dev_quirks(const struct ata_device *dev);
+static unsigned int ata_dev_quirks(struct ata_device *dev);
 
 static DEFINE_IDA(ata_ida);
 
@@ -4079,7 +4079,7 @@ static const char * const ata_quirk_names[] = {
        [__ATA_QUIRK_NO_FUA]            = "nofua",
 };
 
-static void ata_dev_print_quirks(const struct ata_device *dev,
+static void ata_dev_print_quirks(struct ata_device *dev,
                                 const char *model, const char *rev,
                                 unsigned int quirks)
 {
@@ -4087,7 +4087,7 @@ static void ata_dev_print_quirks(const struct ata_device *dev,
        size_t sz;
        char *str;
 
-       if (!quirks)
+       if (!ata_dev_print_info(dev) || !quirks)
                return;
 
        sz = 64 + ARRAY_SIZE(ata_quirk_names) * 16;
@@ -4388,7 +4388,7 @@ static const struct ata_dev_quirks_entry __ata_dev_quirks[] = {
        { }
 };
 
-static unsigned int ata_dev_quirks(const struct ata_device *dev)
+static unsigned int ata_dev_quirks(struct ata_device *dev)
 {
        unsigned char model_num[ATA_ID_PROD_LEN + 1];
        unsigned char model_rev[ATA_ID_FW_REV_LEN + 1];

That should remove the multiple prints.

-- 
Damien Le Moal
Western Digital Research





[Index of Archives]     [Linux Samsung SOC]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux