linux-next/drivers/net
Marek Vasut be0384bf59 net: ks8851: Handle softirqs at the end of IRQ thread to fix hang
The ks8851_irq() thread may call ks8851_rx_pkts() in case there are
any packets in the MAC FIFO, which calls netif_rx(). This netif_rx()
implementation is guarded by local_bh_disable() and local_bh_enable().
The local_bh_enable() may call do_softirq() to run softirqs in case
any are pending. One of the softirqs is net_rx_action, which ultimately
reaches the driver .start_xmit callback. If that happens, the system
hangs. The entire call chain is below:

ks8851_start_xmit_par from netdev_start_xmit
netdev_start_xmit from dev_hard_start_xmit
dev_hard_start_xmit from sch_direct_xmit
sch_direct_xmit from __dev_queue_xmit
__dev_queue_xmit from __neigh_update
__neigh_update from neigh_update
neigh_update from arp_process.constprop.0
arp_process.constprop.0 from __netif_receive_skb_one_core
__netif_receive_skb_one_core from process_backlog
process_backlog from __napi_poll.constprop.0
__napi_poll.constprop.0 from net_rx_action
net_rx_action from __do_softirq
__do_softirq from call_with_stack
call_with_stack from do_softirq
do_softirq from __local_bh_enable_ip
__local_bh_enable_ip from netif_rx
netif_rx from ks8851_irq
ks8851_irq from irq_thread_fn
irq_thread_fn from irq_thread
irq_thread from kthread
kthread from ret_from_fork

The hang happens because ks8851_irq() first locks a spinlock in
ks8851_par.c ks8851_lock_par() spin_lock_irqsave(&ksp->lock, ...)
and with that spinlock locked, calls netif_rx(). Once the execution
reaches ks8851_start_xmit_par(), it calls ks8851_lock_par() again
which attempts to claim the already locked spinlock again, and the
hang happens.

Move the do_softirq() call outside of the spinlock protected section
of ks8851_irq() by disabling BHs around the entire spinlock protected
section of ks8851_irq() handler. Place local_bh_enable() outside of
the spinlock protected section, so that it can trigger do_softirq()
without the ks8851_par.c ks8851_lock_par() spinlock being held, and
safely call ks8851_start_xmit_par() without attempting to lock the
already locked spinlock.

Since ks8851_irq() is protected by local_bh_disable()/local_bh_enable()
now, replace netif_rx() with __netif_rx() which is not duplicating the
local_bh_disable()/local_bh_enable() calls.

Fixes: 797047f875 ("net: ks8851: Implement Parallel bus operations")
Signed-off-by: Marek Vasut <marex@denx.de>
Link: https://lore.kernel.org/r/20240405203204.82062-2-marex@denx.de
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2024-04-08 19:48:48 -07:00
..
arcnet Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2024-02-15 16:20:04 -08:00
bonding Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2024-03-07 10:29:36 -08:00
caif
can can: kvaser_pciefd: Add additional Xilinx interrupts 2024-03-19 15:26:01 +01:00
dsa net: dsa: sja1105: Fix parameters order in sja1110_pcs_mdio_write_c45() 2024-04-04 12:51:45 +02:00
ethernet net: ks8851: Handle softirqs at the end of IRQ thread to fix hang 2024-04-08 19:48:48 -07:00
fddi net: fill in MODULE_DESCRIPTION()s for fddik/skfp 2024-02-15 08:03:46 -08:00
fjes
hamradio
hippi
hyperv hv_netvsc: Register VF in netvsc_probe if NET_DEVICE_REGISTER missed 2024-02-04 13:38:08 +00:00
ieee802154 spi: Updates for v6.9 2024-03-13 11:07:37 -07:00
ipa Power management updates for 6.9-rc1 2024-03-13 11:40:06 -07:00
ipvlan rtnetlink: prepare nla_put_iflink() to run under RCU 2024-02-26 11:46:12 +00:00
mctp
mdio net: phy: mdio-bcm-unimac: Add asp v2.2 support 2024-03-01 09:22:50 +00:00
netdevsim netdevsim: add ndo_get_iflink() implementation 2024-03-01 10:43:10 +00:00
pcs net: pcs: rzn1-miic: update PCS driver to use neg_mode 2024-03-07 20:49:14 -08:00
phy net: phy: micrel: lan8814: Fix when enabling/disabling 1-step timestamping 2024-04-03 19:23:17 -07:00
plip net: fill in MODULE_DESCRIPTION()s for plip 2024-02-15 08:03:46 -08:00
ppp - Kuan-Wei Chiu has developed the well-named series "lib min_heap: Min 2024-03-14 18:03:09 -07:00
pse-pd
slip
team net: team: Don't bother filling in ethtool driver version 2024-02-23 18:03:53 -08:00
thunderbolt
usb net: usb: ax88179_178a: avoid the interface always configured as random address 2024-04-04 09:30:18 -07:00
vmxnet3 vmxnet3: Fix missing reserved tailroom 2024-03-14 12:46:24 +01:00
vxlan vxlan: Remove generic .ndo_get_stats64 2024-03-11 16:01:06 -07:00
wan net: wan: fsl_qmc_hdlc: Fix module compilation 2024-03-18 09:25:58 +00:00
wireguard wireguard: netlink: access device through ctx instead of peer 2024-03-19 11:22:50 +01:00
wireless wireless fixes for v6.9-rc2 2024-03-27 15:39:18 -07:00
wwan net: wwan: t7xx: Split 64bit accesses to fix alignment issues 2024-03-25 19:51:57 -07:00
xen-netback net: fill in MODULE_DESCRIPTION()s for xen-netback 2024-02-15 08:03:45 -08:00
amt.c net: amt: Remove generic .ndo_get_stats64 2024-03-11 15:16:13 -07:00
bareudp.c net: bareudp: Remove generic .ndo_get_stats64 2024-03-04 08:55:44 +00:00
dummy.c net/dummy: Move stats allocation to core 2024-02-21 11:20:56 +00:00
eql.c
geneve.c geneve: fix header validation in geneve[6]_xmit_skb 2024-04-08 11:51:04 +01:00
gtp.c net: gtp: Move net_device assigned in setup 2024-03-06 20:37:18 -08:00
ifb.c
Kconfig
LICENSE.SRC
loopback.c net: add netdev_lockdep_set_classes() to virtual drivers 2024-02-13 18:45:06 -08:00
macsec.c net: macsec: Leverage core stats allocator 2024-03-06 20:36:21 -08:00
macvlan.c rtnetlink: prepare nla_put_iflink() to run under RCU 2024-02-26 11:46:12 +00:00
macvtap.c
Makefile
mdio.c
mhi_net.c
mii.c
net_failover.c
netconsole.c net: netconsole: Add continuation line prefix to userdata messages 2024-03-11 14:07:57 -07:00
netkit.c rtnetlink: prepare nla_put_iflink() to run under RCU 2024-02-26 11:46:12 +00:00
nlmon.c net: nlmon: Simplify nlmon_get_stats64 2024-03-04 10:18:02 +00:00
ntb_netdev.c
rionet.c
sb1000.c
Space.c
sungem_phy.c
tap.c
tun.c net: introduce include/net/rps.h 2024-03-07 21:12:43 -08:00
veth.c net: veth: do not manipulate GRO when using XDP 2024-03-18 12:25:52 +00:00
virtio_net.c virtio_net: Do not send RSS key if it is not supported 2024-04-07 15:43:14 +01:00
vrf.c
vsockmon.c net/vsockmon: Do not set zeroed statistics 2024-02-26 18:39:10 -08:00
xen-netfront.c xen-netfront: Add missing skb_mark_for_recycle 2024-03-28 18:28:12 -07:00