diff options
author | David S. Miller <davem@davemloft.net> | 2008-08-04 19:47:57 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-08-04 19:47:57 -0400 |
commit | ed4d9c66eb941a416c8cb9a0138c69d46d82fc4f (patch) | |
tree | 0a69005357f3e595268766ee45877451d2b9f85b /arch | |
parent | 90f7ae8a55190f5edfb9fda957e25c994ed39ec4 (diff) |
sparc64: Kill error_mask from hypervisor_xcall_deliver().
It can eat up a lot of stack space when NR_CPUS is large.
We retain some of it's functionality by reporting at least one
of the cpu's which are seen in error state.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/sparc64/kernel/smp.c | 20 |
1 files changed, 7 insertions, 13 deletions
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c index 2387a9b81be7..ac8996ec97be 100644 --- a/arch/sparc64/kernel/smp.c +++ b/arch/sparc64/kernel/smp.c | |||
@@ -626,16 +626,15 @@ retry: | |||
626 | /* Multi-cpu list version. */ | 626 | /* Multi-cpu list version. */ |
627 | static void hypervisor_xcall_deliver(struct trap_per_cpu *tb, int cnt) | 627 | static void hypervisor_xcall_deliver(struct trap_per_cpu *tb, int cnt) |
628 | { | 628 | { |
629 | int retries, this_cpu, prev_sent, i; | 629 | int retries, this_cpu, prev_sent, i, saw_cpu_error; |
630 | unsigned long status; | 630 | unsigned long status; |
631 | cpumask_t error_mask; | ||
632 | u16 *cpu_list; | 631 | u16 *cpu_list; |
633 | 632 | ||
634 | this_cpu = smp_processor_id(); | 633 | this_cpu = smp_processor_id(); |
635 | 634 | ||
636 | cpu_list = __va(tb->cpu_list_pa); | 635 | cpu_list = __va(tb->cpu_list_pa); |
637 | 636 | ||
638 | cpus_clear(error_mask); | 637 | saw_cpu_error = 0; |
639 | retries = 0; | 638 | retries = 0; |
640 | prev_sent = 0; | 639 | prev_sent = 0; |
641 | do { | 640 | do { |
@@ -680,10 +679,9 @@ static void hypervisor_xcall_deliver(struct trap_per_cpu *tb, int cnt) | |||
680 | continue; | 679 | continue; |
681 | 680 | ||
682 | err = sun4v_cpu_state(cpu); | 681 | err = sun4v_cpu_state(cpu); |
683 | if (err >= 0 && | 682 | if (err == HV_CPU_STATE_ERROR) { |
684 | err == HV_CPU_STATE_ERROR) { | 683 | saw_cpu_error = (cpu + 1); |
685 | cpu_list[i] = 0xffff; | 684 | cpu_list[i] = 0xffff; |
686 | cpu_set(cpu, error_mask); | ||
687 | } | 685 | } |
688 | } | 686 | } |
689 | } else if (unlikely(status != HV_EWOULDBLOCK)) | 687 | } else if (unlikely(status != HV_EWOULDBLOCK)) |
@@ -707,19 +705,15 @@ static void hypervisor_xcall_deliver(struct trap_per_cpu *tb, int cnt) | |||
707 | } | 705 | } |
708 | } while (1); | 706 | } while (1); |
709 | 707 | ||
710 | if (unlikely(!cpus_empty(error_mask))) | 708 | if (unlikely(saw_cpu_error)) |
711 | goto fatal_mondo_cpu_error; | 709 | goto fatal_mondo_cpu_error; |
712 | 710 | ||
713 | return; | 711 | return; |
714 | 712 | ||
715 | fatal_mondo_cpu_error: | 713 | fatal_mondo_cpu_error: |
716 | printk(KERN_CRIT "CPU[%d]: SUN4V mondo cpu error, some target cpus " | 714 | printk(KERN_CRIT "CPU[%d]: SUN4V mondo cpu error, some target cpus " |
717 | "were in error state\n", | 715 | "(including %d) were in error state\n", |
718 | this_cpu); | 716 | this_cpu, saw_cpu_error - 1); |
719 | printk(KERN_CRIT "CPU[%d]: Error mask [ ", this_cpu); | ||
720 | for_each_cpu_mask_nr(i, error_mask) | ||
721 | printk("%d ", i); | ||
722 | printk("]\n"); | ||
723 | return; | 717 | return; |
724 | 718 | ||
725 | fatal_mondo_timeout: | 719 | fatal_mondo_timeout: |