[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

@@ -124,6 +124,13 @@ static void poll_napi(struct netpoll *np)
if (test_bit(__LINK_STATE_RX_SCHED, &np->dev->state) &&
npinfo->poll_owner != smp_processor_id() &&
spin_trylock(&npinfo->poll_lock)) {
/* When calling dev->poll from poll_napi, we may end up in
* netif_rx_complete. However, only the CPU to which the
* device was queued is allowed to remove it from poll_list.
* Setting POLL_LIST_FROZEN tells netif_rx_complete
* to leave the NAPI state alone.
*/
set_bit(__LINK_STATE_POLL_LIST_FROZEN, &np->dev->state);
npinfo->rx_flags |= NETPOLL_RX_DROP;
atomic_inc(&trapped);
@@ -131,6 +138,7 @@ static void poll_napi(struct netpoll *np)
atomic_dec(&trapped);
npinfo->rx_flags &= ~NETPOLL_RX_DROP;
clear_bit(__LINK_STATE_POLL_LIST_FROZEN, &np->dev->state);
spin_unlock(&npinfo->poll_lock);
}
}