hack 4

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
diff --git a/kernel/bpf/memalloc.c b/kernel/bpf/memalloc.c
index 0ad0e2f..6f71392 100644
--- a/kernel/bpf/memalloc.c
+++ b/kernel/bpf/memalloc.c
@@ -415,6 +415,8 @@ static void bpf_ma_reuse_cb(struct rcu_head *rcu)
 	c->reuse_cb_in_progress--;
 }
 
+void rcu_request_urgent_qs_task(struct task_struct *t);
+
 static void reuse_bulk(struct bpf_mem_cache *c)
 {
 	struct llist_node *head, *tail, *llnode, *tmp;
@@ -447,11 +449,11 @@ static void reuse_bulk(struct bpf_mem_cache *c)
 		c->free_by_rcu_tail = tail;
 	__llist_add_batch(head, tail, &c->free_by_rcu);
 
-	if (c->reuse_cb_in_progress >= 100 || 1) {
+//	if (c->reuse_cb_in_progress >= 100 || 1) {
 //		local_irq_save(flags);
-		rcu_momentary_dyntick_idle2();
+//		rcu_momentary_dyntick_idle2();
 //		local_irq_restore(flags);
-	}
+//	}
 
 /*	if (c->reuse_cb_in_progress >= 100)
 		return;*/
@@ -469,8 +471,14 @@ static void reuse_bulk(struct bpf_mem_cache *c)
 		return;
 	}
 
-	if (atomic_xchg(&c->call_rcu_in_progress, 1))
+	if (atomic_xchg(&c->call_rcu_in_progress, 1)) {
+//		rcu_request_urgent_qs_task(current);
+
+//		set_tsk_need_resched(current);
+//		set_preempt_need_resched();
+		rcu_momentary_dyntick_idle2();
 		return;
+	}
 
 //	WARN_ON_ONCE(!llist_empty(&c->waiting_for_gp));
 	head = __llist_del_all(&c->free_by_rcu);
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 7fcd659..20d3670 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -336,12 +336,7 @@ EXPORT_SYMBOL_GPL(rcu_momentary_dyntick_idle);
 
 notrace void rcu_momentary_dyntick_idle2(void)
 {
-	int seq;
-
-	raw_cpu_write(rcu_data.rcu_need_heavy_qs, false);
-	seq = ct_state_inc(2 * RCU_DYNTICKS_IDX);
-	/* It is illegal to call this from idle state. */
-	WARN_ON_ONCE(!(seq & RCU_DYNTICKS_IDX));
+	this_cpu_write(rcu_data.rcu_urgent_qs, true);
 }
 
 /**