Re: rt20 patch question

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 10 May 2006, Mark Hounschell wrote:

>
> Configured for "Preempable Kernel" I got the following but no "stops"
> came with it.
>
> BUG: scheduling while atomic: softirq-timer/1/0x00000100/15
> caller is schedule+0x33/0xf0
>  [<b0309acc>] __schedule+0x517/0x95b (8)
>  [<f09d7627>] mdio_ctrl+0xaa/0x135 [e100] (48)
>  [<f09d7627>] mdio_ctrl+0xaa/0x135 [e100] (12)
>  [<b030a06c>] schedule+0x33/0xf0 (36)
>  [<b012eee5>] prepare_to_wait+0x12/0x4f (8)
>  [<b0142318>] synchronize_irq+0x96/0xba (20)
>  [<b012eda0>] autoremove_wake_function+0x0/0x37 (12)
>  [<f0a13677>] vortex_timer+0xa0/0x563 [3c59x] (24)
>  [<b0125b76>] __mod_timer+0x8c/0xc3 (12)
>  [<f09d8998>] e100_watchdog+0x0/0x39c [e100] (24)
>  [<b030a4cf>] cond_resched_softirq+0x64/0xaa (8)
>  [<b02a2dcd>] dev_watchdog+0x77/0xac (4)
>  [<f0a135d7>] vortex_timer+0x0/0x563 [3c59x] (12)
>  [<b0125902>] run_timer_softirq+0x1bf/0x3a7 (8)
>  [<b0121960>] ksoftirqd+0x112/0x1cc (52)
>  [<b012184e>] ksoftirqd+0x0/0x1cc (52)
>  [<b012eb9c>] kthread+0xc2/0xc6 (4)
>  [<b012eada>] kthread+0x0/0xc6 (12)
>  [<b0100e35>] kernel_thread_helper+0x5/0xb (16)
>

Ingo,

I traced this down.  It is caused by the disable_irq in vortex_timer that
is called via run_timer_softirq.

disable_irq can call synchronize_irq which can schedule.

And thus you get this bug since we are in a softirq.

This is the case where we are not in PREEMPT_RT but I'm guessing that Mark
has interrupts has threads. Which would allow for synchronize_irq to
schedule.

So I guess we have a case that we can schedule, but while atomic and BUG
when it's really not bad.  Should we add something like this:

Index: linux-2.6.16-rt20/kernel/sched.c
===================================================================
--- linux-2.6.16-rt20.orig/kernel/sched.c	2006-05-10 16:23:15.000000000 -0400
+++ linux-2.6.16-rt20/kernel/sched.c	2006-05-10 16:28:31.000000000 -0400
@@ -3316,7 +3316,8 @@ void __sched __schedule(void)
 	/*
 	 * Test if we are atomic.
 	 */
-	if (unlikely(in_atomic())) {
+	if (unlikely(in_atomic()) &&
+	    (!hardirq_preemption || preempt_count() & PREEMPT_MASK)) {
 		stop_trace();
 		printk(KERN_ERR "BUG: scheduling while atomic: "
 			"%s/0x%08x/%d\n",


-- Steve

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux