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 = {

Reply via email to