--- x/net/netfilter/nf_conntrack_core.c +++ y/net/netfilter/nf_conntrack_core.c @@ -1435,6 +1435,8 @@ static void gc_worker(struct work_struct struct hlist_nulls_head *ct_hash; struct hlist_nulls_node *n; struct nf_conn *tmp; + int bailout = 0; + unsigned long start; rcu_read_lock(); @@ -1444,10 +1446,15 @@ static void gc_worker(struct work_struct break; } + start = jiffies; hlist_nulls_for_each_entry_rcu(h, n, &ct_hash[i], hnnode) { struct nf_conntrack_net *cnet; struct net *net; + if (start != jiffies) { + bailout = 1; + break; + } tmp = nf_ct_tuplehash_to_ctrack(h); if (test_bit(IPS_OFFLOAD_BIT, &tmp->status)) { @@ -1496,6 +1503,8 @@ static void gc_worker(struct work_struct next_run = 0; break; } + if (bailout) + i--; } while (i < hashsz); if (gc_work->exiting)