Re: [PATCH] rcu: Use cpus_read_lock() while looking at cpu_online_mask

From: Paul E. McKenney
Date: Wed Sep 19 2018 - 18:11:50 EST


On Wed, Sep 19, 2018 at 01:55:21PM -0700, Tejun Heo wrote:
> Hello,
>
> On Tue, Sep 11, 2018 at 10:02:22AM -0700, Paul E. McKenney wrote:
> > > Doesn't work for me because it is still within the preempt-disable
> > > section :/.
> > > Would it work to use WORK_CPU_UNBOUND? As far as I understand it, the
> > > CPU number does not matter, you just want to spread it across multiple
> > > CPUs in the NUMA case.
> >
> > Locality is a good thing, but yes, something like this?
> >
> > if (!IS_ENABLED(CONFIG_PREEMPT_RT) && /* or whatever it is called */
> > unlikely(cpu > rnp->grphi - rnp->grplo))
> >
> > Another approach that might be better longer term would be to have a
> > workqueue interface that treats the specified CPU as a suggestion,
> > and silently switches to WORK_CPU_UNBOUND if there is any problem
> > whatsoever with the specified CPU. Tejun, Lai, thoughts?
>
> Unbound workqueue is NUMA-affine by default, so using it by default
> might not harm anything.

OK, so the above workaround would function correctly on -rt, thank you!

Sebastian, is there a counterpart to CONFIG_PREEMPT_RT already in
mainline? If so, I would be happy to make mainline safe for -rt.

> Also, per-cpu work items get unbound from
> the cpu if the cpu goes down while the work item is running or queued,
> so it might just work already.

There are race conditions where the work item is queued at an inopportune
time during the offline process, resulting in a splat, hence the need
for a check with preemption disabled in order to synchronize with the
synchronize_sched() in the offline process.

Thanx, Paul