aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorCliff Wickman <cpw@sgi.com>2010-06-02 17:22:02 -0400
committerIngo Molnar <mingo@elte.hu>2010-06-08 15:13:46 -0400
commit39847e7f3c8198b14102fe7ba4b3a6a1d84bbcfe (patch)
tree18d8b66fc06c036f516978a4826d75c0cc1a7676 /arch
parent4faca1550838708d71f6eea14cdacb0876c3a5a4 (diff)
x86, UV: Correct BAU software acknowledge
Correct the acknowledgment and the reset of a BAU software-acknowledged message. A retry message should be testing only for timed-out resources (mask << 8). (And we delete a log message that might cause unnecessary concern) The acknowledge MMR is |--timed-out--|---pending--|, each is 8 bits. The IPI-driven reset of software acknowledge resources frees both timed out and pending resources. Signed-off-by: Cliff Wickman <cpw@sgi.com> Cc: gregkh@suse.de LKML-Reference: <E1OJvNy-0004aP-7O@eag09.americas.sgi.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/kernel/tlb_uv.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/arch/x86/kernel/tlb_uv.c b/arch/x86/kernel/tlb_uv.c
index d7592903984..295a41122da 100644
--- a/arch/x86/kernel/tlb_uv.c
+++ b/arch/x86/kernel/tlb_uv.c
@@ -161,15 +161,14 @@ static inline void uv_bau_process_retry_msg(struct msg_desc *mdp,
161 slot2 = msg2 - mdp->va_queue_first; 161 slot2 = msg2 - mdp->va_queue_first;
162 mmr = uv_read_local_mmr 162 mmr = uv_read_local_mmr
163 (UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE); 163 (UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE);
164 msg_res = ((msg2->sw_ack_vector << 8) | 164 msg_res = msg2->sw_ack_vector;
165 msg2->sw_ack_vector);
166 /* 165 /*
167 * This is a message retry; clear the resources held 166 * This is a message retry; clear the resources held
168 * by the previous message only if they timed out. 167 * by the previous message only if they timed out.
169 * If it has not timed out we have an unexpected 168 * If it has not timed out we have an unexpected
170 * situation to report. 169 * situation to report.
171 */ 170 */
172 if (mmr & (msg_res << 8)) { 171 if (mmr & (msg_res << UV_SW_ACK_NPENDING)) {
173 /* 172 /*
174 * is the resource timed out? 173 * is the resource timed out?
175 * make everyone ignore the cancelled message. 174 * make everyone ignore the cancelled message.
@@ -179,9 +178,9 @@ static inline void uv_bau_process_retry_msg(struct msg_desc *mdp,
179 cancel_count++; 178 cancel_count++;
180 uv_write_local_mmr( 179 uv_write_local_mmr(
181 UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS, 180 UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS,
182 (msg_res << 8) | msg_res); 181 (msg_res << UV_SW_ACK_NPENDING) |
183 } else 182 msg_res);
184 printk(KERN_INFO "note bau retry: no effect\n"); 183 }
185 } 184 }
186 } 185 }
187 if (!cancel_count) 186 if (!cancel_count)
@@ -317,13 +316,13 @@ uv_do_reset(void *ptr)
317 */ 316 */
318 mmr = uv_read_local_mmr 317 mmr = uv_read_local_mmr
319 (UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE); 318 (UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE);
320 msg_res = ((msg->sw_ack_vector << 8) | 319 msg_res = msg->sw_ack_vector;
321 msg->sw_ack_vector);
322 if (mmr & msg_res) { 320 if (mmr & msg_res) {
323 stat->d_rcanceled++; 321 stat->d_rcanceled++;
324 uv_write_local_mmr( 322 uv_write_local_mmr(
325 UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS, 323 UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS,
326 msg_res); 324 (msg_res << UV_SW_ACK_NPENDING) |
325 msg_res);
327 } 326 }
328 } 327 }
329 } 328 }