On Thu, Mar 19, 2026 at 10:03:15AM +0100, Sebastian Andrzej Siewior wrote:
> On 2026-03-18 18:08:21 [-0700], Boqun Feng wrote:
> > @@ -1979,6 +1986,17 @@ static void process_srcu(struct work_struct *work)
> > srcu_reschedule(ssp, curdelay);
> > }
> >
> > +static void srcu_irq_work(struct irq_work *work)
> > +{
> > + struct srcu_struct *ssp;
> > + struct srcu_usage *sup;
> > +
> > + sup = container_of(work, struct srcu_usage, irq_work);
> > + ssp = sup->srcu_ssp;
> > +
> > + queue_delayed_work(rcu_gp_wq, &sup->work, !!srcu_get_delay(ssp));
> > +}
> > +
>
> Please just use the queue_delayed_work() with a delay >0.
>
That doesn't work since queue_delayed_work() with a positive delay will
still acquire timer base lock, and we can have BPF instrument with timer
base lock held i.e. calling call_srcu() with timer base lock.
irq_work on the other hand doesn't use any locking.
Regards,
Boqun
> Sebastian