Kernel Preemption patch

Eugene Surovegin ebs at ebshome.net
Mon Feb 24 09:54:20 EST 2003


At 02:28 PM 2/23/2003, brian.auld at adic.com wrote:
>Hello,
>
>Has anyone successfully applied and run the linux kernel preemption patch on
>a 2.4.20 kernel. I have the following:
>
>- Latest Denx kernel (2_4_devel) running on 440GP ebony
>- 'preempt-kernel-rml-2.4.20-1.patch' applied to my kernel source
>   (I manually corrected a couple of fails and double checked a few
>    'successfully applied with fuzz' instances when applying the patch).
>- Kernel compiled with 'Kernel preemption =y' in make oldconfig
>
>When I try to boot this kernel, I get the following error:
>
><------- snipped
>Kernel command line: root=/dev/nfs rw
>nfsroot=172.16.77.152:/opt/eldk/ppc_4xx
>ip=172.16.77.155:172.16.77.152::255.255.255.0:EBONY-2::off
>kernel BUG at irq.c:575!
>Oops: Exception in kernel mode, sig: 4
>NIP: C0002B04 XER: 00000000 LR: C0002B04 SP: C0125F50 REGS: c0125ea0 TRAP:
>0700    Not tainted
>MSR: 00001030 EE: 0 PR: 0 FP: 0 ME: 1 IR/DR: 11
>TASK = c0124060[0] 'swapper' Last syscall: 0
>last math 00000000 last altivec 00000000
>PLB0: bear= 0x00008000 acr=   0x9b000000 besr=  0x00000000
>
>GPR00: C0002B04 C0125F50 C0124060 00000019 00001030 00000001 00000020
>C0170000
>GPR08: 000001D8 00000002 00000000 C0125E70 C012A8A8 71000000 07FE7300
>007FFC73
>GPR16: 00000000 00000001 007FFC00 FFFFFFFF 00001032 C0125F60 00000000
>C00017CC
>GPR24: C0002AA0 007FFB90 00000E00 007FFC73 007FFC00 00000000 00000000
>007FFB90
>Call backtrace:
>C0002B04 C00017CC C0133504 C0000224
>Kernel panic: Attempted to kill the idle task!
>In idle task - not syncing
>  <0>Rebooting in 180 seconds..

RML patches doesn't support 2_4_devel tree very well (and especially PPC440).

If irq.c:575 correspond to preempt_intercept function in your tree, it
should look like:

#ifdef CONFIG_PREEMPT
int
preempt_intercept(struct pt_regs *regs)
{
         int ret;

         preempt_disable();

         switch(regs->trap) {
         case 0x500:
                 ret = do_IRQ(regs);
                 break;
#if !defined(CONFIG_4xx) || defined(CONFIG_440)
         case 0x900:
#else
         case 0x1000:
#endif
                 ret = timer_interrupt(regs);
                 break;
         default:
                 BUG();
         }

         preempt_enable_no_resched();
         return ret;
}
#endif /* CONFIG_PREEMPT */


Please, note additional "defined(CONFIG_440)"

Eugene


** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/





More information about the Linuxppc-embedded mailing list