mem-cache: Fix MSHR handling of cache clean requests
authorNikos Nikoleris <nikos.nikoleris@arm.com>
Tue, 12 Feb 2019 08:26:14 +0000 (08:26 +0000)
committerNikos Nikoleris <nikos.nikoleris@arm.com>
Wed, 10 Apr 2019 09:05:02 +0000 (09:05 +0000)
Previously satisfied clean requests would not snoop in-service
MSHRs. This is a problem when a clean request is also invalidating, in
which case we have to post-invalidate or post-downgrade outstanding
requests. This changes fixes this bug.

Change-Id: I31e42aa94dd3637b2818e00fbaae68c810145eaf
Signed-off-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/17728
Reviewed-by: Daniel Carvalho <odanrc@yahoo.com.br>
src/mem/cache/cache.cc
src/mem/cache/mshr.cc

index 89e40f328517dd62e6efb8d8f3e0f1850c18ba45..938b6f4e994745e5160d425b9c1b4a8386094f70 100644 (file)
@@ -1180,13 +1180,6 @@ Cache::recvTimingSnoopReq(PacketPtr pkt)
         return;
     }
 
-    // Bypass any existing cache maintenance requests if the request
-    // has been satisfied already (i.e., the dirty block has been
-    // found).
-    if (mshr && pkt->req->isCacheMaintenance() && pkt->satisfied()) {
-        return;
-    }
-
     // Let the MSHR itself track the snoop and decide whether we want
     // to go ahead and do the regular cache snoop
     if (mshr && mshr->handleSnoop(pkt, order++)) {
index 5b9302925831ae67751ff64fbbe28d497b9d5f14..8db7c2997c31567f588cd1913f692a2f94d815d9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2013, 2015-2018 ARM Limited
+ * Copyright (c) 2012-2013, 2015-2019 ARM Limited
  * All rights reserved.
  *
  * The license below extends only to copyright in the software and shall
@@ -459,7 +459,14 @@ MSHR::handleSnoop(PacketPtr pkt, Counter _order)
             // in the case of an uncacheable request there is no need
             // to set the responderHadWritable flag, but since the
             // recipient does not care there is no harm in doing so
+        } else if (isPendingModified() && pkt->isClean()) {
+            // this cache doesn't respond to the clean request, a
+            // destination xbar will respond to this request, but to
+            // do so it needs to know if it should wait for the
+            // WriteCleanReq
+            pkt->setSatisfied();
         }
+
         targets.add(cp_pkt, curTick(), _order, Target::FromSnoop,
                     downstreamPending && targets.needsWritable, false);
 
@@ -467,10 +474,6 @@ MSHR::handleSnoop(PacketPtr pkt, Counter _order)
             // This transaction will take away our pending copy
             postInvalidate = true;
         }
-
-        if (isPendingModified() && pkt->isClean()) {
-            pkt->setSatisfied();
-        }
     }
 
     if (!pkt->needsWritable() && !pkt->req->isUncacheable()) {