linux-kernel-test/net
Neil Horman ca99ca14c9 netpoll: protect napi_poll and poll_controller during dev_[open|close]
Ivan Vercera was recently backporting commit
9c13cb8bb4 to a RHEL kernel, and I noticed that,
while this patch protects the tg3 driver from having its ndo_poll_controller
routine called during device initalization, it does nothing for the driver
during shutdown. I.e. it would be entirely possible to have the
ndo_poll_controller method (or subsequently the ndo_poll) routine called for a
driver in the netpoll path on CPU A while in parallel on CPU B, the ndo_close or
ndo_open routine could be called.  Given that the two latter routines tend to
initizlize and free many data structures that the former two rely on, the result
can easily be data corruption or various other crashes.  Furthermore, it seems
that this is potentially a problem with all net drivers that support netpoll,
and so this should ideally be fixed in a common path.

As Ben H Pointed out to me, we can't preform dev_open/dev_close in atomic
context, so I've come up with this solution.  We can use a mutex to sleep in
open/close paths and just do a mutex_trylock in the napi poll path and abandon
the poll attempt if we're locked, as we'll just retry the poll on the next send
anyway.

I've tested this here by flooding netconsole with messages on a system whos nic
driver I modfied to periodically return NETDEV_TX_BUSY, so that the netpoll tx
workqueue would be forced to send frames and poll the device.  While this was
going on I rapidly ifdown/up'ed the interface and watched for any problems.
I've not found any.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Ivan Vecera <ivecera@redhat.com>
CC: "David S. Miller" <davem@davemloft.net>
CC: Ben Hutchings <bhutchings@solarflare.com>
CC: Francois Romieu <romieu@fr.zoreil.com>
CC: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-02-06 15:45:03 -05:00
..
9p
802
8021q net: disallow drivers with buggy VLAN accel to register_netdevice() 2013-01-29 22:58:40 -05:00
appletalk
atm atm: use scnprintf() instead of sprintf() 2012-12-17 20:50:51 -08:00
ax25
batman-adv Included changes: 2013-01-29 15:59:45 -05:00
bluetooth net: remove redundant check for timer pending state before del_timer 2013-02-04 13:26:49 -05:00
bridge net: remove redundant check for timer pending state before del_timer 2013-02-04 13:26:49 -05:00
caif caif_usb: Make the driver name check more efficient 2012-12-09 00:34:02 -05:00
can can: rework skb reserved data handling 2013-01-28 18:17:25 -05:00
ceph Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client 2013-01-02 17:32:49 -08:00
core netpoll: protect napi_poll and poll_controller during dev_[open|close] 2013-02-06 15:45:03 -05:00
dcb net: Allow DCBnl to use other namespaces besides init_net 2012-12-10 14:09:01 -05:00
dccp inet: Fix kmemleak in tcp_v4/6_syn_recv_sock and dccp_v4/6_request_recv_sock 2012-12-14 13:14:07 -05:00
decnet decnet: use correct RCU API to deref sk_dst_cache field 2013-01-28 00:15:27 -05:00
dns_resolver Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security 2012-12-16 15:40:50 -08:00
dsa dsa: make dsa_switch_setup check for valid port names 2013-01-21 15:40:12 -05:00
ethernet net: split eth_mac_addr for better error handling 2013-01-21 14:07:44 -05:00
ieee802154 6lowpan: Handle uncompressed IPv6 packets over 6LoWPAN 2013-01-18 14:18:30 -05:00
ipv4 tcp: remove Appropriate Byte Count support 2013-02-05 14:51:16 -05:00
ipv6 ipv6: Don't send packet to big messages to self 2013-02-06 15:12:39 -05:00
ipx
irda net: remove redundant check for timer pending state before del_timer 2013-02-04 13:26:49 -05:00
iucv s390/irq: remove split irq fields from /proc/stat 2013-01-08 10:57:07 +01:00
key xfrm: Convert xfrm_addr_cmp() to boolean xfrm_addr_equal(). 2013-01-29 22:58:40 -05:00
l2tp l2tp: Make ipv4 protocol handler namespace aware. 2013-02-05 14:37:01 -05:00
lapb
llc
mac80211 Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless 2013-01-28 13:54:03 -05:00
mac802154 wpan: whitespace fix 2013-02-06 15:44:02 -05:00
netfilter net: remove redundant check for timer pending state before del_timer 2013-02-04 13:26:49 -05:00
netlabel
netlink netlink: Use FIELD_SIZEOF() in netlink_proto_init(). 2013-01-09 23:38:23 -08:00
netrom
nfc NFC: Use skb_copy_datagram_iovec 2013-01-11 14:56:32 +01:00
openvswitch openvswitch: Use FIELD_SIZEOF() in dp_init(). 2013-01-09 23:38:24 -08:00
packet packet: fix leakage of tx_ring memory 2013-02-03 16:15:23 -05:00
phonet
rds IB/rds: suppress incompatible protocol when version is known 2012-12-26 15:17:37 -08:00
rfkill Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 2012-12-13 12:00:02 -08:00
rose
rxrpc rxrpc: Use FIELD_SIZEOF() in af_rxrpc_init(). 2013-01-09 23:38:24 -08:00
sched Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2013-02-05 14:12:20 -05:00
sctp net: remove redundant check for timer pending state before del_timer 2013-02-04 13:26:49 -05:00
sunrpc ipv6: rename datagram_send_ctl and datagram_recv_ctl 2013-01-31 13:53:08 -05:00
tipc tipc: refactor accept() code for improved readability 2012-12-07 17:23:24 -05:00
unix unix: Use FIELD_SIZEOF() in af_unix_init(). 2013-01-09 23:38:24 -08:00
wimax
wireless Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2013-02-05 14:12:20 -05:00
x25
xfrm xfrm: Convert xfrm_addr_cmp() to boolean xfrm_addr_equal(). 2013-01-29 22:58:40 -05:00
compat.c
Kconfig wanrouter: completely decouple obsolete code from kernel. 2013-01-31 19:20:33 -05:00
Makefile wanrouter: completely decouple obsolete code from kernel. 2013-01-31 19:20:33 -05:00
nonet.c
socket.c wanrouter: completely decouple obsolete code from kernel. 2013-01-31 19:20:33 -05:00
sysctl_net.c