aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@woody.linux-foundation.org>2007-07-16 17:31:08 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-07-16 17:31:08 -0400
commit2e27afb300b56d83bb03fbfa68852b9c1e2920c6 (patch)
tree32e38acc1602042260f13cceaf3a29792affb05b
parentc2dc1ad582196208a2f990eb0230eb922046c684 (diff)
Revert "[NET]: Fix races in net_rx_action vs netpoll."
This reverts commit 29578624e354f56143d92510fff33a8b2aaa2c03. Ingo Molnar reports complete breakage with his e1000 card (no networking, card reports transmit timeouts), and bisected it down to this commit. Let's figure out what went wrong, but not keep breaking machines until we do. Cc: Ingo Molnar <mingo@elte.hu> Cc: Olaf Kirch <olaf.kirch@oracle.com> Cc: David Miller <davem@davemloft.net> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--include/linux/netdevice.h10
-rw-r--r--net/core/netpoll.c8
2 files changed, 0 insertions, 18 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 322b5eae57dd..da7a13c97eb8 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -262,8 +262,6 @@ enum netdev_state_t
262 __LINK_STATE_LINKWATCH_PENDING, 262 __LINK_STATE_LINKWATCH_PENDING,
263 __LINK_STATE_DORMANT, 263 __LINK_STATE_DORMANT,
264 __LINK_STATE_QDISC_RUNNING, 264 __LINK_STATE_QDISC_RUNNING,
265 /* Set by the netpoll NAPI code */
266 __LINK_STATE_POLL_LIST_FROZEN,
267}; 265};
268 266
269 267
@@ -1022,14 +1020,6 @@ static inline void netif_rx_complete(struct net_device *dev)
1022{ 1020{
1023 unsigned long flags; 1021 unsigned long flags;
1024 1022
1025#ifdef CONFIG_NETPOLL
1026 /* Prevent race with netpoll - yes, this is a kludge.
1027 * But at least it doesn't penalize the non-netpoll
1028 * code path. */
1029 if (test_bit(__LINK_STATE_POLL_LIST_FROZEN, &dev->state))
1030 return;
1031#endif
1032
1033 local_irq_save(flags); 1023 local_irq_save(flags);
1034 __netif_rx_complete(dev); 1024 __netif_rx_complete(dev);
1035 local_irq_restore(flags); 1025 local_irq_restore(flags);
diff --git a/net/core/netpoll.c b/net/core/netpoll.c
index d1264e9a50a8..de1b26aa5720 100644
--- a/net/core/netpoll.c
+++ b/net/core/netpoll.c
@@ -124,13 +124,6 @@ static void poll_napi(struct netpoll *np)
124 if (test_bit(__LINK_STATE_RX_SCHED, &np->dev->state) && 124 if (test_bit(__LINK_STATE_RX_SCHED, &np->dev->state) &&
125 npinfo->poll_owner != smp_processor_id() && 125 npinfo->poll_owner != smp_processor_id() &&
126 spin_trylock(&npinfo->poll_lock)) { 126 spin_trylock(&npinfo->poll_lock)) {
127 /* When calling dev->poll from poll_napi, we may end up in
128 * netif_rx_complete. However, only the CPU to which the
129 * device was queued is allowed to remove it from poll_list.
130 * Setting POLL_LIST_FROZEN tells netif_rx_complete
131 * to leave the NAPI state alone.
132 */
133 set_bit(__LINK_STATE_POLL_LIST_FROZEN, &np->dev->state);
134 npinfo->rx_flags |= NETPOLL_RX_DROP; 127 npinfo->rx_flags |= NETPOLL_RX_DROP;
135 atomic_inc(&trapped); 128 atomic_inc(&trapped);
136 129
@@ -138,7 +131,6 @@ static void poll_napi(struct netpoll *np)
138 131
139 atomic_dec(&trapped); 132 atomic_dec(&trapped);
140 npinfo->rx_flags &= ~NETPOLL_RX_DROP; 133 npinfo->rx_flags &= ~NETPOLL_RX_DROP;
141 clear_bit(__LINK_STATE_POLL_LIST_FROZEN, &np->dev->state);
142 spin_unlock(&npinfo->poll_lock); 134 spin_unlock(&npinfo->poll_lock);
143 } 135 }
144} 136}