aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2014-12-21 07:16:24 +1100
committerDavid S. Miller <davem@davemloft.net>2014-12-23 23:20:21 -0500
commit6bd373ebbac4b13ecd39ddc37a0dc5ad4c5e4585 (patch)
treeacd7a1d4a9f2ad46bd4cd652fe47af57af61c9cf /net
parentnet: Detect drivers that reschedule NAPI and exhaust budget (diff)
downloadlinux-dev-6bd373ebbac4b13ecd39ddc37a0dc5ad4c5e4585.tar.xz
linux-dev-6bd373ebbac4b13ecd39ddc37a0dc5ad4c5e4585.zip
net: Always poll at least one device in net_rx_action
We should only perform the softnet_break check after we have polled at least one device in net_rx_action. Otherwise a zero or negative setting of netdev_budget can lock up the whole system. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r--net/core/dev.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/net/core/dev.c b/net/core/dev.c
index c0cf1293df06..b85eba9dfd88 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -4634,16 +4634,15 @@ static void net_rx_action(struct softirq_action *h)
while (!list_empty(&list)) {
struct napi_struct *n;
+ n = list_first_entry(&list, struct napi_struct, poll_list);
+ budget -= napi_poll(n, &repoll);
+
/* If softirq window is exhausted then punt.
* Allow this to run for 2 jiffies since which will allow
* an average latency of 1.5/HZ.
*/
if (unlikely(budget <= 0 || time_after_eq(jiffies, time_limit)))
goto softnet_break;
-
-
- n = list_first_entry(&list, struct napi_struct, poll_list);
- budget -= napi_poll(n, &repoll);
}
if (!sd_has_rps_ipi_waiting(sd) &&