From f18b8e79e95ca2c0a84fdc9161a2be2e4f467d25 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Tue, 13 Jan 2009 23:36:34 +0100 Subject: [PATCH] --- yaml --- r: 131469 b: refs/heads/master c: be716615fe596ee117292dc615e95f707fb67fd1 h: refs/heads/master i: 131467: 5fe38d73478005a8903f27a6ebbe77d5dcd14024 v: v3 --- [refs] | 2 +- trunk/arch/x86/kernel/traps.c | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 60e72abecad5..0b5caf86ba98 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e49590b6dd356f8ef10ba3531a29e5086f6f2e3a +refs/heads/master: be716615fe596ee117292dc615e95f707fb67fd1 diff --git a/trunk/arch/x86/kernel/traps.c b/trunk/arch/x86/kernel/traps.c index 7932338d7cb3..a9e7548e1790 100644 --- a/trunk/arch/x86/kernel/traps.c +++ b/trunk/arch/x86/kernel/traps.c @@ -99,6 +99,12 @@ static inline void preempt_conditional_sti(struct pt_regs *regs) 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 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) #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