Re: [PATCH 04/40] libata: move ata_{port,link,dev}_dbg to standard dev_XXX() macros

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

 



On 3/24/20 2:26 PM, Geert Uytterhoeven wrote:
>     Hi Hannes,
> 
> On Tue, 3 Mar 2020, Hannes Reinecke wrote:
>> Use standard dev_{dbg,info,notice,warn,err} macros instead of the
>> hand-crafted printk helpers.
>>
>> Signed-off-by: Hannes Reinecke <hare@xxxxxxx>
>> Reviewed-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@xxxxxxxxxxx>
> 
> This is now commit ad9f23bd12e1d721 ("libata: move
> ata_{port,link,dev}_dbg to standard dev_XXX() macros") in
> linux-block/for-next.
> 
> This patch causes an intriguing change in boot messages, adding a space
> at the beginning of each printed line:
> 
>      scsi host0: sata_rcar
>     -ata1: SATA max UDMA/133 irq 117
>     + ata1: SATA max UDMA/133 irq 117
> 
>     -ata1: link resume succeeded after 1 retries
>     + link1: link resume succeeded after 1 retries
> 
>     -ata1: SATA link down (SStatus 0 SControl 300)
>     + link1: SATA link down (SStatus 0 SControl 300)
> 
> It turns out dev_driver_string(&link->tdev) returns an empty string, as
> its driver field is NULL, so __dev_printk() prints the empty string and
> the device name, separated by a space.
> 
> At first I thought this was a bug in rcar-sata, lacking some setup that
> was harmless before, but it turns out other drivers (e.g. pata-falcon)
> show the same issue:
> 
>      scsi host0: pata_falcon
>     -ata1: PATA max PIO4 cmd 0xfff00000 ctl 0xfff00039
>     + ata1: PATA max PIO4 cmd 0xfff00000 ctl 0xfff00039
> 
>     -ata1.01: NODEV after polling detection
>     -ata1.00: ATA-2: Sarge m68k, , max PIO2
>     -ata1.00: 2118816 sectors, multi 0: LBA
>     -ata1.00: configured for PIO
>     + dev1.0: ATA-2: Sarge m68k, , max PIO2
>     + dev1.0: 2118816 sectors, multi 0: LBA
>     + dev1.0: configured for PIO

I'm more worried about change of ATA devices and ATA links names
(unfortunately we cannot change the ones used in libata-transport.c 
as they are a part of ABI exposed through sysfs).

One way to improve the situation is to use transport classes names
for dev_printk() when no other means are available, please see/try
the patch below (compile tested only). It also includes fixup for
extra space issue (change to __dev_printk()).

We should probably consider reverting the commit if the approach
with using transport classes names is not feasible (we should not be
confusing users with names like "dev1.0" instead of "ata1.00" etc.,
sorry for not catching this earlier).

Best regards,
--
Bartlomiej Zolnierkiewicz
Samsung R&D Institute Poland
Samsung Electronics


---
 drivers/ata/libata-transport.c |    3 +++
 drivers/base/core.c            |   14 +++++++++-----
 include/linux/device.h         |    7 ++++++-
 3 files changed, 18 insertions(+), 6 deletions(-)

Index: b/drivers/ata/libata-transport.c
===================================================================
--- a/drivers/ata/libata-transport.c
+++ b/drivers/ata/libata-transport.c
@@ -289,6 +289,7 @@ int ata_tport_add(struct device *parent,
 	ata_host_get(ap->host);
 	dev->release = ata_tport_release;
 	dev_set_name(dev, "ata%d", ap->print_id);
+	dev->tclass = &ata_port_class;
 	transport_setup_device(dev);
 	ata_acpi_bind_port(ap);
 	error = device_add(dev);
@@ -418,6 +419,7 @@ int ata_tlink_add(struct ata_link *link)
 		dev_set_name(dev, "link%d", ap->print_id);
 	else
 		dev_set_name(dev, "link%d.%d", ap->print_id, link->pmp);
+	dev->tclass = &ata_link_class;
 
 	transport_setup_device(dev);
 
@@ -669,6 +671,7 @@ static int ata_tdev_add(struct ata_devic
 		dev_set_name(dev, "dev%d.%d", ap->print_id,ata_dev->devno);
 	else
 		dev_set_name(dev, "dev%d.%d.0", ap->print_id, link->pmp);
+	dev->tclass = &ata_dev_class;
 
 	transport_setup_device(dev);
 	ata_acpi_bind_dev(ata_dev);
Index: b/drivers/base/core.c
===================================================================
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -1225,7 +1225,8 @@ const char *dev_driver_string(const stru
 	drv = READ_ONCE(dev->driver);
 	return drv ? drv->name :
 			(dev->bus ? dev->bus->name :
-			(dev->class ? dev->class->name : ""));
+			 (dev->class ? dev->class->name :
+			  (dev->tclass ? (&dev->tclass->class)->name : "")));
 }
 EXPORT_SYMBOL(dev_driver_string);
 
@@ -3784,10 +3785,13 @@ EXPORT_SYMBOL(dev_printk_emit);
 static void __dev_printk(const char *level, const struct device *dev,
 			struct va_format *vaf)
 {
-	if (dev)
-		dev_printk_emit(level[1] - '0', dev, "%s %s: %pV",
-				dev_driver_string(dev), dev_name(dev), vaf);
-	else
+	if (dev) {
+		const char *drv_str = dev_driver_string(dev);
+
+		dev_printk_emit(level[1] - '0', dev, "%s%s%s: %pV",
+				drv_str, strcmp(drv_str, "") ? " " : "",
+				dev_name(dev), vaf);
+	} else
 		printk("%s(NULL device *): %pV", level, vaf);
 }
 
Index: b/include/linux/device.h
===================================================================
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -29,6 +29,7 @@
 #include <linux/device/bus.h>
 #include <linux/device/class.h>
 #include <linux/device/driver.h>
+#include <linux/transport_class.h>
 #include <asm/device.h>
 
 struct device;
@@ -608,7 +609,11 @@ struct device {
 	spinlock_t		devres_lock;
 	struct list_head	devres_head;
 
-	struct class		*class;
+	union {
+		struct class		*class;
+		struct transport_class	*tclass;
+	};
+
 	const struct attribute_group **groups;	/* optional groups */
 
 	void	(*release)(struct device *dev);



[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