2009-01-11 14:02:47

by Rafael J. Wysocki

[permalink] [raw]
Subject: [Bug #12393] debugging in dosemu causes lots of 'scheduling while atomic'

This message has been generated automatically as a part of a report
of regressions introduced between 2.6.27 and 2.6.28.

The following bug entry is on the current list of known regressions
introduced between 2.6.27 and 2.6.28. Please verify if it still should
be listed and let me know (either way).


Bug-Entry : http://bugzilla.kernel.org/show_bug.cgi?id=12393
Subject : debugging in dosemu causes lots of 'scheduling while atomic'
Submitter : Michal Suchanek <[email protected]>
Date : 2009-01-09 07:28 (3 days old)


2009-01-13 22:37:30

by Thomas Gleixner

[permalink] [raw]
Subject: [PATCH] x86: vm86: fix preemption bug

Impact: fix scheduling while atomic bug

commit 3d2a71a596bd9c761c8487a2178e95f8a61da083 (x86, traps: converge
do_debug handlers) changed the preemption disable logic of do_debug()
so vm86_handle_trap() is called with preemption disabled resulting in:

BUG: sleeping function called from invalid context at include/linux/kernel.h:155
in_atomic(): 1, irqs_disabled(): 0, pid: 3005, name: dosemu.bin
Pid: 3005, comm: dosemu.bin Tainted: G W 2.6.29-rc1 #51
Call Trace:
[<c050d669>] copy_to_user+0x33/0x108
[<c04181f4>] save_v86_state+0x65/0x149
[<c0418531>] handle_vm86_trap+0x20/0x8f
[<c064e345>] do_debug+0x15b/0x1a4
[<c064df1f>] debug_stack_correct+0x27/0x2c
[<c040365b>] sysenter_do_call+0x12/0x2f
BUG: scheduling while atomic: dosemu.bin/3005/0x10000001

Restore the original calling convention and reenable preemption before
calling handle_vm86_trap().

Reported-by: Michal Suchanek <[email protected]>
Cc: [email protected]
Signed-off-by: Thomas Gleixner <[email protected]>
---
arch/x86/kernel/traps.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)

Index: linux-2.6/arch/x86/kernel/traps.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/traps.c
+++ linux-2.6/arch/x86/kernel/traps.c
@@ -99,6 +99,12 @@ static inline void preempt_conditional_s
local_irq_enable();
}

+static inline void conditional_cli(struct pt_regs *regs)
+{
+ if (regs->flags & X86_EFLAGS_IF)
+ local_irq_disable();
+}
+
static inline void preempt_conditional_cli(struct pt_regs *regs)
{
if (regs->flags & X86_EFLAGS_IF)
@@ -626,8 +632,10 @@ clear_dr7:

#ifdef CONFIG_X86_32
debug_vm86:
+ /* reenable preemption: handle_vm86_trap() might sleep */
+ dec_preempt_count();
handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code, 1);
- preempt_conditional_cli(regs);
+ conditional_cli(regs);
return;
#endif

2009-01-19 14:56:30

by Michal Suchanek

[permalink] [raw]
Subject: Re: [PATCH] x86: vm86: fix preemption bug

On 13/01/2009, Thomas Gleixner <[email protected]> wrote:
> Impact: fix scheduling while atomic bug
>
> commit 3d2a71a596bd9c761c8487a2178e95f8a61da083 (x86, traps: converge
> do_debug handlers) changed the preemption disable logic of do_debug()
> so vm86_handle_trap() is called with preemption disabled resulting in:
>

The patch seems to fix the the problem for me.

However, the patch does not apply automatically neither to 2.6.28 nor
2.6.29-rc1.

Thanks

Michal