Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=c0a698b7443a9fce76b0a849f06c45ac78f3b0a0
Commit:     c0a698b7443a9fce76b0a849f06c45ac78f3b0a0
Parent:     faa4877f023bafa35239d411b160955dc0629fe9
Author:     Ingo Molnar <[EMAIL PROTECTED]>
AuthorDate: Fri Dec 21 01:27:19 2007 +0100
Committer:  Ingo Molnar <[EMAIL PROTECTED]>
CommitDate: Fri Dec 21 01:27:19 2007 +0100

    x86: fix die() to not be preemptible
    
    Andrew "Eagle Eye" Morton noticed that we use raw_local_save_flags()
    instead of raw_local_irq_save(flags) in die(). This allows the
    preemption of oopsing contexts - which is highly undesirable. It also
    causes CONFIG_DEBUG_PREEMPT to complain, as reported by Miles Lane.
    
    this bug was introduced via:
    
      commit 39743c9ef717fd4f2b5583f010115c5f2482b8ae
      Author: Andi Kleen <[EMAIL PROTECTED]>
      Date:   Fri Oct 19 20:35:03 2007 +0200
    
          x86: use raw locks during oopses
    
    -               spin_lock_irqsave(&die.lock, flags);
    +               __raw_spin_lock(&die.lock);
    +               raw_local_save_flags(flags);
    
    that is not a correct open-coding of spin_lock_irqsave(): both the
    ordering is wrong (irqs should be disabled _first_), and the wrong
    flags-saving API was used.
    
    Signed-off-by: Ingo Molnar <[EMAIL PROTECTED]>
---
 arch/x86/kernel/traps_32.c |    7 +++----
 1 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/arch/x86/kernel/traps_32.c b/arch/x86/kernel/traps_32.c
index ef60102..c88bbff 100644
--- a/arch/x86/kernel/traps_32.c
+++ b/arch/x86/kernel/traps_32.c
@@ -373,14 +373,13 @@ void die(const char * str, struct pt_regs * regs, long 
err)
 
        if (die.lock_owner != raw_smp_processor_id()) {
                console_verbose();
+               raw_local_irq_save(flags);
                __raw_spin_lock(&die.lock);
-               raw_local_save_flags(flags);
                die.lock_owner = smp_processor_id();
                die.lock_owner_depth = 0;
                bust_spinlocks(1);
-       }
-       else
-               raw_local_save_flags(flags);
+       } else
+               raw_local_irq_save(flags);
 
        if (++die.lock_owner_depth < 3) {
                unsigned long esp;
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to