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>
This commit is contained in:
committed by
Linus Torvalds
parent
270952a907
commit
1a2c09e3b4
@@ -614,7 +614,7 @@ int gru_get_exception_detail(unsigned long arg)
|
||||
} else if (gts->ts_gru) {
|
||||
cbrnum = thread_cbr_number(gts, ucbnum);
|
||||
cbe = get_cbe_by_index(gts->ts_gru, cbrnum);
|
||||
prefetchw(cbe);/* Harmless on hardware, required for emulator */
|
||||
gru_flush_cache(cbe); /* CBE not coherent */
|
||||
excdet.opc = cbe->opccpy;
|
||||
excdet.exopc = cbe->exopccpy;
|
||||
excdet.ecause = cbe->ecause;
|
||||
@@ -622,6 +622,7 @@ int gru_get_exception_detail(unsigned long arg)
|
||||
excdet.exceptdet1 = cbe->idef3upd;
|
||||
excdet.cbrstate = cbe->cbrstate;
|
||||
excdet.cbrexecstatus = cbe->cbrexecstatus;
|
||||
gru_flush_cache(cbe);
|
||||
ret = 0;
|
||||
} else {
|
||||
ret = -EAGAIN;
|
||||
|
Reference in New Issue
Block a user