diff options
| -rw-r--r-- | arch/ia64/kernel/mca.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c index ee7eec9ee576..23d54413c006 100644 --- a/arch/ia64/kernel/mca.c +++ b/arch/ia64/kernel/mca.c | |||
| @@ -908,7 +908,7 @@ no_mod: | |||
| 908 | static void | 908 | static void |
| 909 | ia64_wait_for_slaves(int monarch) | 909 | ia64_wait_for_slaves(int monarch) |
| 910 | { | 910 | { |
| 911 | int c, wait = 0; | 911 | int c, wait = 0, missing = 0; |
| 912 | for_each_online_cpu(c) { | 912 | for_each_online_cpu(c) { |
| 913 | if (c == monarch) | 913 | if (c == monarch) |
| 914 | continue; | 914 | continue; |
| @@ -919,15 +919,32 @@ ia64_wait_for_slaves(int monarch) | |||
| 919 | } | 919 | } |
| 920 | } | 920 | } |
| 921 | if (!wait) | 921 | if (!wait) |
| 922 | return; | 922 | goto all_in; |
| 923 | for_each_online_cpu(c) { | 923 | for_each_online_cpu(c) { |
| 924 | if (c == monarch) | 924 | if (c == monarch) |
| 925 | continue; | 925 | continue; |
| 926 | if (ia64_mc_info.imi_rendez_checkin[c] == IA64_MCA_RENDEZ_CHECKIN_NOTDONE) { | 926 | if (ia64_mc_info.imi_rendez_checkin[c] == IA64_MCA_RENDEZ_CHECKIN_NOTDONE) { |
| 927 | udelay(5*1000000); /* wait 5 seconds for slaves (arbitrary) */ | 927 | udelay(5*1000000); /* wait 5 seconds for slaves (arbitrary) */ |
| 928 | if (ia64_mc_info.imi_rendez_checkin[c] == IA64_MCA_RENDEZ_CHECKIN_NOTDONE) | ||
| 929 | missing = 1; | ||
| 928 | break; | 930 | break; |
| 929 | } | 931 | } |
| 930 | } | 932 | } |
| 933 | if (!missing) | ||
| 934 | goto all_in; | ||
| 935 | printk(KERN_INFO "OS MCA slave did not rendezvous on cpu"); | ||
| 936 | for_each_online_cpu(c) { | ||
| 937 | if (c == monarch) | ||
| 938 | continue; | ||
| 939 | if (ia64_mc_info.imi_rendez_checkin[c] == IA64_MCA_RENDEZ_CHECKIN_NOTDONE) | ||
| 940 | printk(" %d", c); | ||
| 941 | } | ||
| 942 | printk("\n"); | ||
| 943 | return; | ||
| 944 | |||
| 945 | all_in: | ||
| 946 | printk(KERN_INFO "All OS MCA slaves have reached rendezvous\n"); | ||
| 947 | return; | ||
| 931 | } | 948 | } |
| 932 | 949 | ||
| 933 | /* | 950 | /* |
| @@ -953,6 +970,10 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw, | |||
| 953 | task_t *previous_current; | 970 | task_t *previous_current; |
| 954 | 971 | ||
| 955 | oops_in_progress = 1; /* FIXME: make printk NMI/MCA/INIT safe */ | 972 | oops_in_progress = 1; /* FIXME: make printk NMI/MCA/INIT safe */ |
| 973 | console_loglevel = 15; /* make sure printks make it to console */ | ||
| 974 | printk(KERN_INFO "Entered OS MCA handler. PSP=%lx cpu=%d monarch=%ld\n", | ||
| 975 | sos->proc_state_param, cpu, sos->monarch); | ||
| 976 | |||
| 956 | previous_current = ia64_mca_modify_original_stack(regs, sw, sos, "MCA"); | 977 | previous_current = ia64_mca_modify_original_stack(regs, sw, sos, "MCA"); |
| 957 | monarch_cpu = cpu; | 978 | monarch_cpu = cpu; |
| 958 | if (notify_die(DIE_MCA_MONARCH_ENTER, "MCA", regs, 0, 0, 0) | 979 | if (notify_die(DIE_MCA_MONARCH_ENTER, "MCA", regs, 0, 0, 0) |
