--- 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)