forked from Minki/linux
46d054f8f5
efx_copy_channel() doesn't correctly clear the napi_hash related state.
This means that when napi_hash_add is called for that channel nothing is
done, and we are left with a copy of the napi_hash_node from the old
channel. When we later call napi_hash_del() on this channel we have a
stale napi_hash_node.
Corruption is only seen when there are multiple entries in one of the
napi_hash lists. This is made more likely by having a very large number
of channels. Testing was carried out with 512 channels - 32 channels on
each of 16 ports.
This failure typically appears as protection faults within napi_by_id()
or napi_hash_add(). efx_copy_channel() is only used when tx or rx ring
sizes are changed (ethtool -G).
Fixes:
|
||
---|---|---|
.. | ||
bitfield.h | ||
ef10_regs.h | ||
ef10_sriov.c | ||
ef10_sriov.h | ||
ef10.c | ||
efx.c | ||
efx.h | ||
enum.h | ||
ethtool.c | ||
falcon_boards.c | ||
falcon.c | ||
farch_regs.h | ||
farch.c | ||
filter.h | ||
io.h | ||
Kconfig | ||
Makefile | ||
mcdi_mon.c | ||
mcdi_pcol.h | ||
mcdi_port.c | ||
mcdi.c | ||
mcdi.h | ||
mdio_10g.c | ||
mdio_10g.h | ||
mtd.c | ||
net_driver.h | ||
nic.c | ||
nic.h | ||
phy.h | ||
ptp.c | ||
qt202x_phy.c | ||
rx.c | ||
selftest.c | ||
selftest.h | ||
siena_sriov.c | ||
siena_sriov.h | ||
siena.c | ||
sriov.c | ||
sriov.h | ||
tenxpress.c | ||
tx.c | ||
txc43128_phy.c | ||
vfdi.h | ||
workarounds.h |