x86: traps_xx: refactor die() like in x86_64
PATCH 1/2 x86: traps_xx: refactor die() like in x86_64
Make the diff between the traps_32.c and traps_64.c a bit smaller.
Change traps_32.c to look more like traps_64.c:
- move lock information to file scope
- split out oops_begin() and oops_end() from die()
- increment nest counter in oops_begin
Only whitespace change in traps_64.c
Signed-off-by Alexander van Heukelum <[email protected]>
--- arch/x86/kernel/traps_32.c | 95 +++++++++++++++++++++++-------------------- arch/x86/kernel/traps_64.c | 2 +- 2 files changed, 52 insertions(+), 45 deletions(-)
Still, no functional changes intended.
Cyrill Acked "x86: traps_xx: modify default_do_nmi" of my first series. I'm not quite sure if he intended that for the whole set. I welcome him to look at these too patches, though ;).
Created on top of tip/core
Greetings,
Alexander
arch/x86/kernel/traps_32.c +51 -44
@@ -383,6 +383,54 @@ int is_valid_bugaddr(unsigned long ip)return ud2 ==0x0b0f ; } +static raw_spinlock_t die_lock = __RAW_SPIN_LOCK_UNLOCKED; +static int die_owner =-1 ; +static unsigned int die_nest_count; + +unsigned __kprobes long oops_begin (void ) +{ +unsigned long flags; + +oops_enter (); + +if (die_owner !=raw_smp_processor_id ()) { +console_verbose (); +raw_local_irq_save (flags); +__raw_spin_lock (&die_lock); + die_owner =smp_processor_id (); + die_nest_count =0 ; +bust_spinlocks (1 ); + }else { +raw_local_irq_save (flags); + } + die_nest_count++; +return flags; +} + +void __kprobes oops_end (unsigned long flags,struct pt_regs *regs,int signr) +{ +bust_spinlocks (0 ); + die_owner =-1 ; +add_taint (TAINT_DIE ); +__raw_spin_unlock (&die_lock); +raw_local_irq_restore (flags); + +if (!regs) +return ; + +if (kexec_should_crash (current)) +crash_kexec (regs); + +if (in_interrupt ()) +panic ("Fatal exception in interrupt" ); + +if (panic_on_oops) +panic ("Fatal exception" ); + +oops_exit (); +do_exit (signr); +} +int __kprobes __die (const char *str,struct pt_regs *regs,long err) {unsigned short ss;
@@ -423,31 +471,9 @@ int __kprobes __die(const char *str, struct pt_regs *regs, long err)*/ void die (const char *str,struct pt_regs *regs,long err) { -static struct { -raw_spinlock_t lock; -u32 lock_owner; -int lock_owner_depth; - } die = { - .lock = __RAW_SPIN_LOCK_UNLOCKED, - .lock_owner =-1 , - .lock_owner_depth =0 - }; -unsigned long flags; - -oops_enter (); - -if (die.lock_owner !=raw_smp_processor_id ()) { -console_verbose (); -raw_local_irq_save (flags); -__raw_spin_lock (&die.lock); - die.lock_owner =smp_processor_id (); - die.lock_owner_depth =0 ; -bust_spinlocks (1 ); - }else { -raw_local_irq_save (flags); - } +unsigned long flags =oops_begin (); -if (++die.lock_owner_depth <3 ) { +if (die_nest_count <3 ) {report_bug (regs->ip, regs);if (__die (str, regs, err))
@@ -456,26 +482,7 @@ void die(const char *str, struct pt_regs *regs, long err)printk (KERN_EMERG "Recursive die() failure, output suppressed\n" ); } -bust_spinlocks (0 ); - die.lock_owner =-1 ; -add_taint (TAINT_DIE ); -__raw_spin_unlock (&die.lock); -raw_local_irq_restore (flags); - -if (!regs) -return ; - -if (kexec_should_crash (current)) -crash_kexec (regs); - -if (in_interrupt ()) -panic ("Fatal exception in interrupt" ); - -if (panic_on_oops) -panic ("Fatal exception" ); - -oops_exit (); -do_exit (SIGSEGV ); +oops_end (flags, regs,SIGSEGV ); } static inline void
arch/x86/kernel/traps_64.c +1 -1
@@ -541,7 +541,7 @@ unsigned __kprobes long oops_begin(void) }void __kprobes oops_end (unsigned long flags,struct pt_regs *regs,int signr) -{ +{ die_owner =-1 ;bust_spinlocks (0 ); die_nest_count--;
Signature · 1 line
1.5.4.3