Subject: BUG: commit "ARM: Remove __ARCH_WANT_INTERRUPTS_ON_CTXSW on pre-ARMv6 CPUs" breaks armv5 with CONFIG_PREEMPT

From: [email-masked] (Catalin Marinas)
Date: Thu, 20 Jun 2013 14:01:10 +0100

On Thu, Jun 20, 2013 at 12:47:25PM +0100, Marc Kleine-Budde wrote:
> On 06/20/2013 01:39 PM, Marc Kleine-Budde wrote:
> > On 06/20/2013 01:35 PM, Marc Kleine-Budde wrote:
> >> On 06/20/2013 01:12 PM, Catalin Marinas wrote:
> >>> On Thu, Jun 20, 2013 at 11:28:56AM +0100, Catalin Marinas wrote:
> >>>> We may need to place the preempt disable/enable at a higher level in the
> >>>> scheduler. My theory is that we have a context switch from prev to next.
> >>>> We get preempted just before finish_arch_post_lock_switch(), so the MMU
> >>>> hasn't been switched yet. The new switch during preemption happens to a
> >>>> thread with the same next mm, so the scheduler no longer switch_mm() and
> >>>> the TIF_SWITCH_MM isn't set for the new thread.
> >>>>
> >>>> I'll come back with another patch shortly.
> >>>
> >>> Here's another attempt (as before, only compile-tested):
> >>
> >> booting kernel from /image
> >> zImage: concatenated oftree detected
> >> booting Linux kernel with devicetree
> >>
> >> ...dead...
> >>
> >> Does every process have a "mm"? Even Kernel threads?
> 
> I've added a check for "mm". Boots now and my test runs stable for 3
> minutes now.

Ah, good point.

> I'm not sure if we have to check for "mm" in
> check_and_switch_context(), too.

switch_mm() wouldn't be called with a NULL mm, hence we wouldn't call
check_and_switch_context() either. finish_arch_post_lock_switch() is
called all the time (and we set the TIF flag only if switch_mm() was
called).

Thanks.

-- 
Catalin