Re: [patch] Real-Time Preemption, -RT-2.6.12-rc1-V0.7.41-01

Paul E. McKenney
2005-03-23T04:48:49Z

On Tue, Mar 22, 2005 at 10:32:01AM +0100, Ingo Molnar wrote:
>
> * Ingo Molnar <mingo@elte.hu> wrote:
>
> > seems to be a true SMP race: when i boot with 1 CPU it doesnt trigger,
> > the same kernel image and 2 CPUs triggers it on CPU#1. (CPU#0 is the
> > boot CPU) Note that the timing of the crash is not deterministic
> > (sometimes i get it during net startup, sometimes during ACPI
> > startup), but it always crashes within rcu_advance_callbacks().
> >
> > one difference between your tests and mine is that your kernel is
> > doing _synchronize_kernel() from preempt-off sections (correct?),
> > while my kernel with PREEMPT_RT does it on preemptable sections.
>
> hm, another thing: i think call_rcu() needs to take the read-lock. Right
> now it assumes that it has the data structure private, but that's only
> statistically true on PREEMPT_RT: another CPU may have this CPU's RCU
> control structure in use. So IRQs-off (or preempt-off) is not a
> guarantee to have the data structure, the read lock has to be taken.

!!! The difference is that in the stock kernel, rcu_check_callbacks()
is invoked from irq. In PREEMPT_RT, it is invoked from process context
and appears to be preemptible. This means that rcu_advance_callbacks()
can be preempted, resulting in all sorts of problems. Need to disable
preemption over this.

There are probably other bugs of this sort, I will track them down.

But, just to make sure I understand -- if I have preempt disabled over
all accesses to a per-CPU variable, and that variable is -not- accessed
from a real interrupt handler, then I am safe without a lock, right?

Thanx, Paul

PS. Fixing my stupid bugs that you pointed out in earlier email,
as well. :-/