[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>
This commit is contained in:
Olaf Kirch
2007-07-11 19:32:02 -07:00
committed by David S. Miller
parent 1fd05ba5a2
commit 29578624e3
2 changed files with 18 additions and 0 deletions

View File

@@ -261,6 +261,8 @@ enum netdev_state_t
__LINK_STATE_LINKWATCH_PENDING,
__LINK_STATE_DORMANT,
__LINK_STATE_QDISC_RUNNING,
/* Set by the netpoll NAPI code */
__LINK_STATE_POLL_LIST_FROZEN,
};
@@ -1014,6 +1016,14 @@ static inline void netif_rx_complete(struct net_device *dev)
{
unsigned long flags;
#ifdef CONFIG_NETPOLL
/* Prevent race with netpoll - yes, this is a kludge.
* But at least it doesn't penalize the non-netpoll
* code path. */
if (test_bit(__LINK_STATE_POLL_LIST_FROZEN, &dev->state))
return;
#endif
local_irq_save(flags);
__netif_rx_complete(dev);
local_irq_restore(flags);