Re: [PATCH] kernel BUG at sched.c:944! only with CONFIG_PREEMPT=y]

From: Steven Cole (elenstev@mesatop.com)
Date: Thu Sep 12 2002 - 15:58:27 EST


On Thu, 2002-09-12 at 14:45, Robert Love wrote:
> On Thu, 2002-09-12 at 16:44, Ingo Molnar wrote:
>
> > it *is* a great debugging check, at zero added cost. Scheduling from an
> > atomic region *is* a critical bug that can and will cause problems in 99%
> > of the cases. Rather fix the asserts that got triggered instead of backing
> > out useful debugging checks ...
>
> There are a lot of shitty drivers that this is going to catch. Yes,
> that is great... but we cannot BUG(). There really are a LOT of them.
> In the least, we need to show_trace().
>
> Anyhow, this currently will catch _all_ kernel preemptions because the
> PREEMPT_ACTIVE flag is set.
>
> We need to do something like the attached (untested), at the very
> least...
>
> I would prefer to make this a kernel debugging check, however. Or, make
> using kernel preemption the default. Using the "free" abilities of
> kernel preemption is great, but not at the expense of its users.
>
> Robert Love
>
> diff -urN linux-2.5.34/kernel/sched.c linux/kernel/sched.c
> --- linux-2.5.34/kernel/sched.c Thu Sep 12 16:26:23 2002
> +++ linux/kernel/sched.c Thu Sep 12 16:42:59 2002
> @@ -940,8 +940,10 @@
> struct list_head *queue;
> int idx;
>
> - if (unlikely(in_atomic()))
> - BUG();
> + if (unlikely(in_atomic() && preempt_count() != PREEMPT_ACTIVE)) {
> + printk(KERN_ERROR "schedule() called while non-atomic!\n");
> + show_stack(NULL);
> + }
>
> #if CONFIG_DEBUG_HIGHMEM
> check_highmem_ptes();
> @@ -959,7 +961,7 @@
> * if entering off of a kernel preemption go straight
> * to picking the next task.
> */
> - if (unlikely(preempt_count() & PREEMPT_ACTIVE))
> + if (unlikely(preempt_count() == PREEMPT_ACTIVE))
> goto pick_next_task;
>
> switch (prev->state) {
>

OK, that patch is tested now. I had to s/KERN_ERROR/KERN_ERR/, but
I was able to get the system to spew out some
"schedule() called while non-atomic!" messages along
with the traces. I can type those into a file and run it through
ksymoops if that would be helpful.

Steven

-
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/



This archive was generated by hypermail 2b29 : Sun Sep 15 2002 - 22:00:30 EST