Re: [PATCH] net: dsa: mv88e6xxx: add warning for truncated mdio bus id

From: Florian Fainelli
Date: Wed Mar 20 2024 - 11:13:58 EST




On 3/20/2024 7:33 AM, Josua Mayer wrote:
Am 20.03.24 um 15:09 schrieb Jiri Pirko:
Wed, Mar 20, 2024 at 02:48:55PM CET, josua@xxxxxxxxxxxxx wrote:
mv88e6xxx supports multiple mdio buses as children, e.g. to model both
internal and external phys. If the child buses mdio ids are truncated,
they might collide which each other leading to an obscure error from
kobject_add.

The maximum length of bus id is currently defined as 61
(MII_BUS_ID_SIZE). Truncation can occur on platforms with long node
names and multiple levels before the parent bus on whiich the dsa switch
s/whiich/which/


sits such as on CN9130 [1].

Test whether the return value of snprintf exceeds the maximum bus id
length and print a warning.

[1]
[ 8.324631] mv88e6085 f212a200.mdio-mii:04: switch 0x1760 detected: Marvell 88E6176, revision 1
[ 8.389516] mv88e6085 f212a200.mdio-mii:04: Truncated bus-id may collide.
[ 8.592367] mv88e6085 f212a200.mdio-mii:04: Truncated bus-id may collide.
[ 8.623593] sysfs: cannot create duplicate filename '/devices/platform/cp0/cp0:config-space@f2000000/f212a200.mdio/mdio_bus/f212a200.mdio-mii/f212a200.mdio-mii:04/mdio_bus/!cp0!config-space@f2000000!mdio@12a200!ethernet-switch@4!mdi'
[ 8.785480] kobject: kobject_add_internal failed for !cp0!config-space@f2000000!mdio@12a200!ethernet-switch@4!mdi with -EEXIST, don't try to register things with the same name in the same directory.
[ 8.936514] libphy: mii_bus /cp0/config-space@f2000000/mdio@12a200/ethernet-switch@4/mdi failed to register
[ 8.946300] mdio_bus !cp0!config-space@f2000000!mdio@12a200!ethernet-switch@4!mdi: __mdiobus_register: -22
[ 8.956003] mv88e6085 f212a200.mdio-mii:04: Cannot register MDIO bus (-22)
[ 8.965329] mv88e6085: probe of f212a200.mdio-mii:04 failed with error -22

Signed-off-by: Josua Mayer <josua@xxxxxxxxxxxxx>
This is not bug fix, assume you target net-next. Please:
1) Next time, indicate that in the patch subject like this:
[patch net-next] xxx
2) net-next is currently closed, repost next week.
Correct, thanks - will do.
Just for future reference for those occasional contributors -
is there such a thing as an lkml calendar?

There is this: https://patchwork.hopto.org/net-next.html


---
drivers/net/dsa/mv88e6xxx/chip.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index 614cabb5c1b0..1c40f7631ab1 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -3731,10 +3731,12 @@ static int mv88e6xxx_mdio_register(struct mv88e6xxx_chip *chip,

if (np) {
bus->name = np->full_name;
- snprintf(bus->id, MII_BUS_ID_SIZE, "%pOF", np);
+ if (snprintf(bus->id, MII_BUS_ID_SIZE, "%pOF", np) >= MII_BUS_ID_SIZE)
+ dev_warn(chip->dev, "Truncated bus-id may collide.\n");
How about instead of warn&fail fallback to some different name in this
case?
Duplicate could be avoided by truncating from the start,
however I don't know if that is a good idea.
It affects naming of paths in sysfs, and the root cause is
difficult to spot.
} else {
bus->name = "mv88e6xxx SMI";
- snprintf(bus->id, MII_BUS_ID_SIZE, "mv88e6xxx-%d", index++);
+ if (snprintf(bus->id, MII_BUS_ID_SIZE, "mv88e6xxx-%d", index++) >= MII_BUS_ID_SIZE)
How exactly this may happen?
It can happen on switch nodes at deep levels in the device-tree,
while describing both internal and external mdio buses of a switch.
E.g. Documentation/devicetree/bindings/net/dsa/marvell,mv88e6xxx.yaml

We should consider moving these types of checks into the MDIO bus core, or at least introduce a helper function such that it embeds the check in it.
--
Florian