Tiago Muck has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/57392 )
Change subject: mem-ruby: fix inconsistent WBs for dirty data
......................................................................
mem-ruby: fix inconsistent WBs for dirty data
Initiate_MaitainCoherence would not trigger a writeback if
tbe.dataMaybeDirtyUpstream is set due to the assumption that
the upstream cache would writeback any dirty data. However this
is not the case if we use this action finalize a CleanUnique, e.g.:
- L1-A has data in SC
- L1-B has data in SD
- L2 has data in RUSD (L2 is an exclusive cache)
- L1-A sends CleanUnique to L2
- L2 invalidates L1-B and receives dirty data.
- L2 acks the CleanUnique; L1-A is now UC
- L2 has the dirty data but drops it because dataMaybeDirtyUpstream
- L1-A doesn't modify the data and eventually evicts it with WriteEvict
- Data from WriteEvicts are dropped at the HNF and we lose the line
This patch removes the tbe.dataMaybeDirtyUpstream check.
Instead it only skips the WriteBack if an upstream cache is in
SD state, when it's guaranteed it will writeback the dirty data.
JIRA: https://gem5.atlassian.net/browse/GEM5-1195
Change-Id: I6722bc25068b0c44afcf261abc8824f1d80c09f9
Signed-off-by: Tiago Mück <tiago.m...@arm.com>
---
M src/mem/ruby/protocol/chi/CHI-cache-actions.sm
1 file changed, 39 insertions(+), 5 deletions(-)
diff --git a/src/mem/ruby/protocol/chi/CHI-cache-actions.sm
b/src/mem/ruby/protocol/chi/CHI-cache-actions.sm
index 79e4510..ce0fc13 100644
--- a/src/mem/ruby/protocol/chi/CHI-cache-actions.sm
+++ b/src/mem/ruby/protocol/chi/CHI-cache-actions.sm
@@ -869,26 +869,29 @@
assert(tbe.actions.empty());
// go through either the fill or the writeback pipeline
if (tbe.dataValid && tbe.dataToBeInvalid) {
+ // we don't need to WB if the upstream is SD, because the
+ // owner is responsible for the WB
+ bool has_non_ex_owner := tbe.dir_ownerExists && !tbe.dir_ownerIsExcl;
if (is_HN) {
- if (tbe.dataDirty && (tbe.dataMaybeDirtyUpstream == false)) {
+ if (tbe.dataDirty && !has_non_ex_owner) {
tbe.actions.push(Event:SendWriteNoSnp);
tbe.actions.push(Event:WriteBEPipe);
tbe.actions.push(Event:SendWBData);
}
} else {
if (tbe.dir_sharers.isEmpty() && (tbe.dataDirty || tbe.dataUnique)) {
+ assert(!has_non_ex_owner);
tbe.actions.push(Event:SendWriteBackOrWriteEvict);
tbe.actions.push(Event:WriteBEPipe);
tbe.actions.push(Event:SendWBData);
- } else if ((tbe.dir_sharers.isEmpty() == false) && tbe.dataDirty &&
- (tbe.dataMaybeDirtyUpstream == false)) {
+ } else if (tbe.dataDirty && !has_non_ex_owner) {
+ assert(!tbe.dir_sharers.isEmpty());
tbe.actions.push(Event:SendWriteClean);
tbe.actions.push(Event:WriteBEPipe);
tbe.actions.push(Event:SendWBData);
}
}
- }
- else if (tbe.dataValid) {
+ } else if (tbe.dataValid) {
tbe.actions.push(Event:CheckCacheFill);
}
tbe.actions.push(Event:TagArrayWrite);
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/57392
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: I6722bc25068b0c44afcf261abc8824f1d80c09f9
Gerrit-Change-Number: 57392
Gerrit-PatchSet: 1
Gerrit-Owner: Tiago Muck <tiago.m...@arm.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