linux_dsm_epyc7002/drivers/net/ethernet/broadcom
Florian Fainelli 7095c97345 net: systemport: Fix 64-bit stats deadlock
We can enter a deadlock situation because there is no sufficient protection
when ndo_get_stats64() runs in process context to guard against RX or TX NAPI
contexts running in softirq, this can lead to the following lockdep splat and
actual deadlock was experienced as well with an iperf session in the background
and a while loop doing ifconfig + ethtool.

[    5.780350] ================================
[    5.784679] WARNING: inconsistent lock state
[    5.789011] 4.13.0-rc7-02179-g32fae27c725d #70 Not tainted
[    5.794561] --------------------------------
[    5.798890] inconsistent {SOFTIRQ-ON-W} -> {IN-SOFTIRQ-W} usage.
[    5.804971] swapper/0/0 [HC0[0]:SC1[1]:HE0:SE0] takes:
[    5.810175]  (&syncp->seq#2){+.?...}, at: [<c0768a28>] bcm_sysport_tx_reclaim+0x30/0x54
[    5.818327] {SOFTIRQ-ON-W} state was registered at:
[    5.823278]   bcm_sysport_get_stats64+0x17c/0x258
[    5.828053]   dev_get_stats+0x38/0xac
[    5.831776]   rtnl_fill_stats+0x30/0x118
[    5.835761]   rtnl_fill_ifinfo+0x538/0xe24
[    5.839921]   rtmsg_ifinfo_build_skb+0x6c/0xd8
[    5.844430]   rtmsg_ifinfo_event.part.5+0x14/0x44
[    5.849201]   rtmsg_ifinfo+0x20/0x28
[    5.852837]   register_netdevice+0x628/0x6b8
[    5.857171]   register_netdev+0x14/0x24
[    5.861051]   bcm_sysport_probe+0x30c/0x438
[    5.865280]   platform_drv_probe+0x50/0xb0
[    5.869418]   driver_probe_device+0x2e8/0x450
[    5.873817]   __driver_attach+0x104/0x120
[    5.877871]   bus_for_each_dev+0x7c/0xc0
[    5.881834]   bus_add_driver+0x1b0/0x270
[    5.885797]   driver_register+0x78/0xf4
[    5.889675]   do_one_initcall+0x54/0x190
[    5.893646]   kernel_init_freeable+0x144/0x1d0
[    5.898135]   kernel_init+0x8/0x110
[    5.901665]   ret_from_fork+0x14/0x2c
[    5.905363] irq event stamp: 24263
[    5.908804] hardirqs last  enabled at (24262): [<c08eecf0>] net_rx_action+0xc4/0x4e4
[    5.916624] hardirqs last disabled at (24263): [<c0a7da00>] _raw_spin_lock_irqsave+0x1c/0x98
[    5.925143] softirqs last  enabled at (24258): [<c022a7fc>] irq_enter+0x84/0x98
[    5.932524] softirqs last disabled at (24259): [<c022a918>] irq_exit+0x108/0x16c
[    5.939985]
[    5.939985] other info that might help us debug this:
[    5.946576]  Possible unsafe locking scenario:
[    5.946576]
[    5.952556]        CPU0
[    5.955031]        ----
[    5.957506]   lock(&syncp->seq#2);
[    5.960955]   <Interrupt>
[    5.963604]     lock(&syncp->seq#2);
[    5.967227]
[    5.967227]  *** DEADLOCK ***
[    5.967227]
[    5.973222] 1 lock held by swapper/0/0:
[    5.977092]  #0:  (&(&ring->lock)->rlock){..-...}, at: [<c0768a18>] bcm_sysport_tx_reclaim+0x20/0x54

So just remove the u64_stats_update_begin()/end() pair in ndo_get_stats64()
since it does not appear to be useful for anything. No inconsistency was
observed with either ifconfig or ethtool, global TX counts equal the sum of
per-queue TX counts on a 32-bit architecture.

Fixes: 10377ba767 ("net: systemport: Support 64bit statistics")
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2017-09-15 14:24:10 -07:00
..
bnx2x net: sched: get rid of struct tc_to_netdev 2017-08-07 09:42:37 -07:00
bnxt Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2017-09-01 17:42:05 -07:00
genet Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2017-09-01 17:42:05 -07:00
b44.c b44: Initialize 64-bit stats seqcount 2017-08-01 20:06:06 -07:00
b44.h net: ethernet: broadcom: b44: use phydev from struct net_device 2016-09-19 21:39:11 -04:00
bcm63xx_enet.c net: bcm63xx_enet: make bcm_enetsw_ethtool_ops const 2017-08-30 15:20:01 -07:00
bcm63xx_enet.h net: ethernet: broadcom: bcm63xx: use phydev from struct net_device 2016-09-19 21:39:12 -04:00
bcmsysport.c net: systemport: Fix 64-bit stats deadlock 2017-09-15 14:24:10 -07:00
bcmsysport.h net: systemport: Correctly set TSB endian for host 2017-09-01 20:19:32 -07:00
bgmac-bcma-mdio.c net: bgmac: use PHY subsystem for initializing PHY 2017-01-31 13:44:49 -05:00
bgmac-bcma.c net: ethernet: bgmac: Allow MAC address to be specified in DTB 2017-03-16 11:57:26 -07:00
bgmac-platform.c net: ethernet: bgmac: Make IDM register space optional 2017-07-15 14:28:27 -07:00
bgmac.c net: ethernet: bgmac: Make IDM register space optional 2017-07-15 14:28:27 -07:00
bgmac.h net: ethernet: bgmac: Make IDM register space optional 2017-07-15 14:28:27 -07:00
bnx2_fw.h
bnx2.c drivers: net: generalize napi_complete_done() 2017-01-30 15:10:42 -05:00
bnx2.h ethernet/broadcom: use core min/max MTU checking 2016-10-18 11:34:18 -04:00
cnic_defs.h
cnic_if.h
cnic.c net-next: treewide use is_vlan_dev() helper function. 2017-02-06 16:33:29 -05:00
cnic.h
Kconfig bnxt_en: bnxt: add TC flower filter offload support 2017-08-28 16:57:10 -07:00
Makefile net: ethernet: bgmac: Add platform device support 2016-07-09 18:10:41 -04:00
sb1250-mac.c net: ethernet: broadcom: Remove null check before kfree 2017-08-28 15:53:23 -07:00
tg3.c tg3: clean up redundant initialization of tnapi 2017-09-14 10:00:29 -07:00
tg3.h