Re: [PATCH RFC v3 03/13] rcu-tasks: Add a Tasks RCU implementation for reader-marked trampolines
From: Frederic Weisbecker
Date: Thu Sep 17 2026 - 20:41:18 EST
Le Tue, Sep 15, 2026 at 01:17:30PM +0000, Josef Bacik a écrit :
> +static void rcu_tasks_tramp_hold(struct task_struct *t)
> +{
> + unsigned long flags;
> +
> + if (t->rcu_tasks_holdout)
> + return;
> + raw_spin_lock_irqsave(&rcu_tasks_tramp_lock, flags);
> + list_add_tail(&t->rcu_tasks_holdout_list, &rcu_tasks_tramp_holdouts);
> + WRITE_ONCE(t->rcu_tasks_holdout, true);
> + raw_spin_unlock_irqrestore(&rcu_tasks_tramp_lock, flags);
> +}
> +
> +static void rcu_tasks_tramp_release(struct task_struct *t)
> +{
> + unsigned long flags;
> +
> + if (likely(!t->rcu_tasks_holdout))
> + return;
> + raw_spin_lock_irqsave(&rcu_tasks_tramp_lock, flags);
> + list_del_init(&t->rcu_tasks_holdout_list);
> + WRITE_ONCE(t->rcu_tasks_holdout, false);
> + raw_spin_unlock_irqrestore(&rcu_tasks_tramp_lock, flags);
> +}
> +
> +/**
> + * rcu_tasks_irq_resched_enter - Tasks RCU hook for the irq-exit reschedule check
> + * @ip: instruction pointer of the interrupted (task-level) context
> + *
> + * Called with interrupts disabled when an interrupt returning to kernel
> + * mode is about to preempt_schedule_irq(), the one context switch that can
> + * catch a task inside unmarked trampoline text. Record where the task is
> + * parked for as long as it is (rcu_tasks_wait_irq_preempted() looks at
> + * that), and if it is inside such text make it a holdout before
> + * __schedule() reports the quiescent event; if it is not, this is as good
> + * as a voluntary switch for ending an earlier hold.
> + */
> +void rcu_tasks_irq_resched_enter(unsigned long ip)
> +{
> + struct task_struct *t = current;
> + struct rcu_tasks_percpu *rtpcp = this_cpu_ptr(rcu_tasks.rtpcpu);
> +
> + lockdep_assert_irqs_disabled();
> + WRITE_ONCE(t->rcu_tasks_irq_ip, ip);
> + t->rcu_tasks_exit_cpu = smp_processor_id();
> + raw_spin_lock_rcu_node(rtpcp);
> + list_add(&t->rcu_tasks_exit_list, &rtpcp->rtp_exit_list);
> + raw_spin_unlock_rcu_node(rtpcp);
I don't think we can do that. This is too much unconditional overhead
on the hot preemption path. rcu_tasks_trampoline_text() should be
a condition here.
And do we really need to maintain both lists? I understand that they
have different purposes.
->rcu_tasks_exit_list is to track preempted tasks on trampoline
->rcu_tasks_holdout_list is to track preempted tasks on trampoline until
they ever voluntary schedule()
Can the latter replace the former? I see it's used on kprobes and others
but I haven't checked the details yet.
Thanks.
--
Frederic Weisbecker
SUSE Labs