gru: fix prefetch and speculation bugs
Fix several bugs related to prefetch, ordering & speculation: - GRU cch_allocate() instruction causes cacheable memory to be created. Add a barriers to prevent speculation from prefetching data before it exists. - Add memory barriers before cache-flush instructions to ensure that previously stored data is included in the line flushed to memory. 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
e006043a4d
commit
67bf04a5c2
@@ -91,9 +91,18 @@ static int wait_instruction_complete(void *h, enum mcs_op opc)
|
||||
|
||||
int cch_allocate(struct gru_context_configuration_handle *cch)
|
||||
{
|
||||
int ret;
|
||||
|
||||
cch->opc = CCHOP_ALLOCATE;
|
||||
start_instruction(cch);
|
||||
return wait_instruction_complete(cch, cchop_allocate);
|
||||
ret = wait_instruction_complete(cch, cchop_allocate);
|
||||
|
||||
/*
|
||||
* Stop speculation into the GSEG being mapped by the previous ALLOCATE.
|
||||
* The GSEG memory does not exist until the ALLOCATE completes.
|
||||
*/
|
||||
sync_core();
|
||||
return ret;
|
||||
}
|
||||
|
||||
int cch_start(struct gru_context_configuration_handle *cch)
|
||||
@@ -112,9 +121,18 @@ int cch_interrupt(struct gru_context_configuration_handle *cch)
|
||||
|
||||
int cch_deallocate(struct gru_context_configuration_handle *cch)
|
||||
{
|
||||
int ret;
|
||||
|
||||
cch->opc = CCHOP_DEALLOCATE;
|
||||
start_instruction(cch);
|
||||
return wait_instruction_complete(cch, cchop_deallocate);
|
||||
ret = wait_instruction_complete(cch, cchop_deallocate);
|
||||
|
||||
/*
|
||||
* Stop speculation into the GSEG being unmapped by the previous
|
||||
* DEALLOCATE.
|
||||
*/
|
||||
sync_core();
|
||||
return ret;
|
||||
}
|
||||
|
||||
int cch_interrupt_sync(struct gru_context_configuration_handle
|
||||
|
Reference in New Issue
Block a user