lkml.org 
[lkml]   [2005]   [Oct]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: 2.6.14-rc3-rt2

* Steven Rostedt <rostedt@goodmis.org> 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 majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
\
 
 \ /
  Last update: 2005-10-05 16:43    [W:0.160 / U:0.364 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site