[gem5-dev] [S] Change in gem5/gem5[develop]: mem-cache: masked writes are not whole-line writes

2023-01-17 Thread Giacomo Travaglini (Gerrit) via gem5-dev
Giacomo Travaglini has submitted this change. (  
https://gem5-review.googlesource.com/c/public/gem5/+/64340?usp=email )


 (

1 is the latest approved patch-set.
No files were changed between the latest approved patch-set and the  
submitted one.

 )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
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/64340
Maintainer: Jason Lowe-Power 
Reviewed-by: Jason Lowe-Power 
Tested-by: kokoro 
---
M src/mem/cache/mshr.cc
M src/mem/packet.hh
2 files changed, 23 insertions(+), 2 deletions(-)

Approvals:
  kokoro: Regressions pass
  Jason Lowe-Power: Looks good to me, approved; Looks good to me, approved




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 _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 a80b918..9d720fb 100644
--- a/src/mem/packet.hh
+++ b/src/mem/packet.hh
@@ -625,7 +625,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: 7
Gerrit-Owner: Sascha Bischoff 
Gerrit-Reviewer: Daniel Carvalho 
Gerrit-Reviewer: Giacomo Travaglini 
Gerrit-Reviewer: Jason Lowe-Power 
Gerrit-Reviewer: Nikos Nikoleris 
Gerrit-Reviewer: kokoro 
Gerrit-MessageType: merged
___
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org


[gem5-dev] [S] Change in gem5/gem5[develop]: mem-cache: masked writes are not whole-line writes

2022-10-11 Thread Sascha Bischoff (Gerrit)
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 _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 
Gerrit-MessageType: newchange
___
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org