diff options
author | Jack Steiner <steiner@sgi.com> | 2009-06-17 19:28:28 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-18 16:04:02 -0400 |
commit | 1a2c09e3b41e334b6651d53b39cfe8ceefbc45f8 (patch) | |
tree | f005fcb5c5251256767b15f4a23ee220e6de5c88 /drivers/misc/sgi-gru/grufault.c | |
parent | 270952a907220c0331fdaecbb55df892921c5e2d (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.c | 3 |
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; |