aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ia64
diff options
context:
space:
mode:
authorRuss Anderson <rja@sgi.com>2007-09-20 14:59:12 -0400
committerTony Luck <tony.luck@intel.com>2007-10-12 18:17:44 -0400
commit2bc5c282999af41042c2b703bf3a58ca1d7e3ee2 (patch)
treefdf37ff750fdfd410e826945d361add25d60504e /arch/ia64
parent28eda5b8b434b65e5feb0c58a7477f3f290d72d4 (diff)
[IA64] Remove needless delay in MCA rendezvous
While testing the MCA recovery code, noticed that some machines would have a five second delay rendezvousing cpus. What was happening is that ia64_wait_for_slaves() would check to see if all the slave CPUs had rendezvoused. If any had not, it would wait 1 millisecond then check again. If any CPUs had still not rendezvoused, it would wait 5 seconds before checking again. On some configs the rendezvous takes more than 1 millisecond, causing the code to wait the full 5 seconds, even though the last CPU rendezvoused after only a few milliseconds. The fix is to check every 1 millisecond to see if all the cpus have rendezvoused. After 5 seconds the code concludes the CPUs will never rendezvous (same as before). The MCA code is, by definition, not performance critical, but a needless delay of 5 seconds is senseless. The 5 seconds also adds up quickly when running the error injection code in a loop. This patch both simplifies the code and removes the needless delay. Signed-off-by: Russ Anderson <rja@sgi.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'arch/ia64')
-rw-r--r--arch/ia64/kernel/mca.c41
1 files changed, 19 insertions, 22 deletions
diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c
index 63b73f3d4c9f..92367faecbbf 100644
--- a/arch/ia64/kernel/mca.c
+++ b/arch/ia64/kernel/mca.c
@@ -1135,30 +1135,27 @@ no_mod:
1135static void 1135static void
1136ia64_wait_for_slaves(int monarch, const char *type) 1136ia64_wait_for_slaves(int monarch, const char *type)
1137{ 1137{
1138 int c, wait = 0, missing = 0; 1138 int c, i , wait;
1139 for_each_online_cpu(c) { 1139
1140 if (c == monarch) 1140 /*
1141 continue; 1141 * wait 5 seconds total for slaves (arbitrary)
1142 if (ia64_mc_info.imi_rendez_checkin[c] == IA64_MCA_RENDEZ_CHECKIN_NOTDONE) { 1142 */
1143 udelay(1000); /* short wait first */ 1143 for (i = 0; i < 5000; i++) {
1144 wait = 1; 1144 wait = 0;
1145 break; 1145 for_each_online_cpu(c) {
1146 } 1146 if (c == monarch)
1147 } 1147 continue;
1148 if (!wait) 1148 if (ia64_mc_info.imi_rendez_checkin[c]
1149 goto all_in; 1149 == IA64_MCA_RENDEZ_CHECKIN_NOTDONE) {
1150 for_each_online_cpu(c) { 1150 udelay(1000); /* short wait */
1151 if (c == monarch) 1151 wait = 1;
1152 continue; 1152 break;
1153 if (ia64_mc_info.imi_rendez_checkin[c] == IA64_MCA_RENDEZ_CHECKIN_NOTDONE) { 1153 }
1154 udelay(5*1000000); /* wait 5 seconds for slaves (arbitrary) */
1155 if (ia64_mc_info.imi_rendez_checkin[c] == IA64_MCA_RENDEZ_CHECKIN_NOTDONE)
1156 missing = 1;
1157 break;
1158 } 1154 }
1155 if (!wait)
1156 goto all_in;
1159 } 1157 }
1160 if (!missing) 1158
1161 goto all_in;
1162 /* 1159 /*
1163 * Maybe slave(s) dead. Print buffered messages immediately. 1160 * Maybe slave(s) dead. Print buffered messages immediately.
1164 */ 1161 */