diff options
| -rw-r--r-- | arch/x86/kernel/apic/nmi.c | 11 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/amd.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/centaur.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/common.c | 30 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/cpu.h | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/cyrix.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/intel_cacheinfo.c | 16 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/transmeta.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/dumpstack_32.c | 9 | ||||
| -rw-r--r-- | arch/x86/kernel/dumpstack_64.c | 46 | ||||
| -rw-r--r-- | arch/x86/kernel/process_32.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/process_64.c | 3 | ||||
| -rw-r--r-- | arch/x86/kernel/tsc_sync.c | 13 | ||||
| -rw-r--r-- | arch/x86/mm/fault.c | 2 |
14 files changed, 67 insertions, 75 deletions
diff --git a/arch/x86/kernel/apic/nmi.c b/arch/x86/kernel/apic/nmi.c index 7ff61d6a188a..6389432a9dbf 100644 --- a/arch/x86/kernel/apic/nmi.c +++ b/arch/x86/kernel/apic/nmi.c | |||
| @@ -39,7 +39,8 @@ | |||
| 39 | int unknown_nmi_panic; | 39 | int unknown_nmi_panic; |
| 40 | int nmi_watchdog_enabled; | 40 | int nmi_watchdog_enabled; |
| 41 | 41 | ||
| 42 | static cpumask_t backtrace_mask __read_mostly; | 42 | /* For reliability, we're prepared to waste bits here. */ |
| 43 | static DECLARE_BITMAP(backtrace_mask, NR_CPUS) __read_mostly; | ||
| 43 | 44 | ||
| 44 | /* nmi_active: | 45 | /* nmi_active: |
| 45 | * >0: the lapic NMI watchdog is active, but can be disabled | 46 | * >0: the lapic NMI watchdog is active, but can be disabled |
| @@ -414,7 +415,7 @@ nmi_watchdog_tick(struct pt_regs *regs, unsigned reason) | |||
| 414 | } | 415 | } |
| 415 | 416 | ||
| 416 | /* We can be called before check_nmi_watchdog, hence NULL check. */ | 417 | /* We can be called before check_nmi_watchdog, hence NULL check. */ |
| 417 | if (cpumask_test_cpu(cpu, &backtrace_mask)) { | 418 | if (cpumask_test_cpu(cpu, to_cpumask(backtrace_mask))) { |
| 418 | static DEFINE_SPINLOCK(lock); /* Serialise the printks */ | 419 | static DEFINE_SPINLOCK(lock); /* Serialise the printks */ |
| 419 | 420 | ||
| 420 | spin_lock(&lock); | 421 | spin_lock(&lock); |
| @@ -422,7 +423,7 @@ nmi_watchdog_tick(struct pt_regs *regs, unsigned reason) | |||
| 422 | show_regs(regs); | 423 | show_regs(regs); |
| 423 | dump_stack(); | 424 | dump_stack(); |
| 424 | spin_unlock(&lock); | 425 | spin_unlock(&lock); |
| 425 | cpumask_clear_cpu(cpu, &backtrace_mask); | 426 | cpumask_clear_cpu(cpu, to_cpumask(backtrace_mask)); |
| 426 | 427 | ||
| 427 | rc = 1; | 428 | rc = 1; |
| 428 | } | 429 | } |
| @@ -558,14 +559,14 @@ void arch_trigger_all_cpu_backtrace(void) | |||
| 558 | { | 559 | { |
| 559 | int i; | 560 | int i; |
| 560 | 561 | ||
| 561 | cpumask_copy(&backtrace_mask, cpu_online_mask); | 562 | cpumask_copy(to_cpumask(backtrace_mask), cpu_online_mask); |
| 562 | 563 | ||
| 563 | printk(KERN_INFO "sending NMI to all CPUs:\n"); | 564 | printk(KERN_INFO "sending NMI to all CPUs:\n"); |
| 564 | apic->send_IPI_all(NMI_VECTOR); | 565 | apic->send_IPI_all(NMI_VECTOR); |
| 565 | 566 | ||
| 566 | /* Wait for up to 10 seconds for all CPUs to do the backtrace */ | 567 | /* Wait for up to 10 seconds for all CPUs to do the backtrace */ |
| 567 | for (i = 0; i < 10 * 1000; i++) { | 568 | for (i = 0; i < 10 * 1000; i++) { |
| 568 | if (cpumask_empty(&backtrace_mask)) | 569 | if (cpumask_empty(to_cpumask(backtrace_mask))) |
| 569 | break; | 570 | break; |
| 570 | mdelay(1); | 571 | mdelay(1); |
| 571 | } | 572 | } |
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index c910a716a71c..7128b3799cec 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c | |||
| @@ -535,7 +535,7 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c) | |||
| 535 | } | 535 | } |
| 536 | } | 536 | } |
| 537 | 537 | ||
| 538 | display_cacheinfo(c); | 538 | cpu_detect_cache_sizes(c); |
| 539 | 539 | ||
| 540 | /* Multi core CPU? */ | 540 | /* Multi core CPU? */ |
| 541 | if (c->extended_cpuid_level >= 0x80000008) { | 541 | if (c->extended_cpuid_level >= 0x80000008) { |
diff --git a/arch/x86/kernel/cpu/centaur.c b/arch/x86/kernel/cpu/centaur.c index c95e831bb095..e58d978e0758 100644 --- a/arch/x86/kernel/cpu/centaur.c +++ b/arch/x86/kernel/cpu/centaur.c | |||
| @@ -294,7 +294,7 @@ static void __cpuinit init_c3(struct cpuinfo_x86 *c) | |||
| 294 | set_cpu_cap(c, X86_FEATURE_REP_GOOD); | 294 | set_cpu_cap(c, X86_FEATURE_REP_GOOD); |
| 295 | } | 295 | } |
| 296 | 296 | ||
| 297 | display_cacheinfo(c); | 297 | cpu_detect_cache_sizes(c); |
| 298 | } | 298 | } |
| 299 | 299 | ||
| 300 | enum { | 300 | enum { |
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 9053be5d95cd..a4ec8b647544 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
| @@ -61,7 +61,7 @@ void __init setup_cpu_local_masks(void) | |||
| 61 | static void __cpuinit default_init(struct cpuinfo_x86 *c) | 61 | static void __cpuinit default_init(struct cpuinfo_x86 *c) |
| 62 | { | 62 | { |
| 63 | #ifdef CONFIG_X86_64 | 63 | #ifdef CONFIG_X86_64 |
| 64 | display_cacheinfo(c); | 64 | cpu_detect_cache_sizes(c); |
| 65 | #else | 65 | #else |
| 66 | /* Not much we can do here... */ | 66 | /* Not much we can do here... */ |
| 67 | /* Check if at least it has cpuid */ | 67 | /* Check if at least it has cpuid */ |
| @@ -383,7 +383,7 @@ static void __cpuinit get_model_name(struct cpuinfo_x86 *c) | |||
| 383 | } | 383 | } |
| 384 | } | 384 | } |
| 385 | 385 | ||
| 386 | void __cpuinit display_cacheinfo(struct cpuinfo_x86 *c) | 386 | void __cpuinit cpu_detect_cache_sizes(struct cpuinfo_x86 *c) |
| 387 | { | 387 | { |
| 388 | unsigned int n, dummy, ebx, ecx, edx, l2size; | 388 | unsigned int n, dummy, ebx, ecx, edx, l2size; |
| 389 | 389 | ||
| @@ -391,8 +391,6 @@ void __cpuinit display_cacheinfo(struct cpuinfo_x86 *c) | |||
| 391 | 391 | ||
| 392 | if (n >= 0x80000005) { | 392 | if (n >= 0x80000005) { |
| 393 | cpuid(0x80000005, &dummy, &ebx, &ecx, &edx); | 393 | cpuid(0x80000005, &dummy, &ebx, &ecx, &edx); |
| 394 | printk(KERN_INFO "CPU: L1 I Cache: %dK (%d bytes/line), D cache %dK (%d bytes/line)\n", | ||
| 395 | edx>>24, edx&0xFF, ecx>>24, ecx&0xFF); | ||
| 396 | c->x86_cache_size = (ecx>>24) + (edx>>24); | 394 | c->x86_cache_size = (ecx>>24) + (edx>>24); |
| 397 | #ifdef CONFIG_X86_64 | 395 | #ifdef CONFIG_X86_64 |
| 398 | /* On K8 L1 TLB is inclusive, so don't count it */ | 396 | /* On K8 L1 TLB is inclusive, so don't count it */ |
| @@ -422,9 +420,6 @@ void __cpuinit display_cacheinfo(struct cpuinfo_x86 *c) | |||
| 422 | #endif | 420 | #endif |
| 423 | 421 | ||
| 424 | c->x86_cache_size = l2size; | 422 | c->x86_cache_size = l2size; |
| 425 | |||
| 426 | printk(KERN_INFO "CPU: L2 Cache: %dK (%d bytes/line)\n", | ||
| 427 | l2size, ecx & 0xFF); | ||
| 428 | } | 423 | } |
| 429 | 424 | ||
| 430 | void __cpuinit detect_ht(struct cpuinfo_x86 *c) | 425 | void __cpuinit detect_ht(struct cpuinfo_x86 *c) |
| @@ -659,24 +654,31 @@ void __init early_cpu_init(void) | |||
| 659 | const struct cpu_dev *const *cdev; | 654 | const struct cpu_dev *const *cdev; |
| 660 | int count = 0; | 655 | int count = 0; |
| 661 | 656 | ||
| 657 | #ifdef PROCESSOR_SELECT | ||
| 662 | printk(KERN_INFO "KERNEL supported cpus:\n"); | 658 | printk(KERN_INFO "KERNEL supported cpus:\n"); |
| 659 | #endif | ||
| 660 | |||
| 663 | for (cdev = __x86_cpu_dev_start; cdev < __x86_cpu_dev_end; cdev++) { | 661 | for (cdev = __x86_cpu_dev_start; cdev < __x86_cpu_dev_end; cdev++) { |
| 664 | const struct cpu_dev *cpudev = *cdev; | 662 | const struct cpu_dev *cpudev = *cdev; |
| 665 | unsigned int j; | ||
| 666 | 663 | ||
| 667 | if (count >= X86_VENDOR_NUM) | 664 | if (count >= X86_VENDOR_NUM) |
| 668 | break; | 665 | break; |
| 669 | cpu_devs[count] = cpudev; | 666 | cpu_devs[count] = cpudev; |
| 670 | count++; | 667 | count++; |
| 671 | 668 | ||
| 672 | for (j = 0; j < 2; j++) { | 669 | #ifdef PROCESSOR_SELECT |
| 673 | if (!cpudev->c_ident[j]) | 670 | { |
| 674 | continue; | 671 | unsigned int j; |
| 675 | printk(KERN_INFO " %s %s\n", cpudev->c_vendor, | 672 | |
| 676 | cpudev->c_ident[j]); | 673 | for (j = 0; j < 2; j++) { |
| 674 | if (!cpudev->c_ident[j]) | ||
| 675 | continue; | ||
| 676 | printk(KERN_INFO " %s %s\n", cpudev->c_vendor, | ||
| 677 | cpudev->c_ident[j]); | ||
| 678 | } | ||
| 677 | } | 679 | } |
| 680 | #endif | ||
| 678 | } | 681 | } |
| 679 | |||
| 680 | early_identify_cpu(&boot_cpu_data); | 682 | early_identify_cpu(&boot_cpu_data); |
| 681 | } | 683 | } |
| 682 | 684 | ||
diff --git a/arch/x86/kernel/cpu/cpu.h b/arch/x86/kernel/cpu/cpu.h index 6de9a908e400..3624e8a0f71b 100644 --- a/arch/x86/kernel/cpu/cpu.h +++ b/arch/x86/kernel/cpu/cpu.h | |||
| @@ -32,6 +32,6 @@ struct cpu_dev { | |||
| 32 | extern const struct cpu_dev *const __x86_cpu_dev_start[], | 32 | extern const struct cpu_dev *const __x86_cpu_dev_start[], |
| 33 | *const __x86_cpu_dev_end[]; | 33 | *const __x86_cpu_dev_end[]; |
| 34 | 34 | ||
| 35 | extern void display_cacheinfo(struct cpuinfo_x86 *c); | 35 | extern void cpu_detect_cache_sizes(struct cpuinfo_x86 *c); |
| 36 | 36 | ||
| 37 | #endif | 37 | #endif |
diff --git a/arch/x86/kernel/cpu/cyrix.c b/arch/x86/kernel/cpu/cyrix.c index 19807b89f058..4fbd384fb645 100644 --- a/arch/x86/kernel/cpu/cyrix.c +++ b/arch/x86/kernel/cpu/cyrix.c | |||
| @@ -373,7 +373,7 @@ static void __cpuinit init_nsc(struct cpuinfo_x86 *c) | |||
| 373 | /* Handle the GX (Formally known as the GX2) */ | 373 | /* Handle the GX (Formally known as the GX2) */ |
| 374 | 374 | ||
| 375 | if (c->x86 == 5 && c->x86_model == 5) | 375 | if (c->x86 == 5 && c->x86_model == 5) |
| 376 | display_cacheinfo(c); | 376 | cpu_detect_cache_sizes(c); |
| 377 | else | 377 | else |
| 378 | init_cyrix(c); | 378 | init_cyrix(c); |
| 379 | } | 379 | } |
diff --git a/arch/x86/kernel/cpu/intel_cacheinfo.c b/arch/x86/kernel/cpu/intel_cacheinfo.c index 804c40e2bc3e..0df4c2b7107f 100644 --- a/arch/x86/kernel/cpu/intel_cacheinfo.c +++ b/arch/x86/kernel/cpu/intel_cacheinfo.c | |||
| @@ -488,22 +488,6 @@ unsigned int __cpuinit init_intel_cacheinfo(struct cpuinfo_x86 *c) | |||
| 488 | #endif | 488 | #endif |
| 489 | } | 489 | } |
| 490 | 490 | ||
| 491 | if (trace) | ||
| 492 | printk(KERN_INFO "CPU: Trace cache: %dK uops", trace); | ||
| 493 | else if (l1i) | ||
| 494 | printk(KERN_INFO "CPU: L1 I cache: %dK", l1i); | ||
| 495 | |||
| 496 | if (l1d) | ||
| 497 | printk(KERN_CONT ", L1 D cache: %dK\n", l1d); | ||
| 498 | else | ||
| 499 | printk(KERN_CONT "\n"); | ||
| 500 | |||
| 501 | if (l2) | ||
| 502 | printk(KERN_INFO "CPU: L2 cache: %dK\n", l2); | ||
| 503 | |||
| 504 | if (l3) | ||
| 505 | printk(KERN_INFO "CPU: L3 cache: %dK\n", l3); | ||
| 506 | |||
| 507 | c->x86_cache_size = l3 ? l3 : (l2 ? l2 : (l1i+l1d)); | 491 | c->x86_cache_size = l3 ? l3 : (l2 ? l2 : (l1i+l1d)); |
| 508 | 492 | ||
| 509 | return l2; | 493 | return l2; |
diff --git a/arch/x86/kernel/cpu/transmeta.c b/arch/x86/kernel/cpu/transmeta.c index bb62b3e5caad..28000743bbb0 100644 --- a/arch/x86/kernel/cpu/transmeta.c +++ b/arch/x86/kernel/cpu/transmeta.c | |||
| @@ -26,7 +26,7 @@ static void __cpuinit init_transmeta(struct cpuinfo_x86 *c) | |||
| 26 | 26 | ||
| 27 | early_init_transmeta(c); | 27 | early_init_transmeta(c); |
| 28 | 28 | ||
| 29 | display_cacheinfo(c); | 29 | cpu_detect_cache_sizes(c); |
| 30 | 30 | ||
| 31 | /* Print CMS and CPU revision */ | 31 | /* Print CMS and CPU revision */ |
| 32 | max = cpuid_eax(0x80860000); | 32 | max = cpuid_eax(0x80860000); |
diff --git a/arch/x86/kernel/dumpstack_32.c b/arch/x86/kernel/dumpstack_32.c index f7dd2a7c3bf4..e0ed4c7abb62 100644 --- a/arch/x86/kernel/dumpstack_32.c +++ b/arch/x86/kernel/dumpstack_32.c | |||
| @@ -10,9 +10,9 @@ | |||
| 10 | #include <linux/module.h> | 10 | #include <linux/module.h> |
| 11 | #include <linux/ptrace.h> | 11 | #include <linux/ptrace.h> |
| 12 | #include <linux/kexec.h> | 12 | #include <linux/kexec.h> |
| 13 | #include <linux/sysfs.h> | ||
| 13 | #include <linux/bug.h> | 14 | #include <linux/bug.h> |
| 14 | #include <linux/nmi.h> | 15 | #include <linux/nmi.h> |
| 15 | #include <linux/sysfs.h> | ||
| 16 | 16 | ||
| 17 | #include <asm/stacktrace.h> | 17 | #include <asm/stacktrace.h> |
| 18 | 18 | ||
| @@ -35,6 +35,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, | |||
| 35 | 35 | ||
| 36 | if (!stack) { | 36 | if (!stack) { |
| 37 | unsigned long dummy; | 37 | unsigned long dummy; |
| 38 | |||
| 38 | stack = &dummy; | 39 | stack = &dummy; |
| 39 | if (task && task != current) | 40 | if (task && task != current) |
| 40 | stack = (unsigned long *)task->thread.sp; | 41 | stack = (unsigned long *)task->thread.sp; |
| @@ -57,8 +58,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, | |||
| 57 | 58 | ||
| 58 | context = (struct thread_info *) | 59 | context = (struct thread_info *) |
| 59 | ((unsigned long)stack & (~(THREAD_SIZE - 1))); | 60 | ((unsigned long)stack & (~(THREAD_SIZE - 1))); |
| 60 | bp = print_context_stack(context, stack, bp, ops, | 61 | bp = print_context_stack(context, stack, bp, ops, data, NULL, &graph); |
| 61 | data, NULL, &graph); | ||
| 62 | 62 | ||
| 63 | stack = (unsigned long *)context->previous_esp; | 63 | stack = (unsigned long *)context->previous_esp; |
| 64 | if (!stack) | 64 | if (!stack) |
| @@ -72,7 +72,7 @@ EXPORT_SYMBOL(dump_trace); | |||
| 72 | 72 | ||
| 73 | void | 73 | void |
| 74 | show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, | 74 | show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, |
| 75 | unsigned long *sp, unsigned long bp, char *log_lvl) | 75 | unsigned long *sp, unsigned long bp, char *log_lvl) |
| 76 | { | 76 | { |
| 77 | unsigned long *stack; | 77 | unsigned long *stack; |
| 78 | int i; | 78 | int i; |
| @@ -156,4 +156,3 @@ int is_valid_bugaddr(unsigned long ip) | |||
| 156 | 156 | ||
| 157 | return ud2 == 0x0b0f; | 157 | return ud2 == 0x0b0f; |
| 158 | } | 158 | } |
| 159 | |||
diff --git a/arch/x86/kernel/dumpstack_64.c b/arch/x86/kernel/dumpstack_64.c index a071e6be177e..8e740934bd1f 100644 --- a/arch/x86/kernel/dumpstack_64.c +++ b/arch/x86/kernel/dumpstack_64.c | |||
| @@ -10,26 +10,28 @@ | |||
| 10 | #include <linux/module.h> | 10 | #include <linux/module.h> |
| 11 | #include <linux/ptrace.h> | 11 | #include <linux/ptrace.h> |
| 12 | #include <linux/kexec.h> | 12 | #include <linux/kexec.h> |
| 13 | #include <linux/sysfs.h> | ||
| 13 | #include <linux/bug.h> | 14 | #include <linux/bug.h> |
| 14 | #include <linux/nmi.h> | 15 | #include <linux/nmi.h> |
| 15 | #include <linux/sysfs.h> | ||
| 16 | 16 | ||
| 17 | #include <asm/stacktrace.h> | 17 | #include <asm/stacktrace.h> |
| 18 | 18 | ||
| 19 | #include "dumpstack.h" | 19 | #include "dumpstack.h" |
| 20 | 20 | ||
| 21 | #define N_EXCEPTION_STACKS_END \ | ||
| 22 | (N_EXCEPTION_STACKS + DEBUG_STKSZ/EXCEPTION_STKSZ - 2) | ||
| 21 | 23 | ||
| 22 | static char x86_stack_ids[][8] = { | 24 | static char x86_stack_ids[][8] = { |
| 23 | [DEBUG_STACK - 1] = "#DB", | 25 | [ DEBUG_STACK-1 ] = "#DB", |
| 24 | [NMI_STACK - 1] = "NMI", | 26 | [ NMI_STACK-1 ] = "NMI", |
| 25 | [DOUBLEFAULT_STACK - 1] = "#DF", | 27 | [ DOUBLEFAULT_STACK-1 ] = "#DF", |
| 26 | [STACKFAULT_STACK - 1] = "#SS", | 28 | [ STACKFAULT_STACK-1 ] = "#SS", |
| 27 | [MCE_STACK - 1] = "#MC", | 29 | [ MCE_STACK-1 ] = "#MC", |
| 28 | #if DEBUG_STKSZ > EXCEPTION_STKSZ | 30 | #if DEBUG_STKSZ > EXCEPTION_STKSZ |
| 29 | [N_EXCEPTION_STACKS ... | 31 | [ N_EXCEPTION_STACKS ... |
| 30 | N_EXCEPTION_STACKS + DEBUG_STKSZ / EXCEPTION_STKSZ - 2] = "#DB[?]" | 32 | N_EXCEPTION_STACKS_END ] = "#DB[?]" |
| 31 | #endif | 33 | #endif |
| 32 | }; | 34 | }; |
| 33 | 35 | ||
| 34 | int x86_is_stack_id(int id, char *name) | 36 | int x86_is_stack_id(int id, char *name) |
| 35 | { | 37 | { |
| @@ -37,7 +39,7 @@ int x86_is_stack_id(int id, char *name) | |||
| 37 | } | 39 | } |
| 38 | 40 | ||
| 39 | static unsigned long *in_exception_stack(unsigned cpu, unsigned long stack, | 41 | static unsigned long *in_exception_stack(unsigned cpu, unsigned long stack, |
| 40 | unsigned *usedp, char **idp) | 42 | unsigned *usedp, char **idp) |
| 41 | { | 43 | { |
| 42 | unsigned k; | 44 | unsigned k; |
| 43 | 45 | ||
| @@ -202,21 +204,24 @@ EXPORT_SYMBOL(dump_trace); | |||
| 202 | 204 | ||
| 203 | void | 205 | void |
| 204 | show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, | 206 | show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, |
| 205 | unsigned long *sp, unsigned long bp, char *log_lvl) | 207 | unsigned long *sp, unsigned long bp, char *log_lvl) |
| 206 | { | 208 | { |
| 209 | unsigned long *irq_stack_end; | ||
| 210 | unsigned long *irq_stack; | ||
| 207 | unsigned long *stack; | 211 | unsigned long *stack; |
| 212 | int cpu; | ||
| 208 | int i; | 213 | int i; |
| 209 | const int cpu = smp_processor_id(); | 214 | |
| 210 | unsigned long *irq_stack_end = | 215 | preempt_disable(); |
| 211 | (unsigned long *)(per_cpu(irq_stack_ptr, cpu)); | 216 | cpu = smp_processor_id(); |
| 212 | unsigned long *irq_stack = | 217 | |
| 213 | (unsigned long *)(per_cpu(irq_stack_ptr, cpu) - IRQ_STACK_SIZE); | 218 | irq_stack_end = (unsigned long *)(per_cpu(irq_stack_ptr, cpu)); |
| 219 | irq_stack = (unsigned long *)(per_cpu(irq_stack_ptr, cpu) - IRQ_STACK_SIZE); | ||
| 214 | 220 | ||
| 215 | /* | 221 | /* |
| 216 | * debugging aid: "show_stack(NULL, NULL);" prints the | 222 | * Debugging aid: "show_stack(NULL, NULL);" prints the |
| 217 | * back trace for this cpu. | 223 | * back trace for this cpu: |
| 218 | */ | 224 | */ |
| 219 | |||
| 220 | if (sp == NULL) { | 225 | if (sp == NULL) { |
| 221 | if (task) | 226 | if (task) |
| 222 | sp = (unsigned long *)task->thread.sp; | 227 | sp = (unsigned long *)task->thread.sp; |
| @@ -240,6 +245,8 @@ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, | |||
| 240 | printk(" %016lx", *stack++); | 245 | printk(" %016lx", *stack++); |
| 241 | touch_nmi_watchdog(); | 246 | touch_nmi_watchdog(); |
| 242 | } | 247 | } |
| 248 | preempt_enable(); | ||
| 249 | |||
| 243 | printk("\n"); | 250 | printk("\n"); |
| 244 | show_trace_log_lvl(task, regs, sp, bp, log_lvl); | 251 | show_trace_log_lvl(task, regs, sp, bp, log_lvl); |
| 245 | } | 252 | } |
| @@ -303,4 +310,3 @@ int is_valid_bugaddr(unsigned long ip) | |||
| 303 | 310 | ||
| 304 | return ud2 == 0x0b0f; | 311 | return ud2 == 0x0b0f; |
| 305 | } | 312 | } |
| 306 | |||
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index 540140284f60..075580b35682 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c | |||
| @@ -188,7 +188,7 @@ void __show_regs(struct pt_regs *regs, int all) | |||
| 188 | 188 | ||
| 189 | void show_regs(struct pt_regs *regs) | 189 | void show_regs(struct pt_regs *regs) |
| 190 | { | 190 | { |
| 191 | __show_regs(regs, 1); | 191 | show_registers(regs); |
| 192 | show_trace(NULL, regs, ®s->sp, regs->bp); | 192 | show_trace(NULL, regs, ®s->sp, regs->bp); |
| 193 | } | 193 | } |
| 194 | 194 | ||
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 70cf15873f3d..a98fe88fab64 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c | |||
| @@ -227,8 +227,7 @@ void __show_regs(struct pt_regs *regs, int all) | |||
| 227 | 227 | ||
| 228 | void show_regs(struct pt_regs *regs) | 228 | void show_regs(struct pt_regs *regs) |
| 229 | { | 229 | { |
| 230 | printk(KERN_INFO "CPU %d:", smp_processor_id()); | 230 | show_registers(regs); |
| 231 | __show_regs(regs, 1); | ||
| 232 | show_trace(NULL, regs, (void *)(regs + 1), regs->bp); | 231 | show_trace(NULL, regs, (void *)(regs + 1), regs->bp); |
| 233 | } | 232 | } |
| 234 | 233 | ||
diff --git a/arch/x86/kernel/tsc_sync.c b/arch/x86/kernel/tsc_sync.c index f37930954d15..eed156851f5d 100644 --- a/arch/x86/kernel/tsc_sync.c +++ b/arch/x86/kernel/tsc_sync.c | |||
| @@ -114,13 +114,12 @@ void __cpuinit check_tsc_sync_source(int cpu) | |||
| 114 | return; | 114 | return; |
| 115 | 115 | ||
| 116 | if (boot_cpu_has(X86_FEATURE_TSC_RELIABLE)) { | 116 | if (boot_cpu_has(X86_FEATURE_TSC_RELIABLE)) { |
| 117 | printk_once(KERN_INFO "Skipping synchronization checks as TSC is reliable.\n"); | 117 | if (cpu == (nr_cpu_ids-1) || system_state != SYSTEM_BOOTING) |
| 118 | pr_info( | ||
| 119 | "Skipped synchronization checks as TSC is reliable.\n"); | ||
| 118 | return; | 120 | return; |
| 119 | } | 121 | } |
| 120 | 122 | ||
| 121 | pr_info("checking TSC synchronization [CPU#%d -> CPU#%d]:", | ||
| 122 | smp_processor_id(), cpu); | ||
| 123 | |||
| 124 | /* | 123 | /* |
| 125 | * Reset it - in case this is a second bootup: | 124 | * Reset it - in case this is a second bootup: |
| 126 | */ | 125 | */ |
| @@ -142,12 +141,14 @@ void __cpuinit check_tsc_sync_source(int cpu) | |||
| 142 | cpu_relax(); | 141 | cpu_relax(); |
| 143 | 142 | ||
| 144 | if (nr_warps) { | 143 | if (nr_warps) { |
| 145 | printk("\n"); | 144 | pr_warning("TSC synchronization [CPU#%d -> CPU#%d]:\n", |
| 145 | smp_processor_id(), cpu); | ||
| 146 | pr_warning("Measured %Ld cycles TSC warp between CPUs, " | 146 | pr_warning("Measured %Ld cycles TSC warp between CPUs, " |
| 147 | "turning off TSC clock.\n", max_warp); | 147 | "turning off TSC clock.\n", max_warp); |
| 148 | mark_tsc_unstable("check_tsc_sync_source failed"); | 148 | mark_tsc_unstable("check_tsc_sync_source failed"); |
| 149 | } else { | 149 | } else { |
| 150 | printk(" passed.\n"); | 150 | pr_debug("TSC synchronization [CPU#%d -> CPU#%d]: passed\n", |
| 151 | smp_processor_id(), cpu); | ||
| 151 | } | 152 | } |
| 152 | 153 | ||
| 153 | /* | 154 | /* |
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 8f4e2ac93928..f62777940dfb 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c | |||
| @@ -659,7 +659,7 @@ no_context(struct pt_regs *regs, unsigned long error_code, | |||
| 659 | show_fault_oops(regs, error_code, address); | 659 | show_fault_oops(regs, error_code, address); |
| 660 | 660 | ||
| 661 | stackend = end_of_stack(tsk); | 661 | stackend = end_of_stack(tsk); |
| 662 | if (*stackend != STACK_END_MAGIC) | 662 | if (tsk != &init_task && *stackend != STACK_END_MAGIC) |
| 663 | printk(KERN_ALERT "Thread overran stack, or stack corrupted\n"); | 663 | printk(KERN_ALERT "Thread overran stack, or stack corrupted\n"); |
| 664 | 664 | ||
| 665 | tsk->thread.cr2 = address; | 665 | tsk->thread.cr2 = address; |
