Daecheol You has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/58414 )

Change subject: mem-ruby: Fix WriteUnique transition on R* state
......................................................................

mem-ruby: Fix WriteUnique transition on R* state

When WriteUnique arrvies at an RNF in RSC, RSD, RUSC, RUSD and RU state,
the existing transition forwards the WriteUnique to downstream.
However, this makes a problem when an RNF is in RSC state.

Let's assume that an RNF is in RSC state and its downstream HNF is in
UC_RSC state. After the RNF forwards the WriteUnique to the HNF, it
receives SnpCleanInvalid from the HNF. Then, the RNF responses with
SnpRespData_I_PD since it holds the non-cobyback data from the original
requestor. This response, however, is not expected because the HNF
recognizes that the data block is not in dirty state in upstream.

Since CHI spec also requires the requestor of WriteUnique to be I state,
following changes are committed:
    - For RUSC, RUSD and RU, which has exclusive right, invalidate the
    upstream and do local write. This can be done with the existing
    LocalWrite action (with a little modification for partial write).
    - For RSC and RSD, acquire exclusive right with ReadUnique and do
    local write. This can be done with LocalWrite_AfterUpgrade.
    - For local write actions, set doCacheFill as true since it is not
    set for RU, RSC and RSD state (the default allocation policy).

Change-Id: I453fb0991b49771939bc5ac1b6b782fc39f977b0
---
M src/mem/ruby/protocol/chi/CHI-cache-actions.sm
M src/mem/ruby/protocol/chi/CHI-cache-transitions.sm
2 files changed, 48 insertions(+), 3 deletions(-)



diff --git a/src/mem/ruby/protocol/chi/CHI-cache-actions.sm b/src/mem/ruby/protocol/chi/CHI-cache-actions.sm
index 93a97d4..d43d46d 100644
--- a/src/mem/ruby/protocol/chi/CHI-cache-actions.sm
+++ b/src/mem/ruby/protocol/chi/CHI-cache-actions.sm
@@ -714,8 +714,14 @@
   // auto-upgrade if hn but state was not unique
   assert(is_HN || tbe.dataUnique);
   tbe.dataUnique := true;
+  tbe.doCacheFill := true;
   if (tbe.dir_sharers.count() > 0) {
-    tbe.actions.push(Event:SendSnpCleanInvalid);
+    if (tbe.reqType == CHIRequestType:WriteUniquePtl &&
+        tbe.dataValid == false) {
+      tbe.actions.push(Event:SendSnpUniqueRetToSrc);
+    } else {
+      tbe.actions.push(Event:SendSnpCleanInvalid);
+    }
   }
   if (comp_wu) {
     tbe.actions.push(Event:SendDBIDResp_WU);
@@ -732,6 +738,7 @@
 action(Initiate_WriteUnique_LocalWrite_AfterUpgrade, desc="") {
   assert(is_HN == false);
   assert((tbe.dataValid && tbe.dataUnique) == false);
+  tbe.doCacheFill := true;
   tbe.actions.push(Event:SendReadUnique);
   if (comp_wu) {
     tbe.actions.push(Event:SendDBIDResp_WU);
diff --git a/src/mem/ruby/protocol/chi/CHI-cache-transitions.sm b/src/mem/ruby/protocol/chi/CHI-cache-transitions.sm
index c4eb8ff..85caab7 100644
--- a/src/mem/ruby/protocol/chi/CHI-cache-transitions.sm
+++ b/src/mem/ruby/protocol/chi/CHI-cache-transitions.sm
@@ -365,7 +365,15 @@
   ProcessNextState;
 }

-transition({SD, SD_RSD, SD_RSC, SC, SC_RSC},
+transition({RUSD,RUSC,RU}, WriteUnique, BUSY_BLKD) {
+  Initiate_Request;
+  Initiate_WriteUnique_LocalWrite;
+  Profile_Miss;
+  Pop_ReqRdyQueue;
+  ProcessNextState;
+}
+
+transition({RSC, RSD, SD, SD_RSD, SD_RSC, SC, SC_RSC},
            {WriteUnique}, BUSY_BLKD) {
   Initiate_Request;
   Initiate_WriteUnique_LocalWrite_AfterUpgrade;
@@ -390,7 +398,7 @@
   ProcessNextState;
 }

-transition({RSC,RSD,RUSD,RUSC,RU,I}, WriteUnique, BUSY_BLKD) {
+transition(I, WriteUnique, BUSY_BLKD) {
   Initiate_Request;
   Initiate_WriteUnique_Forward;
   Profile_Miss;

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/58414
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I453fb0991b49771939bc5ac1b6b782fc39f977b0
Gerrit-Change-Number: 58414
Gerrit-PatchSet: 1
Gerrit-Owner: Daecheol You <daecheol....@samsung.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to