Messages in this thread | ![/](/images/icornerl.gif) | | From | Josua Mayer <> | Subject | Re: [PATCH] net: dsa: mv88e6xxx: add warning for truncated mdio bus id | Date | Wed, 20 Mar 2024 16:41:09 +0000 |
| |
Am 20.03.24 um 17:03 schrieb Jiri Pirko: > Wed, Mar 20, 2024 at 03:33:24PM CET, josua@solid-run.com wrote: >> Am 20.03.24 um 15:09 schrieb Jiri Pirko: >>> Wed, Mar 20, 2024 at 02:48:55PM CET, josua@solid-run.com 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@solid-run.com> >>> 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? >>>> --- >>>> 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, > Read again, my question is about the else branch. Oh! The else case occurs when the switch node does not have a child node named "mdio":
/* Always register one mdio bus for the internal/default mdio
* bus. This maybe represented in the device tree, but is * optional. */ child = of_get_child_by_name(np, "mdio"); err = mv88e6xxx_mdio_register(chip, child, false); of_node_put(child);
In this case child is passed to np as NULL.
For example if we have no "mdio" child node, but do have "mdio-external", the else case creates an mdio bus named "mv88e6xxx-%d".
Then we would end up - in my example - with these two: cp0!config-space@f2000000!mdio@12a200!ethernet-switch@4!mv88e6xxx-0 cp0!config-space@f2000000!mdio@12a200!ethernet-switch@4!mdio-external Truncated to MII_BUS_ID_SIZE: cp0!config-space@f2000000!mdio@12a200!ethernet-switch@4!mv8 cp0!config-space@f2000000!mdio@12a200!ethernet-switch@4!mdi
They are not duplicates, but too close for comfort. Different device may exceed maximum size again.
>> while describing both internal and external mdio buses of a switch. >> E.g. Documentation/devicetree/bindings/net/dsa/marvell,mv88e6xxx.yaml >> >> On CN9130 platform device-tree looks like this: >> >> / { >> cp0 { >> config-space@f2000000 { >> mdio@12a200 { >> ethernet-switch@4 { >> mdio { ... }; >> mdio-external { ... }; >> }; >> }; >> }; >> }; >> }; >> >> For mdio-external child all the names alone, without separators, >> make up 66 characters, exceeding: MII_BUS_ID_SIZE: >> cp0config-space@f2000000mdio@12a200ethernet-switch@4mdio-external >> >> With separators ('!') we have: >> cp0!config-space@f2000000!mdio@12a200!ethernet-switch@4!mdio >> cp0!config-space@f2000000!mdio@12a200!ethernet-switch@4!mdio-external >> Truncated to MII_BUS_ID_SIZE: >> cp0!config-space@f2000000!mdio@12a200!ethernet-switch@4!mdi >> cp0!config-space@f2000000!mdio@12a200!ethernet-switch@4!mdi >> They become duplicates. >> >>>> + dev_warn(chip->dev, "Truncated bus-id may collide.\n"); >> Another option (imo) is to force the issue and return error code. >> Then the only way out would be increase of MII_BUS_ID_SIZE. >>>> } >>>> >>>> bus->read = mv88e6xxx_mdio_read; >>>> >>>> --- >>>> base-commit: e8f897f4afef0031fe618a8e94127a0934896aba >>>> change-id: 20240320-mv88e6xxx-truncate-busid-34a1d2769bbf >>>> >>>> Sincerely, >>>> -- >>>> Josua Mayer <josua@solid-run.com> >>>> >>>>
| ![\](/images/icornerr.gif) |