linux-hardened/drivers/net/ethernet
willy tarreau 74c41b048d net: mvneta: use per_cpu stats to fix an SMP lock up
Stats writers are mvneta_rx() and mvneta_tx(). They don't lock anything
when they update the stats, and as a result, it randomly happens that
the stats freeze on SMP if two updates happen during stats retrieval.
This is very easily reproducible by starting two HTTP servers and binding
each of them to a different CPU, then consulting /proc/net/dev in loops
during transfers, the interface should immediately lock up. This issue
also randomly happens upon link state changes during transfers, because
the stats are collected in this situation, but it takes more attempts to
reproduce it.

The comments in netdevice.h suggest using per_cpu stats instead to get
rid of this issue.

This patch implements this. It merges both rx_stats and tx_stats into
a single "stats" member with a single syncp. Both mvneta_rx() and
mvneta_rx() now only update the a single CPU's counters.

In turn, mvneta_get_stats64() does the summing by iterating over all CPUs
to get their respective stats.

With this change, stats are still correct and no more lockup is encountered.

Note that this bug was present since the first import of the mvneta
driver.  It might make sense to backport it to some stable trees. If
so, it depends on "d33dc73 net: mvneta: increase the 64-bit rx/tx stats
out of the hot path".

Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Cc: Gregory CLEMENT <gregory.clement@free-electrons.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Tested-by: Arnaud Ebalard <arno@natisbad.org>
Signed-off-by: Willy Tarreau <w@1wt.eu>
Signed-off-by: David S. Miller <davem@davemloft.net>
2014-01-16 15:15:42 -08:00
..
3com drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
8390 drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
adaptec net: starfire: remove unnecessary pci_set_drvdata() 2013-10-18 00:03:28 -04:00
adi net: bfin_mac: do not reset PHY after phy_start() 2013-12-09 20:38:59 -05:00
aeroflex drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
allwinner drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
alteon drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
amd drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
apple macmace: add missing platform_set_drvdata() in mace_probe() 2013-11-11 14:02:08 -05:00
arc Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2014-01-06 17:37:45 -05:00
atheros drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
broadcom drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
brocade bna: Fix build due to missing use of dma_unmap_len_set() 2014-01-06 20:37:41 -05:00
cadence net: macb: Fix build warning 2013-12-11 00:19:17 -05:00
calxeda drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
chelsio drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
cirrus drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
cisco net: enic: slight optimization of addr compare 2013-12-31 16:48:31 -05:00
davicom drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
dec drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
dlink drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
emulex be2net: update driver version to 10.0.x 2014-01-15 15:52:03 -08:00
faraday drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
freescale drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
fujitsu drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
hp hp100: replace hardcoded name in /proc/interrupts with interface name 2013-09-27 17:38:32 -04:00
i825xx drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
ibm drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
icplus drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
intel drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
marvell net: mvneta: use per_cpu stats to fix an SMP lock up 2014-01-16 15:15:42 -08:00
mellanox drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
micrel drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
microchip
moxa drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
myricom net: myri10ge: remove unnecessary pci_set_drvdata() 2013-10-21 17:21:02 -04:00
natsemi drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
neterion net: vxge: slight optimization of addr compare 2013-12-31 16:48:31 -05:00
nuvoton drivers:net: delete premature free_irq 2013-09-04 13:18:19 -04:00
nvidia drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
nxp drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
octeon Merge branch 'for-linus-dma-masks' of git://git.linaro.org/people/rmk/linux-arm 2013-11-14 07:55:21 +09:00
oki-semi ethernet: Fix FSF address in file headers 2013-12-06 12:37:55 -05:00
packetengines net: packetengines: slight optimization of addr 2013-12-31 16:48:32 -05:00
pasemi drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
qlogic drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
rdc drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
realtek drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
renesas drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
seeq drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
sfc sfc: fix sparse non static symbol warning 2013-12-19 15:00:31 -05:00
sgi drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
silan
sis net: sis900: remove unnecessary pci_set_drvdata() 2013-12-09 18:09:28 -05:00
smsc drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
stmicro drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
sun drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
tehuti net: Spelling s/transmition/transmission/ 2014-01-14 17:11:26 -08:00
ti drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
tile Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2014-01-14 14:42:42 -08:00
toshiba drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
tundra drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
via via-velocity: fix netif_receive_skb use in irq disabled section. 2013-11-28 18:43:35 -05:00
wiznet net: w5100: use dev_get_platdata() 2013-08-30 17:43:38 -04:00
xilinx drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
xircom ethernet: Fix FSF address in file headers 2013-12-06 12:37:55 -05:00
xscale ixp4xx_eth: Implement the SIOCGHWTSTAMP ioctl 2013-11-21 17:17:48 +00:00
dnet.c drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
dnet.h
ethoc.c net: ethoc: use dev_get_platdata() 2013-08-30 17:43:35 -04:00
fealnx.c net: fealnx: remove unnecessary pci_set_drvdata() 2013-10-21 17:21:01 -04:00
jme.c net: jme: remove unnecessary pci_set_drvdata() 2013-10-21 17:21:01 -04:00
jme.h jme: Remove unused #define PFX 2013-11-07 02:14:32 -05:00
Kconfig
korina.c drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
lantiq_etop.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2014-01-14 14:42:42 -08:00
Makefile
netx-eth.c ethernet: Fix FSF address in file headers 2013-12-06 12:37:55 -05:00
s6gmac.c drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00