3
0
Fork 0
forked from mirrors/linux
kernel/drivers/net/phy
Daniel Golle b1dfc0f762 net: phy: skip LED triggers on PHYs on SFP modules
Calling led_trigger_register() when attaching a PHY located on an SFP
module potentially (and practically) leads into a deadlock.
Fix this by not calling led_trigger_register() for PHYs localted on SFP
modules as such modules actually never got any LEDs.

======================================================
WARNING: possible circular locking dependency detected
6.7.0-rc4-next-20231208+ #0 Tainted: G           O
------------------------------------------------------
kworker/u8:2/43 is trying to acquire lock:
ffffffc08108c4e8 (triggers_list_lock){++++}-{3:3}, at: led_trigger_register+0x4c/0x1a8

but task is already holding lock:
ffffff80c5c6f318 (&sfp->sm_mutex){+.+.}-{3:3}, at: cleanup_module+0x2ba8/0x3120 [sfp]

which lock already depends on the new lock.

the existing dependency chain (in reverse order) is:

-> #3 (&sfp->sm_mutex){+.+.}-{3:3}:
       __mutex_lock+0x88/0x7a0
       mutex_lock_nested+0x20/0x28
       cleanup_module+0x2ae0/0x3120 [sfp]
       sfp_register_bus+0x5c/0x9c
       sfp_register_socket+0x48/0xd4
       cleanup_module+0x271c/0x3120 [sfp]
       platform_probe+0x64/0xb8
       really_probe+0x17c/0x3c0
       __driver_probe_device+0x78/0x164
       driver_probe_device+0x3c/0xd4
       __driver_attach+0xec/0x1f0
       bus_for_each_dev+0x60/0xa0
       driver_attach+0x20/0x28
       bus_add_driver+0x108/0x208
       driver_register+0x5c/0x118
       __platform_driver_register+0x24/0x2c
       init_module+0x28/0xa7c [sfp]
       do_one_initcall+0x70/0x2ec
       do_init_module+0x54/0x1e4
       load_module+0x1b78/0x1c8c
       __do_sys_init_module+0x1bc/0x2cc
       __arm64_sys_init_module+0x18/0x20
       invoke_syscall.constprop.0+0x4c/0xdc
       do_el0_svc+0x3c/0xbc
       el0_svc+0x34/0x80
       el0t_64_sync_handler+0xf8/0x124
       el0t_64_sync+0x150/0x154

-> #2 (rtnl_mutex){+.+.}-{3:3}:
       __mutex_lock+0x88/0x7a0
       mutex_lock_nested+0x20/0x28
       rtnl_lock+0x18/0x20
       set_device_name+0x30/0x130
       netdev_trig_activate+0x13c/0x1ac
       led_trigger_set+0x118/0x234
       led_trigger_write+0x104/0x17c
       sysfs_kf_bin_write+0x64/0x80
       kernfs_fop_write_iter+0x128/0x1b4
       vfs_write+0x178/0x2a4
       ksys_write+0x58/0xd4
       __arm64_sys_write+0x18/0x20
       invoke_syscall.constprop.0+0x4c/0xdc
       do_el0_svc+0x3c/0xbc
       el0_svc+0x34/0x80
       el0t_64_sync_handler+0xf8/0x124
       el0t_64_sync+0x150/0x154

-> #1 (&led_cdev->trigger_lock){++++}-{3:3}:
       down_write+0x4c/0x13c
       led_trigger_write+0xf8/0x17c
       sysfs_kf_bin_write+0x64/0x80
       kernfs_fop_write_iter+0x128/0x1b4
       vfs_write+0x178/0x2a4
       ksys_write+0x58/0xd4
       __arm64_sys_write+0x18/0x20
       invoke_syscall.constprop.0+0x4c/0xdc
       do_el0_svc+0x3c/0xbc
       el0_svc+0x34/0x80
       el0t_64_sync_handler+0xf8/0x124
       el0t_64_sync+0x150/0x154

-> #0 (triggers_list_lock){++++}-{3:3}:
       __lock_acquire+0x12a0/0x2014
       lock_acquire+0x100/0x2ac
       down_write+0x4c/0x13c
       led_trigger_register+0x4c/0x1a8
       phy_led_triggers_register+0x9c/0x214
       phy_attach_direct+0x154/0x36c
       phylink_attach_phy+0x30/0x60
       phylink_sfp_connect_phy+0x140/0x510
       sfp_add_phy+0x34/0x50
       init_module+0x15c/0xa7c [sfp]
       cleanup_module+0x1d94/0x3120 [sfp]
       cleanup_module+0x2bb4/0x3120 [sfp]
       process_one_work+0x1f8/0x4ec
       worker_thread+0x1e8/0x3d8
       kthread+0x104/0x110
       ret_from_fork+0x10/0x20

other info that might help us debug this:

Chain exists of:
  triggers_list_lock --> rtnl_mutex --> &sfp->sm_mutex

 Possible unsafe locking scenario:

       CPU0                    CPU1
       ----                    ----
  lock(&sfp->sm_mutex);
                               lock(rtnl_mutex);
                               lock(&sfp->sm_mutex);
  lock(triggers_list_lock);

 *** DEADLOCK ***

4 locks held by kworker/u8:2/43:
 #0: ffffff80c000f938 ((wq_completion)events_power_efficient){+.+.}-{0:0}, at: process_one_work+0x150/0x4ec
 #1: ffffffc08214bde8 ((work_completion)(&(&sfp->timeout)->work)){+.+.}-{0:0}, at: process_one_work+0x150/0x4ec
 #2: ffffffc0810902f8 (rtnl_mutex){+.+.}-{3:3}, at: rtnl_lock+0x18/0x20
 #3: ffffff80c5c6f318 (&sfp->sm_mutex){+.+.}-{3:3}, at: cleanup_module+0x2ba8/0x3120 [sfp]

stack backtrace:
CPU: 0 PID: 43 Comm: kworker/u8:2 Tainted: G           O       6.7.0-rc4-next-20231208+ #0
Hardware name: Bananapi BPI-R4 (DT)
Workqueue: events_power_efficient cleanup_module [sfp]
Call trace:
 dump_backtrace+0xa8/0x10c
 show_stack+0x14/0x1c
 dump_stack_lvl+0x5c/0xa0
 dump_stack+0x14/0x1c
 print_circular_bug+0x328/0x430
 check_noncircular+0x124/0x134
 __lock_acquire+0x12a0/0x2014
 lock_acquire+0x100/0x2ac
 down_write+0x4c/0x13c
 led_trigger_register+0x4c/0x1a8
 phy_led_triggers_register+0x9c/0x214
 phy_attach_direct+0x154/0x36c
 phylink_attach_phy+0x30/0x60
 phylink_sfp_connect_phy+0x140/0x510
 sfp_add_phy+0x34/0x50
 init_module+0x15c/0xa7c [sfp]
 cleanup_module+0x1d94/0x3120 [sfp]
 cleanup_module+0x2bb4/0x3120 [sfp]
 process_one_work+0x1f8/0x4ec
 worker_thread+0x1e8/0x3d8
 kthread+0x104/0x110
 ret_from_fork+0x10/0x20

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
Fixes: 01e5b728e9 ("net: phy: Add a binding for PHY LEDs")
Link: https://lore.kernel.org/r/102a9dce38bdf00215735d04cd4704458273ad9c.1702339354.git.daniel@makrotopia.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2023-12-15 17:53:42 -08:00
..
mscc net: phy: mscc: macsec: reject PN update requests 2023-10-10 10:30:31 +02:00
adin.c
adin1100.c
amd.c net: phy: amd: Support the Altima AMI101L 2023-10-03 11:44:09 +02:00
aquantia.h
aquantia_hwmon.c
aquantia_main.c
at803x.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2023-08-10 14:10:53 -07:00
ax88796b.c net: phy: fix regression with AX88772A PHY driver 2023-09-19 17:03:44 +02:00
bcm-cygnus.c
bcm-phy-lib.c net: phy: broadcom: Add support for setting LED brightness 2023-06-09 10:38:43 +01:00
bcm-phy-lib.h net: phy: broadcom: Add support for setting LED brightness 2023-06-09 10:38:43 +01:00
bcm-phy-ptp.c net: phy: fill in missing MODULE_DESCRIPTION()s 2023-11-01 21:50:56 -07:00
bcm7xxx.c net: phy: bcm7xxx: Add missing 16nm EPHY statistics 2023-10-18 18:13:13 -07:00
bcm63xx.c
bcm87xx.c net: phy: fill in missing MODULE_DESCRIPTION()s 2023-11-01 21:50:56 -07:00
bcm54140.c
bcm84881.c
broadcom.c net: phy: broadcom: add support for BCM5221 phy 2023-10-06 16:01:27 -07:00
cicada.c
cortina.c
davicom.c
dp83tc811.c
dp83td510.c net: phy: dp83td510: fix kernel stall during netboot in DP83TD510E PHY driver 2023-06-22 19:43:55 -07:00
dp83640.c dp83640: Use list_for_each_entry() helper 2023-08-23 09:39:15 +01:00
dp83640_reg.h
dp83822.c
dp83848.c
dp83867.c net: phy: dp83867: Add support for hardware blinking LEDs 2023-10-06 11:38:19 +01:00
dp83869.c
et1011c.c
fixed_phy.c
icplus.c
intel-xway.c
Kconfig net: phy: amd: Support the Altima AMI101L 2023-10-03 11:44:09 +02:00
linkmode.c
lxt.c
Makefile net: phy: provide phylib stubs for hardware timestamping operations 2023-08-02 19:11:06 -07:00
marvell-88q2xxx.c net: phy: marvell-88q2xxx: add driver for the Marvell 88Q2110 PHY 2023-07-20 12:24:06 +02:00
marvell-88x2222.c net: phy/pcs: Explicitly include correct DT includes 2023-07-26 21:55:37 -07:00
marvell.c net: phy: marvell: Add support for offloading LED blinking 2023-08-10 17:35:00 -07:00
marvell10g.c net: phy: marvell10g: fix 88x3310 power up 2023-07-23 11:47:07 +01:00
mdio-boardinfo.c
mdio-boardinfo.h
mdio-open-alliance.h
mdio_bus.c net: mdio_bus: validate "addr" for mdiobus_is_registered_device() 2023-07-25 20:07:57 -07:00
mdio_device.c
mdio_devres.c
mediatek-ge-soc.c net: phy: mediatek-ge-soc: support PHY LEDs 2023-08-15 18:57:59 -07:00
mediatek-ge.c net: phy: add driver for MediaTek SoC built-in GE PHYs 2023-06-12 11:55:04 +01:00
meson-gxl.c
micrel.c net: phy: micrel: Fix forced link mode for KSZ886X switches 2023-10-20 11:50:46 +01:00
microchip.c
microchip_t1.c
microchip_t1s.c net: phy: microchip_t1s: add support for Microchip LAN865x Rev.B0 PHYs 2023-05-30 11:49:55 +02:00
mii_timestamper.c
motorcomm.c net: phy: motorcomm: Add pad drive strength cfg support 2023-07-24 10:36:45 +01:00
mxl-gpy.c net: phy: mxl-gpy: extend interrupt fix to all impacted variants 2023-06-01 09:59:36 -07:00
national.c
ncn26000.c
nxp-c45-tja11xx.c net: phy: nxp-c45-tja11xx: reset PCS if the link goes down 2023-08-01 21:06:26 -07:00
nxp-cbtx.c
nxp-tja11xx.c net: phy: tja11xx: replace deprecated strncpy with ethtool_sprintf 2023-10-13 17:23:58 -07:00
phy-c45.c net: phy: c45: detect the BASE-T1 speed from the ability register 2023-07-20 12:24:06 +02:00
phy-core.c net: phy: Introduce PSGMII PHY interface mode 2023-08-14 08:12:53 +01:00
phy.c net: phy: fix regression with AX88772A PHY driver 2023-09-19 17:03:44 +02:00
phy_device.c net: phy: skip LED triggers on PHYs on SFP modules 2023-12-15 17:53:42 -08:00
phy_led_triggers.c
phylink.c net: phylink: initialize carrier state at creation 2023-11-07 22:32:23 +00:00
qsemi.c
realtek.c net: phy: realtek: Disable clock on suspend 2023-06-07 09:52:24 +01:00
rockchip.c
sfp-bus.c net: sfp: handle 100G/25G active optical cables in sfp_parse_support 2023-08-19 19:22:14 +01:00
sfp.c net: phy: fill in missing MODULE_DESCRIPTION()s 2023-11-01 21:50:56 -07:00
sfp.h net: sfp: Remove unused function declaration sfp_link_configure() 2023-08-07 08:53:55 +01:00
smsc.c net: phy: smsc: replace deprecated strncpy with ethtool_sprintf 2023-10-16 16:15:00 -07:00
spi_ks8995.c
ste10Xp.c
stubs.c net: phy: provide phylib stubs for hardware timestamping operations 2023-08-02 19:11:06 -07:00
swphy.c
swphy.h
teranetics.c
uPD60620.c
vitesse.c
xilinx_gmii2rgmii.c