path: root/kernel/net/netfilter/ipset/ip_set_core.c
diff options
authorFlorian Westphal <>2018-01-04 13:24:44 +0100
committerJozsef Kadlecsik <>2018-01-04 13:24:44 +0100
commit56004fb77322d454e72187394a1f17e457cb3e04 (patch)
tree6a462cda469e73ad5f7cd95f8e839f3358f947da /kernel/net/netfilter/ipset/ip_set_core.c
parentad92ed77e77fe421a86f0fde907c51286ed47928 (diff)
netfilter: ipset: add resched points during set listing
When sets are extremely large we can get softlockup during ipset -L. We could fix this by adding cond_resched_rcu() at the right location during iteration, but this only works if RCU nesting depth is 1. At this time entire variant->list() is called under under rcu_read_lock_bh. This used to be a read_lock_bh() but as rcu doesn't really lock anything, it does not appear to be needed, so remove it (ipset increments set reference count before this, so a set deletion should not be possible). Reported-by: Li Shuang <> Signed-off-by: Florian Westphal <>
Diffstat (limited to 'kernel/net/netfilter/ipset/ip_set_core.c')
1 files changed, 0 insertions, 2 deletions
diff --git a/kernel/net/netfilter/ipset/ip_set_core.c b/kernel/net/netfilter/ipset/ip_set_core.c
index 134e708..d25dd46 100644
--- a/kernel/net/netfilter/ipset/ip_set_core.c
+++ b/kernel/net/netfilter/ipset/ip_set_core.c
@@ -1425,9 +1425,7 @@ dump_last:
set->variant->uref(set, cb, true);
/* Fall through and add elements */
- rcu_read_lock_bh();
ret = set->variant->list(set, skb, cb);
- rcu_read_unlock_bh();
if (!cb->args[IPSET_CB_ARG0])
/* Set is done, proceed with next one */
goto next_set;