mem-ruby: Fix deadlock in GPU_VIPER when issuing atomic requests (#1216)
When a compute unit issues several requests to the same line, the requests wait in the L2 if it is a writeback cache. If the line is invalid initially and the first request is atomic in nature, the L2 cache issues a request to main memory. On data return, the cache line transitions to M but doesn't wake up the other requests, resulting in a deadlock. This commit adds a wakeup call on data return for atomics and fixes potential deadlocks.
This commit is contained in:
@@ -606,6 +606,7 @@ machine(MachineType:TCC, "TCC Cache")
|
||||
out_msg.Destination.add(in_msg.Requestor);
|
||||
out_msg.Sender := machineID;
|
||||
out_msg.MessageSize := MessageSizeType:Response_Data;
|
||||
out_msg.instSeqNum := in_msg.instSeqNum;
|
||||
out_msg.DataBlk := cache_entry.DataBlk;
|
||||
out_msg.isGLCSet := in_msg.isGLCSet;
|
||||
out_msg.isSLCSet := in_msg.isSLCSet;
|
||||
@@ -1299,6 +1300,7 @@ machine(MachineType:TCC, "TCC Cache")
|
||||
wardb_writeAtomicResponseDirtyBytes;
|
||||
pa_performAtomic;
|
||||
baplr_sendBypassedAtomicPerformedLocallyResponse;
|
||||
wada_wakeUpAllDependentsAddr;
|
||||
dt_deallocateTBE;
|
||||
pr_popResponseQueue;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user