changeset 25715951a4b8 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=25715951a4b8
description:
        mem: Do not alter cache block state on uncacheable snoops

        This patch ensures we do not respond with a Modified (dirty and
        writable) line if the request is uncacheable, and that the cache
        responding retains the line without modifying the state (even if
        responding).

diffstat:

 src/mem/cache/cache.cc |  31 ++++++++++++++++++++++++-------
 1 files changed, 24 insertions(+), 7 deletions(-)

diffs (57 lines):

diff -r b3926db25371 -r 25715951a4b8 src/mem/cache/cache.cc
--- a/src/mem/cache/cache.cc    Thu Dec 31 09:32:58 2015 -0500
+++ b/src/mem/cache/cache.cc    Thu Dec 31 09:33:25 2015 -0500
@@ -1904,6 +1904,13 @@
     bool invalidate = pkt->isInvalidate();
     bool M5_VAR_USED needs_writable = pkt->needsWritable();
 
+    // at the moment we could get an uncacheable write which does not
+    // have the invalidate flag, and we need a suitable way of dealing
+    // with this case
+    panic_if(invalidate && pkt->req->isUncacheable(),
+             "%s got an invalidating uncacheable snoop request %s to %#llx",
+             name(), pkt->cmdString(), pkt->getAddr());
+
     uint32_t snoop_delay = 0;
 
     if (forwardSnoops) {
@@ -1988,15 +1995,18 @@
         return snoop_delay;
     }
 
-    if (!pkt->req->isUncacheable() && pkt->isRead() && !invalidate) {
-        // reading without requiring the line in a writable state,
-        // note that we retain the block as Owned if it is Modified
-        // (dirty data), with the response taken care of below, and
-        // otherwhise simply downgrade from Exclusive to Shared (or
-        // remain in Shared)
+    if (pkt->isRead() && !invalidate) {
+        // reading without requiring the line in a writable state
         assert(!needs_writable);
         pkt->setHasSharers();
-        blk->status &= ~BlkWritable;
+
+        // if the requesting packet is uncacheable, retain the line in
+        // the current state, otherwhise unset the writable flag,
+        // which means we go from Modified to Owned (and will respond
+        // below), remain in Owned (and will respond below), from
+        // Exclusive to Shared, or remain in Shared
+        if (!pkt->req->isUncacheable())
+            blk->status &= ~BlkWritable;
     }
 
     if (respond) {
@@ -2020,6 +2030,13 @@
             // we already called setHasSharers above
         }
 
+        // if we are returning a writable and dirty (Modified) line,
+        // we should be invalidating the line
+        panic_if(!invalidate && !pkt->hasSharers(),
+                 "%s is passing a Modified line through %s to %#llx, "
+                 "but keeping the block",
+                 name(), pkt->cmdString(), pkt->getAddr());
+
         if (is_timing) {
             doTimingSupplyResponse(pkt, blk->data, is_deferred, pending_inval);
         } else {
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to