Re: 2.6.14-rc3-rt2

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

 



* Steven Rostedt <[email protected]> wrote:

> Hi Ingo,
> 
> I just notice that I get the following output:
> 
> BUG: gdm:4351 task might have lost a preemption check!
>  [<c010433f>] dump_stack+0x1f/0x30 (20)
>  [<c011c06f>] preempt_enable_no_resched+0x5f/0x70 (20)
>  [<c011b6c9>] sys_sched_yield+0x69/0xb0 (24)
>  [<c01033d6>] syscall_call+0x7/0xb (-8116)
> ---------------------------
> | preempt count: 00000000 ]
> | 0-level deep critical section nesting:
> ----------------------------------------
> 
> ------------------------------
> | showing all locks held by: |  (gdm/4351 [dbb727a0, 118]):
> ------------------------------
> 
> 
> I looked at this a little and the offending code is here in
> sys_sched_yield:
> 
> 	/*
> 	 * Since we are going to call schedule() anyway, there's
> 	 * no need to preempt or enable interrupts:
> 	 */
> 	spin_unlock_no_resched(&rq->lock);
> 
> 	__schedule();
> 
> So what's the reason for the message?  Is it to detect when a 
> preemption count goes to zero and isn't rescheduled?  At least in this 
> part of the kernel it's ok because it is just about to call schedule.  
> So is there some way to flag this call to not produce the message?  
> Since the message is only outputed once, it seems useless if it only 
> gets outputted on a false positive.

the patch below should solve this. I've added the warning to 
preempt_enable_no_resched() because we had bugs in this area, and i 
wanted to have a chance to review all 'potentially problematic' places.  
So i'm changing them to __preempt_enable_no_resched() when they turn out 
to be safe. (In the future we'll likely remove the debugging message and 
get rid of __preempt_enable_no_resched().)

	Ingo

Index: linux/include/linux/spinlock_api_up.h
===================================================================
--- linux.orig/include/linux/spinlock_api_up.h
+++ linux/include/linux/spinlock_api_up.h
@@ -45,7 +45,7 @@
   do { preempt_enable(); __release(lock); (void)(lock); } while (0)
 
 #define __UNLOCK_NO_RESCHED(lock) \
-  do { preempt_enable_no_resched(); __release(lock); (void)(lock); } while (0)
+  do { __preempt_enable_no_resched(); __release(lock); (void)(lock); } while (0)
 
 #define __UNLOCK_BH(lock) \
   do { preempt_enable_no_resched(); local_bh_enable(); __release(lock); (void)(lock); } while (0)
-
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