Re: PREEMPT/PREEMPT_RT question

Paul E. McKenney
2005-07-13T01:45:59Z

On Tue, Jul 12, 2005 at 07:47:15PM -0400, Steven Rostedt wrote:
> On Tue, 2005-07-12 at 14:34 -0700, Paul E. McKenney wrote:
> > > Yeah, mips has the crazy Load Linked and Store Conditional crap, so it
> > > is a little more complex than the simple add one. And I think PPC does
> > > too, although it has been a while since I've used them. And older mips
> > > don't have the LL SC command so the only option is to turn off
> > > interrupts (of course those that don't have the LL and SC are not SMP
> > > compatible). So, I will admit that having a smp_atomic_inc might be
> > > nice. I was just being a narrow minded x86 hacker ;-)
> >
> > I am sure that LL/SC seemed like a good idea at the time. ;-)
> >
> > To be fair, LL/SC does allow allow some things to be done more easily
> > than with cmpxchg, since it allows you to tell that the value changed
> > even if it later changed back. Helps with some linked-list operations.
>
> I was being a little harsh in my statements. I didn't really mind the
> LL and SC but a true atomic inc would have been nice. I actually had to
> port Linux to a MIPS board once that didn't have the LL or SC, and that
> was even more painful.

I could believe that!

> > > > > Yep interrupts are threads in CONFIG_PREEMPT_RT. I guess you could also
> > > > > just use local_irq_save with spin_lock, since now local_irq_save no
> > > > > longer disables interrupts in PREEMPT_RT.
> > > >
> > > > By this you mean the following?
> > > >
> > > > local_irq_save(flags);
> > > > _raw_spin_lock(&mylock);
> > > >
> > > > /* critical section */
> > > >
> > > > _raw_spin_unlock(&mylock);
> > > > local_irq_restore(flags);
> > >
> > > Yeah, that on PREEMP_RT would not turn off interrupts but just stops
> > > preemption. This is fine as long as the mylock is not used in any
> > > SA_NODELAY interrupt.
> >
> > Cool! Is the scheduling-clock interrupt an SA_NODELAY interrupt?
>
> If you are talking about scheduler_tick, then yes, it is called by the
> timer interrupt which is a SA_NODELAY interrupt. If you don't want to
> get interrupted by the timer interrupt, then you will need to disable
> interrupts for both. Since currently, the timer interrupt is the only
> true hard interrupt in the PREEMPT_RT and that may not change.

OK, so if I take a spinlock in something invoked from scheduler_tick(),
then any other acquisitions of that spinlock must disable hardware
interrupts, right?

Thanx, Paul