[PATCH] powerpc/pseries: remove returning ENODEV when uevent is triggered

Subsystems: linux for powerpc (32-bit and 64-bit), the rest

STALE900d

5 messages, 2 authors, 2024-04-11 · open the first message on its own page

[PATCH] powerpc/pseries: remove returning ENODEV when uevent is triggered

From: Lidong Zhong <hidden>
Date: 2024-03-23 23:13:30

We have noticed the following nuisance messages during boot

[    7.120610][ T1060] vio vio: uevent: failed to send synthetic uevent
[    7.122281][ T1060] vio 4000: uevent: failed to send synthetic uevent
[    7.122304][ T1060] vio 4001: uevent: failed to send synthetic uevent
[    7.122324][ T1060] vio 4002: uevent: failed to send synthetic uevent
[    7.122345][ T1060] vio 4004: uevent: failed to send synthetic uevent

It's caused by either vio_register_device_node() failed to set dev->of_node or
the missing "compatible" property. Try return as much information as possible
instead of a failure. The above annoying errors can also be removed
after the patch applied.

Signed-off-by: Lidong Zhong <redacted>
---
 arch/powerpc/platforms/pseries/vio.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/arch/powerpc/platforms/pseries/vio.c b/arch/powerpc/platforms/pseries/vio.c
index 90ff85c879bf..62961715ca24 100644
--- a/arch/powerpc/platforms/pseries/vio.c
+++ b/arch/powerpc/platforms/pseries/vio.c
@@ -1593,12 +1593,13 @@ static int vio_hotplug(const struct device *dev, struct kobj_uevent_env *env)
 
 	dn = dev->of_node;
 	if (!dn)
-		return -ENODEV;
+		goto out;
 	cp = of_get_property(dn, "compatible", NULL);
 	if (!cp)
-		return -ENODEV;
-
-	add_uevent_var(env, "MODALIAS=vio:T%sS%s", vio_dev->type, cp);
+		add_uevent_var(env, "MODALIAS=vio:T%s", vio_dev->type);
+    else
+		add_uevent_var(env, "MODALIAS=vio:T%sS%s", vio_dev->type, cp);
+out:
 	return 0;
 }
 
-- 
2.35.3

Re: [PATCH] powerpc/pseries: remove returning ENODEV when uevent is triggered

From: Lidong Zhong <hidden>
Date: 2024-04-09 01:20:06

Hi Michael,

Could you share your opinion about this patch please?

Thanks,
Lidong

On Sat, Mar 23, 2024 at 4:47 PM Lidong Zhong [off-list ref] wrote:
quoted hunk
We have noticed the following nuisance messages during boot

[    7.120610][ T1060] vio vio: uevent: failed to send synthetic uevent
[    7.122281][ T1060] vio 4000: uevent: failed to send synthetic uevent
[    7.122304][ T1060] vio 4001: uevent: failed to send synthetic uevent
[    7.122324][ T1060] vio 4002: uevent: failed to send synthetic uevent
[    7.122345][ T1060] vio 4004: uevent: failed to send synthetic uevent

It's caused by either vio_register_device_node() failed to set
dev->of_node or
the missing "compatible" property. Try return as much information as
possible
instead of a failure. The above annoying errors can also be removed
after the patch applied.

Signed-off-by: Lidong Zhong <redacted>
---
 arch/powerpc/platforms/pseries/vio.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/arch/powerpc/platforms/pseries/vio.c
b/arch/powerpc/platforms/pseries/vio.c
index 90ff85c879bf..62961715ca24 100644
--- a/arch/powerpc/platforms/pseries/vio.c
+++ b/arch/powerpc/platforms/pseries/vio.c
@@ -1593,12 +1593,13 @@ static int vio_hotplug(const struct device *dev,
struct kobj_uevent_env *env)

        dn = dev->of_node;
        if (!dn)
-               return -ENODEV;
+               goto out;
        cp = of_get_property(dn, "compatible", NULL);
        if (!cp)
-               return -ENODEV;
-
-       add_uevent_var(env, "MODALIAS=vio:T%sS%s", vio_dev->type, cp);
+               add_uevent_var(env, "MODALIAS=vio:T%s", vio_dev->type);
+    else
+               add_uevent_var(env, "MODALIAS=vio:T%sS%s", vio_dev->type,
cp);
+out:
        return 0;
 }

--
2.35.3
-- 
Regards,
Lidong Zhong

Re: [PATCH] powerpc/pseries: remove returning ENODEV when uevent is triggered

From: Michael Ellerman <mpe@ellerman.id.au>
Date: 2024-04-09 08:46:51

Hi Lidong,

Thanks for the patch.

I'm not an expert on udev etc. so apologies if any of these questions
are stupid.

Lidong Zhong [off-list ref] writes:
We have noticed the following nuisance messages during boot

[    7.120610][ T1060] vio vio: uevent: failed to send synthetic uevent
[    7.122281][ T1060] vio 4000: uevent: failed to send synthetic uevent
[    7.122304][ T1060] vio 4001: uevent: failed to send synthetic uevent
[    7.122324][ T1060] vio 4002: uevent: failed to send synthetic uevent
[    7.122345][ T1060] vio 4004: uevent: failed to send synthetic uevent

It's caused by either vio_register_device_node() failed to set dev->of_node or
the missing "compatible" property. Try return as much information as possible
instead of a failure.
Does udev etc. cope with that? Can we just change the content of the
MODALIAS value like that?

With this patch we'll start emitting uevents for devices we previously
didn't. I guess that's OK because nothing is expecting them?

Can you include a log of udev showing the event firing and that nothing
breaks.

On my system here I see nothing matches the devices except for libvpd,
which seems to match lots of things.
quoted hunk
diff --git a/arch/powerpc/platforms/pseries/vio.c b/arch/powerpc/platforms/pseries/vio.c
index 90ff85c879bf..62961715ca24 100644
--- a/arch/powerpc/platforms/pseries/vio.c
+++ b/arch/powerpc/platforms/pseries/vio.c
@@ -1593,12 +1593,13 @@ static int vio_hotplug(const struct device *dev, struct kobj_uevent_env *env)
 
 	dn = dev->of_node;
 	if (!dn)
-		return -ENODEV;
+		goto out;
 	cp = of_get_property(dn, "compatible", NULL);
 	if (!cp)
-		return -ENODEV;
-
-	add_uevent_var(env, "MODALIAS=vio:T%sS%s", vio_dev->type, cp);
+		add_uevent_var(env, "MODALIAS=vio:T%s", vio_dev->type);
If it's OK to skip the compatible property then we don't need the
of_node at all, and we could always emit this, even when of_node is not
available.
+    else
+		add_uevent_var(env, "MODALIAS=vio:T%sS%s", vio_dev->type, cp);
+out:
 	return 0;
 }
I think we also should update the vio modalias_show() to follow the same
logic, otherwise the uevent MODALIAS value and the modalias file won't
match which is confusing.

Preferably vio_hotplug() and modalias_show() would just call a common
helper.

cheers

Re: [PATCH] powerpc/pseries: remove returning ENODEV when uevent is triggered

From: Lidong Zhong <hidden>
Date: 2024-04-10 01:54:21

Hi Michael,

Thanks for your reply.

On Tue, Apr 9, 2024 at 4:46 PM Michael Ellerman [off-list ref] wrote:
Hi Lidong,

Thanks for the patch.

I'm not an expert on udev etc. so apologies if any of these questions
are stupid.

Lidong Zhong [off-list ref] writes:
quoted
We have noticed the following nuisance messages during boot

[    7.120610][ T1060] vio vio: uevent: failed to send synthetic uevent
[    7.122281][ T1060] vio 4000: uevent: failed to send synthetic uevent
[    7.122304][ T1060] vio 4001: uevent: failed to send synthetic uevent
[    7.122324][ T1060] vio 4002: uevent: failed to send synthetic uevent
[    7.122345][ T1060] vio 4004: uevent: failed to send synthetic uevent

It's caused by either vio_register_device_node() failed to set
dev->of_node or
quoted
the missing "compatible" property. Try return as much information as
possible
quoted
instead of a failure.
Does udev etc. cope with that? Can we just change the content of the
MODALIAS value like that?

With this patch we'll start emitting uevents for devices we previously
didn't. I guess that's OK because nothing is expecting them?

Can you include a log of udev showing the event firing and that nothing
breaks.

On my system here I see nothing matches the devices except for libvpd,
which seems to match lots of things.
It's an issue reported by our customer. I am sorry I can't provide more
information because I  don't have the environment
to reproduce this issue. The only related log I got is shown below:

Feb 07 14:08:03 rb3i0060 udevadm[623]: vio: Failed to write 'add' to
'/sys/devices/vio/uevent', ignoring: No such device

Feb 07 14:08:03 rb3i0060 kernel: synth uevent: /devices/vio: failed to send
uevent

Feb 07 14:08:03 rb3i0060 kernel: vio vio: uevent: failed to send synthetic
uevent

Feb 07 14:08:03 rb3i0060 kernel: synth uevent: /devices/vio/4000: failed to
send uevent

Feb 07 14:08:03 rb3i0060 kernel: vio 4000: uevent: failed to send synthetic
uevent

Feb 07 14:08:03 rb3i0060 kernel: synth uevent: /devices/vio/4001: failed to
send uevent

Feb 07 14:08:03 rb3i0060 kernel: vio 4001: uevent: failed to send synthetic
uevent

Feb 07 14:08:03 rb3i0060 kernel: synth uevent: /devices/vio/4002: failed to
send uevent

Feb 07 14:08:03 rb3i0060 kernel: vio 4002: uevent: failed to send synthetic
uevent

Feb 07 14:08:03 rb3i0060 kernel: synth uevent: /devices/vio/4004: failed to
send uevent

Feb 07 14:08:03 rb3i0060 kernel: vio 4004: uevent: failed to send synthetic
uevent

Feb 07 14:08:03 rb3i0060 udevadm[623]: 4000: Failed to write 'add' to
'/sys/devices/vio/4000/uevent', ignoring: No such device

Feb 07 14:08:03 rb3i0060 udevadm[623]: 4001: Failed to write 'add' to
'/sys/devices/vio/4001/uevent', ignoring: No such device

Feb 07 14:08:03 rb3i0060 udevadm[623]: 4002: Failed to write 'add' to
'/sys/devices/vio/4002/uevent', ignoring: No such device

Feb 07 14:08:03 rb3i0060 udevadm[623]: 4004: Failed to write 'add' to
'/sys/devices/vio/4004/uevent', ignoring: No such device

systemd-udev-trigger service calls 'udevadm trigger --type=devices
--action=add' and kernel returns -ENODEV because either
dev->of_node is NULL or 'compatible' property is not present.  Similar
cases were already reported after some search, for example
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1827162
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1845319
I don't think it causes real problems but confusion to users.

quoted
diff --git a/arch/powerpc/platforms/pseries/vio.c
b/arch/powerpc/platforms/pseries/vio.c
quoted
index 90ff85c879bf..62961715ca24 100644
--- a/arch/powerpc/platforms/pseries/vio.c
+++ b/arch/powerpc/platforms/pseries/vio.c
@@ -1593,12 +1593,13 @@ static int vio_hotplug(const struct device *dev,
struct kobj_uevent_env *env)
quoted
      dn = dev->of_node;
      if (!dn)
-             return -ENODEV;
+             goto out;
      cp = of_get_property(dn, "compatible", NULL);
      if (!cp)
-             return -ENODEV;
-
-     add_uevent_var(env, "MODALIAS=vio:T%sS%s", vio_dev->type, cp);
+             add_uevent_var(env, "MODALIAS=vio:T%s", vio_dev->type);
If it's OK to skip the compatible property then we don't need the
of_node at all, and we could always emit this, even when of_node is not
available.
You mean something like this?
@@ -1592,13 +1592,10 @@ static int vio_hotplug(const struct device *dev,
struct kobj_uevent_env *env)
        const char *cp;

        dn = dev->of_node;
-       if (!dn)
-               return -ENODEV;
-       cp = of_get_property(dn, "compatible", NULL);
-       if (!cp)
-               return -ENODEV;
-
-       add_uevent_var(env, "MODALIAS=vio:T%sS%s", vio_dev->type, cp);
+       if (dn && (cp = of_get_property(dn, "compatible", NULL))
+               add_uevent_var(env, "MODALIAS=vio:T%sS%s", vio_dev->type,
cp);
+       else
+               add_uevent_var(env, "MODALIAS=vio:T%s", vio_dev->type);
        return 0;

quoted
+    else
+             add_uevent_var(env, "MODALIAS=vio:T%sS%s", vio_dev->type,
cp);
quoted
+out:
      return 0;
 }
I think we also should update the vio modalias_show() to follow the same
logic, otherwise the uevent MODALIAS value and the modalias file won't
match which is confusing.

Preferably vio_hotplug() and modalias_show() would just call a common
helper.

cheers
Thanks for the suggestion. I'll send a v2 patch.


-- 
Regards,
Lidong Zhong

Re: [PATCH] powerpc/pseries: remove returning ENODEV when uevent is triggered

From: Lidong Zhong <hidden>
Date: 2024-04-11 02:12:21

Hi Michael,

After checking the definition of modalias in modalias_show(), I think it's
better to keep the
same logic in vio_hotplug(), that's removing the else part in my original
patch shown below.
+       if (dn && (cp = of_get_property(dn, "compatible", NULL))
+               add_uevent_var(env, "MODALIAS=vio:T%sS%s", vio_dev->type,
cp);
+       else
+               add_uevent_var(env, "MODALIAS=vio:T%s", vio_dev->type);
I think we can avoid some possible regression then. I'll make the change in
my v2 patch.

--
Regards,
Lidong Zhong

On Wed, Apr 10, 2024 at 9:25 AM Lidong Zhong [off-list ref] wrote:
quoted hunk
Hi Michael,

Thanks for your reply.

On Tue, Apr 9, 2024 at 4:46 PM Michael Ellerman [off-list ref]
wrote:
quoted
Hi Lidong,

Thanks for the patch.

I'm not an expert on udev etc. so apologies if any of these questions
are stupid.

Lidong Zhong [off-list ref] writes:
quoted
We have noticed the following nuisance messages during boot

[    7.120610][ T1060] vio vio: uevent: failed to send synthetic uevent
[    7.122281][ T1060] vio 4000: uevent: failed to send synthetic uevent
[    7.122304][ T1060] vio 4001: uevent: failed to send synthetic uevent
[    7.122324][ T1060] vio 4002: uevent: failed to send synthetic uevent
[    7.122345][ T1060] vio 4004: uevent: failed to send synthetic uevent

It's caused by either vio_register_device_node() failed to set
dev->of_node or
quoted
the missing "compatible" property. Try return as much information as
possible
quoted
instead of a failure.
Does udev etc. cope with that? Can we just change the content of the
MODALIAS value like that?

With this patch we'll start emitting uevents for devices we previously
didn't. I guess that's OK because nothing is expecting them?

Can you include a log of udev showing the event firing and that nothing
breaks.

On my system here I see nothing matches the devices except for libvpd,
which seems to match lots of things.
It's an issue reported by our customer. I am sorry I can't provide more
information because I  don't have the environment
to reproduce this issue. The only related log I got is shown below:

Feb 07 14:08:03 rb3i0060 udevadm[623]: vio: Failed to write 'add' to
'/sys/devices/vio/uevent', ignoring: No such device

Feb 07 14:08:03 rb3i0060 kernel: synth uevent: /devices/vio: failed to
send uevent

Feb 07 14:08:03 rb3i0060 kernel: vio vio: uevent: failed to send synthetic
uevent

Feb 07 14:08:03 rb3i0060 kernel: synth uevent: /devices/vio/4000: failed
to send uevent

Feb 07 14:08:03 rb3i0060 kernel: vio 4000: uevent: failed to send
synthetic uevent

Feb 07 14:08:03 rb3i0060 kernel: synth uevent: /devices/vio/4001: failed
to send uevent

Feb 07 14:08:03 rb3i0060 kernel: vio 4001: uevent: failed to send
synthetic uevent

Feb 07 14:08:03 rb3i0060 kernel: synth uevent: /devices/vio/4002: failed
to send uevent

Feb 07 14:08:03 rb3i0060 kernel: vio 4002: uevent: failed to send
synthetic uevent

Feb 07 14:08:03 rb3i0060 kernel: synth uevent: /devices/vio/4004: failed
to send uevent

Feb 07 14:08:03 rb3i0060 kernel: vio 4004: uevent: failed to send
synthetic uevent

Feb 07 14:08:03 rb3i0060 udevadm[623]: 4000: Failed to write 'add' to
'/sys/devices/vio/4000/uevent', ignoring: No such device

Feb 07 14:08:03 rb3i0060 udevadm[623]: 4001: Failed to write 'add' to
'/sys/devices/vio/4001/uevent', ignoring: No such device

Feb 07 14:08:03 rb3i0060 udevadm[623]: 4002: Failed to write 'add' to
'/sys/devices/vio/4002/uevent', ignoring: No such device

Feb 07 14:08:03 rb3i0060 udevadm[623]: 4004: Failed to write 'add' to
'/sys/devices/vio/4004/uevent', ignoring: No such device

systemd-udev-trigger service calls 'udevadm trigger --type=devices
--action=add' and kernel returns -ENODEV because either
dev->of_node is NULL or 'compatible' property is not present.  Similar
cases were already reported after some search, for example
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1827162
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1845319
I don't think it causes real problems but confusion to users.

quoted
quoted
diff --git a/arch/powerpc/platforms/pseries/vio.c
b/arch/powerpc/platforms/pseries/vio.c
quoted
index 90ff85c879bf..62961715ca24 100644
--- a/arch/powerpc/platforms/pseries/vio.c
+++ b/arch/powerpc/platforms/pseries/vio.c
@@ -1593,12 +1593,13 @@ static int vio_hotplug(const struct device
*dev, struct kobj_uevent_env *env)
quoted
      dn = dev->of_node;
      if (!dn)
-             return -ENODEV;
+             goto out;
      cp = of_get_property(dn, "compatible", NULL);
      if (!cp)
-             return -ENODEV;
-
-     add_uevent_var(env, "MODALIAS=vio:T%sS%s", vio_dev->type, cp);
+             add_uevent_var(env, "MODALIAS=vio:T%s", vio_dev->type);
If it's OK to skip the compatible property then we don't need the
of_node at all, and we could always emit this, even when of_node is not
available.
You mean something like this?
@@ -1592,13 +1592,10 @@ static int vio_hotplug(const struct device *dev,
struct kobj_uevent_env *env)
        const char *cp;

        dn = dev->of_node;
-       if (!dn)
-               return -ENODEV;
-       cp = of_get_property(dn, "compatible", NULL);
-       if (!cp)
-               return -ENODEV;
-
-       add_uevent_var(env, "MODALIAS=vio:T%sS%s", vio_dev->type, cp);
+       if (dn && (cp = of_get_property(dn, "compatible", NULL))
+               add_uevent_var(env, "MODALIAS=vio:T%sS%s", vio_dev->type,
cp);
+       else
+               add_uevent_var(env, "MODALIAS=vio:T%s", vio_dev->type);
        return 0;

quoted
quoted
+    else
+             add_uevent_var(env, "MODALIAS=vio:T%sS%s", vio_dev->type,
cp);
quoted
+out:
      return 0;
 }
I think we also should update the vio modalias_show() to follow the same
logic, otherwise the uevent MODALIAS value and the modalias file won't
match which is confusing.

Preferably vio_hotplug() and modalias_show() would just call a common
helper.

cheers
Thanks for the suggestion. I'll send a v2 patch.


--
Regards,
Lidong Zhong
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help