Sascha Bischoff has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/64340?usp=email )
Change subject: mem-cache: masked writes are not whole-line writes
......................................................................
mem-cache: masked writes are not whole-line writes
We now explicitly check in both the cache and the MSHRs if writes are
masked or not before promoting to a whole-line write. Failure to do
this previously was resulting in data loss when dirty data was present
in lower level caches and a coincidentally aligned and
cache-line-sized masked write occured.
Change-Id: I9434590d8b22e4d993167d789eb9d15a2e866bf1
---
M src/mem/cache/mshr.cc
M src/mem/packet.hh
2 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/src/mem/cache/mshr.cc b/src/mem/cache/mshr.cc
index 871125a..b7e9357 100644
--- a/src/mem/cache/mshr.cc
+++ b/src/mem/cache/mshr.cc
@@ -140,6 +140,7 @@
Request::MEM_SWAP_COND | Request::SECURE | Request::LOCKED_RMW;
const auto &req_flags = pkt->req->getFlags();
bool compat_write = !req_flags.isSet(no_merge_flags);
+ bool masked_write = pkt->isMaskedWrite();
// if this is the first write, it might be a whole
// line write and even if we can't merge any
@@ -147,7 +148,7 @@
// it as a whole line write (e.g., SECURE whole line
// write)
bool first_write = empty();
- if (first_write || compat_write) {
+ if (!masked_write && (first_write || compat_write)) {
auto offset = pkt->getOffset(blkSize);
auto begin = writesBitmap.begin() + offset;
std::fill(begin, begin + pkt->getSize(), true);
diff --git a/src/mem/packet.hh b/src/mem/packet.hh
index 7d32634..d69fcd6 100644
--- a/src/mem/packet.hh
+++ b/src/mem/packet.hh
@@ -623,7 +623,8 @@
bool isWholeLineWrite(unsigned blk_size)
{
return (cmd == MemCmd::WriteReq || cmd == MemCmd::WriteLineReq) &&
- getOffset(blk_size) == 0 && getSize() == blk_size;
+ getOffset(blk_size) == 0 && getSize() == blk_size &&
+ !isMaskedWrite();
}
//@{
--
To view, visit
https://gem5-review.googlesource.com/c/public/gem5/+/64340?usp=email
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: I9434590d8b22e4d993167d789eb9d15a2e866bf1
Gerrit-Change-Number: 64340
Gerrit-PatchSet: 1
Gerrit-Owner: Sascha Bischoff <sascha.bisch...@arm.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org