On Tue, Nov 11, 2025 at 04:38:03PM +0100, Sebastian Andrzej Siewior wrote:
> On 2025-11-02 14:49:43 [-0800], Paul E. McKenney wrote:
> > --- a/kernel/rcu/refscale.c
> > +++ b/kernel/rcu/refscale.c
> > @@ -636,6 +636,37 @@ static const struct ref_scale_ops jiffies_ops = {
> > .name = "jiffies"
> > };
> >
> > +static void ref_bh_section(const int nloops)
> > +{
> > + int i;
> > +
> > + preempt_disable();
> > + for (i = nloops; i >= 0; i--) {
> > + local_bh_disable();
>
> This (preempt off followed by bh off) may cause warnings. That would be
> bh is disabled on the CPU, it gets preempted by _this_ which disables
> first preemption and then bh.
> I hid the code under CONFIG_PREEMPT_RT_NEEDS_BH_LOCK so it shouldn't be
> a problem in the long term I think. So just if you see a warning here
> under RT you know why :)
Huh. Would migrate_disable() be appropriate? Or I suppose I could just
let it migrate on RT. So how about the fix shown below?
Thanx, Paul
> > + local_bh_enable();
> > + }
> > + preempt_enable();
> > +}
>
> Sebastian
------------------------------------------------------------------------
diff --git a/kernel/rcu/refscale.c b/kernel/rcu/refscale.c
index 07a313782dfd..5a692a3b93fa 100644
--- a/kernel/rcu/refscale.c
+++ b/kernel/rcu/refscale.c
@@ -887,25 +887,29 @@ static void ref_bh_section(const int nloops)
{
int i;
- preempt_disable();
+ if (!IS_ENABLED(CONFIG_PREEMPT_RT))
+ preempt_disable();
for (i = nloops; i >= 0; i--) {
local_bh_disable();
local_bh_enable();
}
- preempt_enable();
+ if (!IS_ENABLED(CONFIG_PREEMPT_RT))
+ preempt_enable();
}
static void ref_bh_delay_section(const int nloops, const int udl, const int
ndl)
{
int i;
- preempt_disable();
+ if (!IS_ENABLED(CONFIG_PREEMPT_RT))
+ preempt_disable();
for (i = nloops; i >= 0; i--) {
local_bh_disable();
un_delay(udl, ndl);
local_bh_enable();
}
- preempt_enable();
+ if (!IS_ENABLED(CONFIG_PREEMPT_RT))
+ preempt_enable();
}
static const struct ref_scale_ops bh_ops = {