Skip to contentSkip to conversation

Realtime preemption patch on PPC

DISCUSSION Ben Weintraub 5 participants 5 messages Aug 10, 2006 – Aug 11, 2006

lore
Share & tools
lore
#0 lore raw

Howdy,

I'm wondering if anyone has had success getting Ingo Molnar's realtime preemption patch (the one here:
http://people.redhat.com/mingo/realtime-preempt/ ) working on the ppc arch.

I'm working with patch-2.6.17-rt8 (the latest) and linux-2.6.17. The realtime-preempt patch seems to include the generic timeofday patch, but with no support for the ppc arch, only powerpc, so I've hacked in support for ppc by basically replicating the powerpc arch-specific stuff found here:
http://sr71.net/~jstultz/tod/archive/linux-2.6.17-rc3_timekeeping_C2/broken-out/linux-2.6.17-rc3_timeofday-arch-ppc_C2.patch

I can attach my patch if anyone would like, but for all I know it could be wildly inaccurate.

Anyhow, when I boot on an MPC8555 with my hack, I get an endless stream of:

BUG: sleeping function called from invalid context init(1) at
arch/powerpc/math-emu/math.c:226
in_atomic():0 [00000000], irqs_disabled():1
Call Trace:
[A0BB3E90] [A000934C] show_stack+0x48/0x194 (unreliable)
[A0BB3EC0] [A001B7DC] __might_sleep+0xe8/0xf4
[A0BB3EE0] [A00136C0] do_mathemu+0x30/0x8c8
[A0BB3F00] [A00036AC] program_check_exception+0x1ac/0x514
[A0BB3F40] [A0002A08] ret_from_except_full+0x0/0x4c

Line 226 in arch/powerpc/math-emu/math.c is part of the do_mathemu() function, and contains a call to get_user(), which calls __might_sleep(), causing this problem.

I did find this message in the LKML archives describing a very similar problem:
http://lkml.org/lkml/2006/2/23/312

And so tried putting a call to local_irq_enable() before the call to do_mathemu() in program_check_excpetion(), but this causes a hard lockup with no messages printed when I try to bring up my network interface. I assume this means I've done something Very Bad with interrupts by adding in local_irq_enable() at the wrong spot. I also tried adding it at the exact same spot as the patch given by Paul in his reply, but in this case I still get the endless stream of BUG messages.

Can anyone offer some guidance or advice?

Thanks so much,
Ben

#1 lore raw
Quoted 7 lines · Ben Weintraub

Howdy,

I'm wondering if anyone has had success getting Ingo Molnar's realtime preemption patch (the one here:
http://people.redhat.com/mingo/realtime-preempt/ ) working on the ppc arch.

This is probably a better question for the -rt people and LKML than this list.

Lee

#2 lore raw
In reply to Ben Weintraub
Quoted 6 lines · Ben Weintraub

Howdy,

I'm wondering if anyone has had success getting Ingo Molnar's realtime preemption patch (the one here:
http://people.redhat.com/mingo/realtime-preempt/ ) working on the ppc arch.

I have gotten them to work with MPC7448 boards, but it has hardware floating point, so no math-emu problems.

Quoted 17 lines

Anyhow, when I boot on an MPC8555 with my hack, I get an endless stream of:

BUG: sleeping function called from invalid context init(1) at
arch/powerpc/math-emu/math.c:226
in_atomic():0 [00000000], irqs_disabled():1
Call Trace:
[A0BB3E90] [A000934C] show_stack+0x48/0x194 (unreliable)
[A0BB3EC0] [A001B7DC] __might_sleep+0xe8/0xf4
[A0BB3EE0] [A00136C0] do_mathemu+0x30/0x8c8
[A0BB3F00] [A00036AC] program_check_exception+0x1ac/0x514
[A0BB3F40] [A0002A08] ret_from_except_full+0x0/0x4c

Line 226 in arch/powerpc/math-emu/math.c is part of the do_mathemu() function, and contains a call to get_user(), which calls __might_sleep(), causing this problem.

#3 lore raw
Quoted 7 lines · On Fri, 11 Aug 2006 09:38:45 -0500 Brent Cook <[email protected]> wrote:

On Thursday 10 August 2006 18:04, Ben Weintraub wrote:

I have gotten them to work with MPC7448 boards, but it has hardware floating point, so no math-emu problems.

Quoted 2 lines

Anyhow, when I boot on an MPC8555 with my hack, I get an endless stream of:

if you can, you might want to rebuild your binaries with -msoft-float

Kim

#4 lore raw
In reply to Brent Cook
Quoted 27 lines · Brent Cook
Quoted 6 lines · Ben Weintraub

Howdy,

I'm wondering if anyone has had success getting Ingo Molnar's realtime preemption patch (the one here:
http://people.redhat.com/mingo/realtime-preempt/ ) working on the ppc arch.

I have gotten them to work with MPC7448 boards, but it has hardware floating point, so no math-emu problems.

Quoted 16 lines

Anyhow, when I boot on an MPC8555 with my hack, I get an endless stream of:

BUG: sleeping function called from invalid context init(1) at
arch/powerpc/math-emu/math.c:226
in_atomic():0 [00000000], irqs_disabled():1
Call Trace:
[A0BB3E90] [A000934C] show_stack+0x48/0x194 (unreliable)
[A0BB3EC0] [A001B7DC] __might_sleep+0xe8/0xf4
[A0BB3EE0] [A00136C0] do_mathemu+0x30/0x8c8
[A0BB3F00] [A00036AC] program_check_exception+0x1ac/0x514
[A0BB3F40] [A0002A08] ret_from_except_full+0x0/0x4c

Line 226 in arch/powerpc/math-emu/math.c is part of the do_mathemu() function, and contains a call to get_user(), which calls __might_sleep(), causing this problem.

It is not the might sleep that is the problem. Nor the get_user. It is that the irqs are DISABLED.
If the thread goes to sleep it might never wake up! (With interrupts disabled what HW can not notify SW that it is live...)

1) Floating point in kernel is difficult to handle due to lazy register saving
2) When using a processor without hardware floating point, compile with library (to avoid taking exceptions due to unimplemented instructions with emulation)

My guess is that you have a driver that disables interrupts, does floating point calculations expecting that it has floating point support, takes an exception, exception code does not expect to get an exception from kernel space and absolutely not when having interrupts disabled...

Recompile with soft float, or even better use fixed point calculations!

/RogerL