mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-22 12:46:41 +07:00
8a87fca8dd
phy_attach_direct() ignores errors returned by
phy_led_triggers_register(). I think that's OK, as LED triggers can be
considered a non-critical feature.
However, this causes problems later:
- phy_led_trigger_change_speed() will access the array
phy_device.phy_led_triggers, which has been freed in the error path
of phy_led_triggers_register(), which may lead to a crash.
- phy_led_triggers_unregister() will access the same array, leading to
crashes during s2ram or poweroff, like:
Unable to handle kernel NULL pointer dereference at virtual address
00000000
...
[<c04116d4>] (__list_del_entry_valid) from [<c05e8948>] (led_trigger_unregister+0x34/0xcc)
[<c05e8948>] (led_trigger_unregister) from [<c05336c4>] (phy_led_triggers_unregister+0x28/0x34)
[<c05336c4>] (phy_led_triggers_unregister) from [<c0531d44>] (phy_detach+0x30/0x74)
[<c0531d44>] (phy_detach) from [<c0538bdc>] (sh_eth_close+0x64/0x9c)
[<c0538bdc>] (sh_eth_close) from [<c04d4ce0>] (dpm_run_callback+0x48/0xc8)
or:
list_del corruption. prev->next should be dede6540, but was 2e323931
------------[ cut here ]------------
kernel BUG at lib/list_debug.c:52!
...
[<c02f6d70>] (__list_del_entry_valid) from [<c0425168>] (led_trigger_unregister+0x34/0xcc)
[<c0425168>] (led_trigger_unregister) from [<c03a05a0>] (phy_led_triggers_unregister+0x28/0x34)
[<c03a05a0>] (phy_led_triggers_unregister) from [<c039ec04>] (phy_detach+0x30/0x74)
[<c039ec04>] (phy_detach) from [<c03a4fc0>] (sh_eth_close+0x6c/0xa4)
[<c03a4fc0>] (sh_eth_close) from [<c0483234>] (__dev_close_many+0xac/0xd0)
To fix this, clear phy_device.phy_num_led_triggers in the error path of
phy_led_triggers_register() fails.
Note that the "No phy led trigger registered for speed" message will
still be printed on link speed changes, which is a good cue that
something went wrong with the LED triggers.
Fixes:
|
||
---|---|---|
.. | ||
amd.c | ||
aquantia.c | ||
at803x.c | ||
bcm7xxx.c | ||
bcm63xx.c | ||
bcm87xx.c | ||
bcm-cygnus.c | ||
bcm-phy-lib.c | ||
bcm-phy-lib.h | ||
broadcom.c | ||
cicada.c | ||
davicom.c | ||
dp83640_reg.h | ||
dp83640.c | ||
dp83848.c | ||
dp83867.c | ||
et1011c.c | ||
fixed_phy.c | ||
icplus.c | ||
intel-xway.c | ||
Kconfig | ||
lxt.c | ||
Makefile | ||
marvell.c | ||
mdio_bus.c | ||
mdio_device.c | ||
mdio-bcm-iproc.c | ||
mdio-bcm-unimac.c | ||
mdio-bitbang.c | ||
mdio-cavium.c | ||
mdio-cavium.h | ||
mdio-gpio.c | ||
mdio-hisi-femac.c | ||
mdio-moxart.c | ||
mdio-mux-bcm-iproc.c | ||
mdio-mux-gpio.c | ||
mdio-mux-mmioreg.c | ||
mdio-mux.c | ||
mdio-octeon.c | ||
mdio-sun4i.c | ||
mdio-thunder.c | ||
mdio-xgene.c | ||
mdio-xgene.h | ||
meson-gxl.c | ||
micrel.c | ||
microchip.c | ||
mscc.c | ||
national.c | ||
phy_device.c | ||
phy_led_triggers.c | ||
phy.c | ||
qsemi.c | ||
realtek.c | ||
smsc.c | ||
spi_ks8995.c | ||
ste10Xp.c | ||
swphy.c | ||
swphy.h | ||
teranetics.c | ||
vitesse.c | ||
xilinx_gmii2rgmii.c |