mem-ruby: fix races between data and DMA in MOESI_AMD_Base-dir
authorKyle Roarty <kyleroarty1716@gmail.com>
Wed, 29 Jul 2020 22:58:45 +0000 (17:58 -0500)
committerKyle Roarty <kyleroarty1716@gmail.com>
Thu, 13 Aug 2020 19:05:17 +0000 (19:05 +0000)
commit187c44fe448e9af4efb9f632855d8822437c222b
tree8d74e3042519604b8511c7448f7f0cd2a17c0da8
parentd542dc838e2489fc586fc1a698839df2bedeb5bd
mem-ruby: fix races between data and DMA in MOESI_AMD_Base-dir

There are race conditions while running several benchmarks, where
the DMA engine and the CorePair simultaneously send requests for the
same block. This patch fixes two scenarios
(a) If the request from the DMA engine arrives before the one from the
CorePair, the directory controller records it as a pending request.
However, once the DMA request is serviced, the directory doesn't check
for pending requests. The CorePair, consequently, never sees a response
to its request and this results in a Deadlock.

Added call to wakeUpDependents in the transition from BDR_Pm to U
Added call to wakeUpDependents in the transition from BDW_P to U

(b) If the request from the CorePair is being serviced by the directory
and the DMA requests for the same block, this causes an invalid
transition because the current coherence doesn't take care of this
scenario.

Added transition state where the requests from DMA are added to the
stall buffer.

Updated B to U CoreUnblock transition to check all buffers, as the DMA
requests were being placed later in the stall buffer than was being checked

Change-Id: I5a76efef97723bc53cf239ea7e112f84fc874ef8
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/31996
Reviewed-by: Matt Sinclair <mattdsinclair@gmail.com>
Reviewed-by: Bradford Beckmann <brad.beckmann@amd.com>
Maintainer: Bradford Beckmann <brad.beckmann@amd.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/mem/ruby/protocol/MOESI_AMD_Base-dir.sm
src/mem/ruby/slicc_interface/AbstractController.cc