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);
}
/**