[NET]: Stop polling when napi_disable() is pending.
authorDavid S. Miller <davem@davemloft.net>
Tue, 8 Jan 2008 05:00:40 +0000 (21:00 -0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 9 Jan 2008 07:30:13 +0000 (23:30 -0800)
This finally adds the code in net_rx_action() to break out of the
->poll()'ing loop when a napi_disable() is found to be pending.

Now, even if a device is being flooded with packets it can be cleanly
brought down.

Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/dev.c

index be9d3015beaa101318c58ce2827f5d96321de264..0879f52115eb9bada2f73bb3de2188ef9bf9a910 100644 (file)
@@ -2207,8 +2207,12 @@ static void net_rx_action(struct softirq_action *h)
                 * still "owns" the NAPI instance and therefore can
                 * move the instance around on the list at-will.
                 */
-               if (unlikely(work == weight))
-                       list_move_tail(&n->poll_list, list);
+               if (unlikely(work == weight)) {
+                       if (unlikely(napi_disable_pending(n)))
+                               __napi_complete(n);
+                       else
+                               list_move_tail(&n->poll_list, list);
+               }
 
                netpoll_poll_unlock(have);
        }