diff options
author | Russ Anderson <rja@sgi.com> | 2007-09-20 14:59:12 -0400 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2007-10-12 18:17:44 -0400 |
commit | 2bc5c282999af41042c2b703bf3a58ca1d7e3ee2 (patch) | |
tree | fdf37ff750fdfd410e826945d361add25d60504e /arch/ia64 | |
parent | 28eda5b8b434b65e5feb0c58a7477f3f290d72d4 (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.c | 41 |
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: | |||
1135 | static void | 1135 | static void |
1136 | ia64_wait_for_slaves(int monarch, const char *type) | 1136 | ia64_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 | */ |