diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2014-12-20 15:16:24 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-12-23 23:20:21 -0500 |
commit | 6bd373ebbac4b13ecd39ddc37a0dc5ad4c5e4585 (patch) | |
tree | acd7a1d4a9f2ad46bd4cd652fe47af57af61c9cf /net | |
parent | 001ce546bb537bb5b7821f05633556a0c9787e32 (diff) |
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.c | 7 |
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) | |||
4634 | while (!list_empty(&list)) { | 4634 | while (!list_empty(&list)) { |
4635 | struct napi_struct *n; | 4635 | struct napi_struct *n; |
4636 | 4636 | ||
4637 | n = list_first_entry(&list, struct napi_struct, poll_list); | ||
4638 | budget -= napi_poll(n, &repoll); | ||
4639 | |||
4637 | /* If softirq window is exhausted then punt. | 4640 | /* If softirq window is exhausted then punt. |
4638 | * Allow this to run for 2 jiffies since which will allow | 4641 | * Allow this to run for 2 jiffies since which will allow |
4639 | * an average latency of 1.5/HZ. | 4642 | * an average latency of 1.5/HZ. |
4640 | */ | 4643 | */ |
4641 | if (unlikely(budget <= 0 || time_after_eq(jiffies, time_limit))) | 4644 | if (unlikely(budget <= 0 || time_after_eq(jiffies, time_limit))) |
4642 | goto softnet_break; | 4645 | goto softnet_break; |
4643 | |||
4644 | |||
4645 | n = list_first_entry(&list, struct napi_struct, poll_list); | ||
4646 | budget -= napi_poll(n, &repoll); | ||
4647 | } | 4646 | } |
4648 | 4647 | ||
4649 | if (!sd_has_rps_ipi_waiting(sd) && | 4648 | if (!sd_has_rps_ipi_waiting(sd) && |