aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/misc/sgi-gru/grufault.c
diff options
context:
space:
mode:
authorJack Steiner <steiner@sgi.com>2009-06-17 19:28:28 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2009-06-18 16:04:02 -0400
commit1a2c09e3b41e334b6651d53b39cfe8ceefbc45f8 (patch)
treef005fcb5c5251256767b15f4a23ee220e6de5c88 /drivers/misc/sgi-gru/grufault.c
parent270952a907220c0331fdaecbb55df892921c5e2d (diff)
gru: fix cache coherency issues with instruction retry
Fix two problems related to GRU instruction failures. Cache coherency is not maintained for CBEs except when loading or unloading contexts. When reading a CBE to extract error information, the CBE must first be flushed from the cache. The function that reads kerrnel CBEs was reading the wrong CBE. Signed-off-by: Jack Steiner <steiner@sgi.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/misc/sgi-gru/grufault.c')
-rw-r--r--drivers/misc/sgi-gru/grufault.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/misc/sgi-gru/grufault.c b/drivers/misc/sgi-gru/grufault.c
index a489807613f8..6d0681236db5 100644
--- a/drivers/misc/sgi-gru/grufault.c
+++ b/drivers/misc/sgi-gru/grufault.c
@@ -614,7 +614,7 @@ int gru_get_exception_detail(unsigned long arg)
614 } else if (gts->ts_gru) { 614 } else if (gts->ts_gru) {
615 cbrnum = thread_cbr_number(gts, ucbnum); 615 cbrnum = thread_cbr_number(gts, ucbnum);
616 cbe = get_cbe_by_index(gts->ts_gru, cbrnum); 616 cbe = get_cbe_by_index(gts->ts_gru, cbrnum);
617 prefetchw(cbe);/* Harmless on hardware, required for emulator */ 617 gru_flush_cache(cbe); /* CBE not coherent */
618 excdet.opc = cbe->opccpy; 618 excdet.opc = cbe->opccpy;
619 excdet.exopc = cbe->exopccpy; 619 excdet.exopc = cbe->exopccpy;
620 excdet.ecause = cbe->ecause; 620 excdet.ecause = cbe->ecause;
@@ -622,6 +622,7 @@ int gru_get_exception_detail(unsigned long arg)
622 excdet.exceptdet1 = cbe->idef3upd; 622 excdet.exceptdet1 = cbe->idef3upd;
623 excdet.cbrstate = cbe->cbrstate; 623 excdet.cbrstate = cbe->cbrstate;
624 excdet.cbrexecstatus = cbe->cbrexecstatus; 624 excdet.cbrexecstatus = cbe->cbrexecstatus;
625 gru_flush_cache(cbe);
625 ret = 0; 626 ret = 0;
626 } else { 627 } else {
627 ret = -EAGAIN; 628 ret = -EAGAIN;