mirror_ubuntu-kernels/drivers/net/ethernet
Alan Brady 96db776a36 i40e/i40evf: fix interrupt affinity bug
There exists a bug in which a 'perfect storm' can occur and cause
interrupts to fail to be correctly affinitized. This causes unexpected
behavior and has a substantial impact on performance when it happens.

The bug occurs if there is heavy traffic, any number of CPUs that have
an i40e interrupt are pegged at 100%, and the interrupt afffinity for
those CPUs is changed.  Instead of moving to the new CPU, the interrupt
continues to be polled while there is heavy traffic.

The bug is most readily realized as the driver is first brought up and
all interrupts start on CPU0. If there is heavy traffic and the
interrupt starts polling before the interrupt is affinitized, the
interrupt will be stuck on CPU0 until traffic stops. The bug, however,
can also be wrought out more simply by affinitizing all the interrupts
to a single CPU and then attempting to move any of those interrupts off
while there is heavy traffic.

This patch fixes the bug by registering for update notifications from
the kernel when the interrupt affinity changes. When that fires, we
cache the intended affinity mask. Then, while polling, if the cpu is
pegged at 100% and we failed to clean the rings, we check to make sure
we have the correct affinity and stop polling if we're firing on the
wrong CPU.  When the kernel successfully moves the interrupt, it will
start polling on the correct CPU. The performance impact is minimal
since the only time this section gets executed is when performance is
already compromised by the CPU.

Change-ID: I4410a880159b9dba1f8297aa72bef36dca34e830
Signed-off-by: Alan Brady <alan.brady@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
2016-10-28 23:28:39 -07:00
..
3com net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
8390 net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
adaptec net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
adi net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
aeroflex net: ethernet: greth: use phy_ethtool_{get|set}_link_ksettings 2016-08-08 15:42:21 -07:00
agere ethernet: use core min/max MTU checking 2016-10-18 11:34:22 -04:00
allwinner net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
alteon ethernet: use net core MTU range checking in more drivers 2016-10-20 14:51:08 -04:00
altera net: eth: altera: Fix error return code in altera_tse_probe() 2016-10-26 17:21:59 -04:00
amazon net: ena: use setup_timer() and mod_timer() 2016-10-26 17:21:59 -04:00
amd amd-xgbe: Fix error return code in xgbe_probe() 2016-10-26 17:21:59 -04:00
apm net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
apple net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
arc net: arc_emac: use dev_kfree_skb_any instead of dev_kfree_skb 2016-10-19 15:16:24 -04:00
atheros ethernet/atheros: use core min/max MTU checking 2016-10-18 11:34:18 -04:00
aurora net: ethernet: nb8800: fix error return code in nb8800_open() 2016-10-17 13:12:05 -04:00
broadcom ethernet: fix min/max MTU typos 2016-10-27 16:18:50 -04:00
brocade ethernet: use core min/max MTU checking 2016-10-18 11:34:22 -04:00
cadence net: macb: Add ethtool get_ringparam and set_ringparam functionality 2016-10-19 15:18:20 -04:00
calxeda ethernet: use core min/max MTU checking 2016-10-18 11:34:22 -04:00
cavium ethernet/cavium: use core min/max MTU checking 2016-10-18 11:34:20 -04:00
chelsio ethernet: use net core MTU range checking in more drivers 2016-10-20 14:51:08 -04:00
cirrus net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
cisco ethernet: use core min/max MTU checking 2016-10-18 11:34:22 -04:00
davicom net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
dec net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
dlink ethernet/dlink: use core min/max MTU checking 2016-10-18 11:34:20 -04:00
emulex ethernet: use net core MTU range checking in more drivers 2016-10-20 14:51:08 -04:00
ezchip Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2016-07-24 00:53:32 -04:00
faraday net/faraday: Stop NCSI device on shutdown 2016-10-04 02:11:51 -04:00
freescale net: fec: drop check for clk==NULL before calling clk_* 2016-10-20 14:20:08 -04:00
fujitsu net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
hisilicon ethernet: use core min/max MTU checking 2016-10-18 11:34:22 -04:00
hp net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
i825xx net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
ibm ethernet: fix min/max MTU typos 2016-10-27 16:18:50 -04:00
intel i40e/i40evf: fix interrupt affinity bug 2016-10-28 23:28:39 -07:00
marvell ethernet: use net core MTU range checking in more drivers 2016-10-20 14:51:08 -04:00
mediatek net: ethernet: mediatek: use dev_kfree_skb_any instead of dev_kfree_skb 2016-10-20 14:47:52 -04:00
mellanox mlxsw: switchx2: Set physical device for port netdevice 2016-10-28 13:45:52 -04:00
micrel ethernet: use core min/max MTU checking 2016-10-18 11:34:22 -04:00
microchip net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
moxa net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
myricom myri10ge: fix typo in parameter description 2016-10-20 14:47:53 -04:00
natsemi net: ns83820: use dev_kfree_skb_irq instead of kfree_skb 2016-10-26 17:21:59 -04:00
neterion ethernet/neterion: use core min/max MTU checking 2016-10-18 11:34:20 -04:00
netronome ethernet: use core min/max MTU checking 2016-10-18 11:34:22 -04:00
nuvoton net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
nvidia ethernet: use core min/max MTU checking 2016-10-18 11:34:22 -04:00
nxp net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
oki-semi ethernet: use core min/max MTU checking 2016-10-18 11:34:22 -04:00
packetengines net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
pasemi ethernet: use core min/max MTU checking 2016-10-18 11:34:22 -04:00
qlogic ethernet: use net core MTU range checking in more drivers 2016-10-20 14:51:08 -04:00
qualcomm ethernet: use net core MTU range checking in more drivers 2016-10-20 14:51:08 -04:00
rdc net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
realtek ethernet/realtek: use core min/max MTU checking 2016-10-18 11:34:20 -04:00
renesas net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
rocker rocker: Flip to the new dev walk API 2016-10-18 11:44:59 -04:00
samsung ethernet: use core min/max MTU checking 2016-10-18 11:34:22 -04:00
seeq net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
sfc ethernet/sfc: use core min/max MTU checking 2016-10-18 14:03:40 -04:00
sgi net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
silan net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
sis net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
smsc net: smc91x: fix neponset breakage by pxa u16 writes 2016-10-20 11:20:57 -04:00
stmicro ethernet: use core min/max MTU checking 2016-10-18 11:34:22 -04:00
sun ethernet/sun: use core min/max MTU checking 2016-10-18 11:34:20 -04:00
synopsys dwc_eth_qos: use dev_kfree_skb_any instead of dev_kfree_skb 2016-10-20 14:47:52 -04:00
tehuti ethernet: use core min/max MTU checking 2016-10-18 11:34:22 -04:00
ti net: netcp: add missing of_node_put() in netcp_probe() 2016-10-26 17:21:59 -04:00
tile ethernet/tile: use core min/max MTU checking 2016-10-18 11:34:21 -04:00
toshiba ethernet/toshiba: use core min/max MTU checking 2016-10-18 11:34:21 -04:00
tundra net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
via ethernet: use core min/max MTU checking 2016-10-18 11:34:22 -04:00
wiznet net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
xilinx ethernet: use net core MTU range checking in more drivers 2016-10-20 14:51:08 -04:00
xircom net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
xscale net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
dnet.c net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
dnet.h net: ethernet: dnet: use phydev from struct net_device 2016-06-28 05:10:26 -04:00
ec_bhf.c net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
ethoc.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2016-07-24 00:53:32 -04:00
fealnx.c net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
jme.c ethernet: use net core MTU range checking in more drivers 2016-10-20 14:51:08 -04:00
jme.h
Kconfig net: ena: Add a driver for Amazon Elastic Network Adapters (ENA) 2016-08-12 17:12:08 -07:00
korina.c net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
lantiq_etop.c net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00
Makefile net: ena: Add a driver for Amazon Elastic Network Adapters (ENA) 2016-08-12 17:12:08 -07:00
netx-eth.c net: deprecate eth_change_mtu, remove usage 2016-10-13 09:36:57 -04:00