linux/drivers/net/ethernet
Thomas Gleixner a53b59ece8 net: enic: Cure the enic api locking trainwreck
enic_dev_wait() has a BUG_ON(in_interrupt()).

Chasing the callers of enic_dev_wait() revealed the gems of enic_reset()
and enic_tx_hang_reset() which are both invoked through work queues in
order to be able to call rtnl_lock(). So far so good.

After locking rtnl both functions acquire enic::enic_api_lock which
serializes against the (ab)use from infiniband. This is where the
trainwreck starts.

enic::enic_api_lock is a spin_lock() which implicitly disables preemption,
but both functions invoke a ton of functions under that lock which can
sleep. The BUG_ON(in_interrupt()) does not trigger in that case because it
can't detect the preempt disabled condition.

This clearly has never been tested with any of the mandatory debug options
for 7+ years, which would have caught that for sure.

Cure it by adding a enic_api_busy member to struct enic, which is modified
and evaluated with enic::enic_api_lock held.

If enic_api_devcmd_proxy_by_index() observes enic::enic_api_busy as true,
it drops enic::enic_api_lock and busy waits for enic::enic_api_busy to
become false.

It would be smarter to wait for a completion of that busy period, but
enic_api_devcmd_proxy_by_index() is called with other spin locks held which
obviously can't sleep.

Remove the BUG_ON(in_interrupt()) check as well because it's incomplete and
with proper debugging enabled the problem would have been caught from the
debug checks in schedule_timeout().

Fixes: 0b038566c0 ("drivers/net: enic: Add an interface for USNIC to interact with firmware")
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
2020-09-29 14:02:53 -07:00
..
3com Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2020-09-04 21:28:59 -07:00
8390 Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2020-09-04 21:28:59 -07:00
adaptec starfire: switch from 'pci_' to 'dma_' API 2020-08-24 17:33:11 -07:00
aeroflex
agere
alacritech treewide: Use fallthrough pseudo-keyword 2020-08-23 17:36:59 -05:00
allwinner net: allwinner: remove redundant irqsave and irqrestore in hardIRQ 2020-09-23 17:33:52 -07:00
alteon net: alteon: convert tasklets to use new tasklet_setup() API 2020-09-14 13:02:37 -07:00
altera
amazon drivers/net/ethernet: remove incorrectly formatted doc 2020-09-25 16:29:00 -07:00
amd net: amd-xgbe: convert tasklets to use new tasklet_setup() API 2020-09-14 13:02:37 -07:00
apm net: xgene: Move shared header file into include/linux 2020-08-27 06:55:50 -07:00
apple
aquantia drivers/net/ethernet: remove incorrectly formatted doc 2020-09-25 16:29:00 -07:00
arc drivers/net/ethernet: add some basic kdoc tags 2020-09-25 16:29:00 -07:00
atheros drivers/net/ethernet: clean up mis-targeted comments 2020-09-25 16:29:00 -07:00
aurora
broadcom bnxt_en: Improve preset max value for ethtool -l. 2020-09-27 13:35:46 -07:00
brocade drivers/net/ethernet: clean up mis-targeted comments 2020-09-25 16:29:00 -07:00
cadence drivers/net/ethernet: clean up mis-targeted comments 2020-09-25 16:29:00 -07:00
calxeda drivers/net/ethernet: clean up mis-targeted comments 2020-09-25 16:29:00 -07:00
cavium drivers/net/ethernet: clean up mis-targeted comments 2020-09-25 16:29:00 -07:00
chelsio cxgb4/ch_ktls: ktls stats are added at port level 2020-09-29 13:57:03 -07:00
cirrus
cisco net: enic: Cure the enic api locking trainwreck 2020-09-29 14:02:53 -07:00
cortina drivers/net/ethernet: clean up mis-targeted comments 2020-09-25 16:29:00 -07:00
davicom treewide: Use fallthrough pseudo-keyword 2020-08-23 17:36:59 -05:00
dec drivers/net/ethernet: clean up unused assignments 2020-09-25 16:29:00 -07:00
dlink net: sundance: convert tasklets to use new tasklet_setup() API 2020-09-14 13:02:37 -07:00
emulex treewide: Use fallthrough pseudo-keyword 2020-08-23 17:36:59 -05:00
ezchip
faraday
freescale dpaa2-mac: Fix potential null pointer dereference 2020-09-25 17:15:37 -07:00
fujitsu
google gve: Enable Link Speed Reporting in the driver. 2020-09-11 14:31:54 -07:00
hisilicon net: hns3: dump tqp enable status in debugfs 2020-09-29 13:14:24 -07:00
huawei devlink: convert flash_update to use params structure 2020-09-25 17:20:57 -07:00
i825xx
ibm ibmvnic: create send_control_ip_offload 2020-09-28 16:06:08 -07:00
intel e1000e: Add support for Meteor Lake 2020-09-28 14:42:46 -07:00
marvell octeontx2-af: add parser support for NAT-T-ESP 2020-09-29 13:12:03 -07:00
mediatek treewide: Use fallthrough pseudo-keyword 2020-08-23 17:36:59 -05:00
mellanox mlxsw: spectrum_ethtool: Expose transceiver_overheat counter 2020-09-27 13:27:01 -07:00
micrel drivers/net/ethernet: clean up mis-targeted comments 2020-09-25 16:29:00 -07:00
microchip drivers/net/ethernet: clean up mis-targeted comments 2020-09-25 16:29:00 -07:00
moxa
mscc net: mscc: ocelot: move NPI port configuration to DSA 2020-09-26 14:17:58 -07:00
myricom net: remove napi_hash_del() from driver-facing API 2020-09-10 13:08:46 -07:00
natsemi drivers/net/ethernet: clean up mis-targeted comments 2020-09-25 16:29:00 -07:00
neterion drivers/net/ethernet: clean up mis-targeted comments 2020-09-25 16:29:00 -07:00
netronome devlink: convert flash_update to use params structure 2020-09-25 17:20:57 -07:00
ni net: nixge: convert tasklets to use new tasklet_setup() API 2020-09-14 13:02:38 -07:00
nvidia
nxp
oki-semi drivers/net/ethernet: clean up mis-targeted comments 2020-09-25 16:29:00 -07:00
packetengines drivers/net/ethernet: clean up mis-targeted comments 2020-09-25 16:29:00 -07:00
pasemi
pensando devlink: convert flash_update to use params structure 2020-09-25 17:20:57 -07:00
qlogic qed/qed_ll2: Replace one-element array with flexible-array member 2020-09-28 18:47:48 -07:00
qualcomm drivers/net/ethernet: clean up mis-targeted comments 2020-09-25 16:29:00 -07:00
rdc
realtek net: realtek: Remove set but not used variable 2020-09-23 13:20:29 -07:00
renesas drivers/net/ethernet: handle one warning explicitly 2020-09-25 16:29:00 -07:00
rocker rocker: switch from 'pci_' to 'dma_' API 2020-09-12 18:26:28 -07:00
samsung drivers/net/ethernet: clean up mis-targeted comments 2020-09-25 16:29:00 -07:00
seeq
sfc drivers/net/ethernet: clean up mis-targeted comments 2020-09-25 16:29:00 -07:00
sgi
silan net: silan: convert tasklets to use new tasklet_setup() API 2020-09-14 13:02:38 -07:00
sis drivers/net/ethernet: clean up mis-targeted comments 2020-09-25 16:29:00 -07:00
smsc net: smc91x: convert tasklets to use new tasklet_setup() API 2020-09-14 13:02:38 -07:00
socionext net: ethernet: ave: Replace alloc_etherdev() with devm_alloc_etherdev() 2020-09-28 12:37:49 -07:00
stmicro stmmac: intel: Adding ref clock 1us tic for LPI cntr 2020-09-28 18:43:57 -07:00
sun drivers/net/ethernet: clean up mis-targeted comments 2020-09-25 16:29:00 -07:00
synopsys drivers/net/ethernet: clean up unused assignments 2020-09-25 16:29:00 -07:00
tehuti drivers/net/ethernet: clean up mis-targeted comments 2020-09-25 16:29:00 -07:00
ti drivers/net/ethernet: clean up mis-targeted comments 2020-09-25 16:29:00 -07:00
toshiba net: tc35815: switch from 'pci_' to 'dma_' API 2020-09-08 20:16:19 -07:00
tundra
via drivers/net/ethernet: clean up mis-targeted comments 2020-09-25 16:29:00 -07:00
wiznet
xilinx drivers/net/ethernet: remove incorrectly formatted doc 2020-09-25 16:29:00 -07:00
xircom treewide: Use fallthrough pseudo-keyword 2020-08-23 17:36:59 -05:00
xscale
dnet.c drivers/net/ethernet: clean up unused assignments 2020-09-25 16:29:00 -07:00
dnet.h
ec_bhf.c
ethoc.c drivers/net/ethernet: clean up mis-targeted comments 2020-09-25 16:29:00 -07:00
fealnx.c
jme.c net: jme: convert tasklets to use new tasklet_setup() API 2020-09-14 13:02:37 -07:00
jme.h
Kconfig
korina.c
lantiq_etop.c
lantiq_xrx200.c net: lantiq: Disable IRQs only if NAPI gets scheduled 2020-09-14 14:53:15 -07:00
Makefile