Re: [PATCHv3 00/68] libata: rework logging, take II

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

 



On 12/30/21 22:47, Hannes Reinecke wrote:
> On 12/30/21 6:19 AM, Damien Le Moal wrote:
>> On 12/21/21 16:20, Hannes Reinecke wrote:
>>> Hi all,
>>>
>>> after some prodding from individual persons I've resurrected my
>>> patchset to put libata logging on a even keel, and use structured
>>> logging for everything.
>>> So this patch does away with DPRINTK, ATA_DEBUG or ata_msg_XXX()
>>> calls, and moves everything over to structured logging
>>> (ie the dev_XXX() calls).
>>> Additionally I've added tracepoints to trace command flow,
>>> error handling, host state machine etc.
>>>
>>> So everything is looking far saner now.
>>>
>>> As usual, comments and reviews are welcome.
>>>
>>> I know that the device names suck. Blame Tejun.
>>
>> I applied this series, temporarily, to the branch for-5.17-logging, with
>> the fixes I commented about.
>>
>> After some light testing, seems OK, but need to hammer this a little more.
>>
>> My main concern is the change in patch 12: using the dev_xxx() macros
>> directly changes the messages from being all prefixed with "ataX.X" to
>> different flavors (devX.X, linkX.X, portX.X, etc). While I do like the
>> code simplification, this makes reading dmesg to track how a device is
>> behaving very hard.
>>
> And that was exactly what I had been hinting at with my last sentence :-)
> 
> Original sin here is to have completely generic names for ata device 
> objects (link-X? C'mon).
> 
> And trying to twiddle with the devnames will land you in the mess we are 
> in now, _and_ you lose the link between device names in sysfs and what's 
> printed in the logging message, making debugging ever so much fun.
> (And I'm not even going into the _very_ slim distinction between port, 
> link, and dev here ...)
> 
>> Defining dev_fmt() everywhere the ata_{port,link,dev}_XXX functions are
>> used would solve this, but that is annoying as almost all drivers would
>> need to define that. Looking at the dev_XXX() macros, I do not see an
>> easy solution. Any idea ?
>>
> I guess the only sane solution would be to have a clean break by 
> introducing a new config variable like ATA_NEW_SYSFS_NAMING.
> Then we could have 'sane' sysfs names like 'ata_port', 'ata_link', and 
> 'ata_dev', _and_ would avoid the 'sysfs is ABI and cannot be modified'
> trap.
> 
> Plan would be to send a prep patch to partially revert patch 12, so as 
> to re-introduce the original formatting, but keeping the new accessors.
> And then have an additional patch to introduce the new-style sysfs 
> layout, with the new config option. Which clearly would default to 'n' 
> for now.
> 
> Hmm?

For the ata_xxx_printk() functions, what about something simpler like this:

+#define ata_port_printk(level, ap, fmt, ...)                   \
+       pr_ ## level ("ata%u: " fmt, (ap)->print_id, ##__VA_ARGS__)

 #define ata_port_err(ap, fmt, ...)                             \
-       ata_port_printk(ap, KERN_ERR, fmt, ##__VA_ARGS__)
+       ata_port_printk(err, ap, fmt, ##__VA_ARGS__)
 #define ata_port_warn(ap, fmt, ...)                            \
-       ata_port_printk(ap, KERN_WARNING, fmt, ##__VA_ARGS__)
+       ata_port_printk(warn, ap, fmt, ##__VA_ARGS__)
 #define ata_port_notice(ap, fmt, ...)                          \
-       ata_port_printk(ap, KERN_NOTICE, fmt, ##__VA_ARGS__)
+       ata_port_printk(notice, ap, fmt, ##__VA_ARGS__)
 #define ata_port_info(ap, fmt, ...)                            \
-       ata_port_printk(ap, KERN_INFO, fmt, ##__VA_ARGS__)
+       ata_port_printk(info, ap, fmt, ##__VA_ARGS__)
 #define ata_port_dbg(ap, fmt, ...)                             \
-       ata_port_printk(ap, KERN_DEBUG, fmt, ##__VA_ARGS__)
+       ata_port_printk(debug, ap, fmt, ##__VA_ARGS__)
+
+#define ata_link_printk(level, link, fmt, ...)                 \
+do {                                                           \
+       if (sata_pmp_attached((link)->ap) ||                    \
+           (link)->ap->slave_link)                             \
+               pr_ ## level ("ata%u.%02u: " fmt,               \
+                             (link)->ap->print_id,             \
+                             (link)->pmp,                      \
+                             ##__VA_ARGS__);                   \
+        else                                                   \
+               pr_ ## level ("ata%u: " fmt,                    \
+                             (link)->ap->print_id,             \
+                             ##__VA_ARGS__);                   \
+} while (0)

 #define ata_link_err(link, fmt, ...)                           \
-       ata_link_printk(link, KERN_ERR, fmt, ##__VA_ARGS__)
+       ata_link_printk(err, link, fmt, ##__VA_ARGS__)
 #define ata_link_warn(link, fmt, ...)                          \
-       ata_link_printk(link, KERN_WARNING, fmt, ##__VA_ARGS__)
+       ata_link_printk(warn, link, fmt, ##__VA_ARGS__)
 #define ata_link_notice(link, fmt, ...)                        \
-       ata_link_printk(link, KERN_NOTICE, fmt, ##__VA_ARGS__)
+       ata_link_printk(notice, link, fmt, ##__VA_ARGS__)
 #define ata_link_info(link, fmt, ...)                          \
-       ata_link_printk(link, KERN_INFO, fmt, ##__VA_ARGS__)
+       ata_link_printk(info, link, fmt, ##__VA_ARGS__)
 #define ata_link_dbg(link, fmt, ...)                           \
-       ata_link_printk(link, KERN_DEBUG, fmt, ##__VA_ARGS__)
+       ata_link_printk(debug, link, fmt, ##__VA_ARGS__)
+
+#define ata_dev_printk(level, dev, fmt, ...)                   \
+        pr_ ## level("ata%u.%02u: " fmt,                       \
+               (dev)->link->ap->print_id,                      \
+              (dev)->link->pmp + (dev)->devno,                 \
+              ##__VA_ARGS__)

 #define ata_dev_err(dev, fmt, ...)                             \
-       ata_dev_printk(dev, KERN_ERR, fmt, ##__VA_ARGS__)
+       ata_dev_printk(err, dev, fmt, ##__VA_ARGS__)
 #define ata_dev_warn(dev, fmt, ...)                            \
-       ata_dev_printk(dev, KERN_WARNING, fmt, ##__VA_ARGS__)
+       ata_dev_printk(warn, dev, fmt, ##__VA_ARGS__)
 #define ata_dev_notice(dev, fmt, ...)                          \
-       ata_dev_printk(dev, KERN_NOTICE, fmt, ##__VA_ARGS__)
+       ata_dev_printk(notice, dev, fmt, ##__VA_ARGS__)
 #define ata_dev_info(dev, fmt, ...)                            \
-       ata_dev_printk(dev, KERN_INFO, fmt, ##__VA_ARGS__)
+       ata_dev_printk(info, dev, fmt, ##__VA_ARGS__)
 #define ata_dev_dbg(dev, fmt, ...)                             \
-       ata_dev_printk(dev, KERN_DEBUG, fmt, ##__VA_ARGS__)
+       ata_dev_printk(debug, dev, fmt, ##__VA_ARGS__)

And the remaining of the patch is the same. Instead of dev_xxx() this
uses pr_xxx() so we have the same dynamic debug feature and we preserve
the messages as they were until now.

Thoughts ?

I updated the for-5.17-logging branch with this, adding the following
fixes too:
* Patch 21: we need to use dev_dbg() as we cannot easily get the struct
ata_device for ata_dev_dbg().
* Build-bot warning fixes in drivers/ata/pata_atp867x.c (patch 47) and
also in sata_mv.c (patch 16). I wonder why these 2 show up now... The
warnings should exist already... Very weird.

Will test more next week after restart.

Happy new year !

Cheers.

-- 
Damien Le Moal
Western Digital Research



[Index of Archives]     [Linux Filesystems]     [Linux SCSI]     [Linux RAID]     [Git]     [Kernel Newbies]     [Linux Newbie]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Samba]     [Device Mapper]

  Powered by Linux