diff options
author | Olaf Kirch <olaf.kirch@oracle.com> | 2007-07-11 22:32:02 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2007-07-11 22:32:02 -0400 |
commit | 29578624e354f56143d92510fff33a8b2aaa2c03 (patch) | |
tree | 67d0f28264dbeacedde4882f1e76157894ba33ba /include/linux/netdevice.h | |
parent | 1fd05ba5a2f2aa8e7b9b52ef55df850e2e7d54c9 (diff) |
[NET]: Fix races in net_rx_action vs netpoll.
Keep netpoll/poll_napi from messing with the poll_list.
Only net_rx_action is allowed to manipulate the list.
Signed-off-by: Olaf Kirch <olaf.kirch@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux/netdevice.h')
-rw-r--r-- | include/linux/netdevice.h | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 8590d685d935..79cc3dab4be7 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -261,6 +261,8 @@ enum netdev_state_t | |||
261 | __LINK_STATE_LINKWATCH_PENDING, | 261 | __LINK_STATE_LINKWATCH_PENDING, |
262 | __LINK_STATE_DORMANT, | 262 | __LINK_STATE_DORMANT, |
263 | __LINK_STATE_QDISC_RUNNING, | 263 | __LINK_STATE_QDISC_RUNNING, |
264 | /* Set by the netpoll NAPI code */ | ||
265 | __LINK_STATE_POLL_LIST_FROZEN, | ||
264 | }; | 266 | }; |
265 | 267 | ||
266 | 268 | ||
@@ -1014,6 +1016,14 @@ static inline void netif_rx_complete(struct net_device *dev) | |||
1014 | { | 1016 | { |
1015 | unsigned long flags; | 1017 | unsigned long flags; |
1016 | 1018 | ||
1019 | #ifdef CONFIG_NETPOLL | ||
1020 | /* Prevent race with netpoll - yes, this is a kludge. | ||
1021 | * But at least it doesn't penalize the non-netpoll | ||
1022 | * code path. */ | ||
1023 | if (test_bit(__LINK_STATE_POLL_LIST_FROZEN, &dev->state)) | ||
1024 | return; | ||
1025 | #endif | ||
1026 | |||
1017 | local_irq_save(flags); | 1027 | local_irq_save(flags); |
1018 | __netif_rx_complete(dev); | 1028 | __netif_rx_complete(dev); |
1019 | local_irq_restore(flags); | 1029 | local_irq_restore(flags); |