cache: fail SC when invalidated while waiting for bus
authorSteve Reinhardt <steve.reinhardt@amd.com>
Thu, 9 Sep 2010 18:40:19 +0000 (14:40 -0400)
committerSteve Reinhardt <steve.reinhardt@amd.com>
Thu, 9 Sep 2010 18:40:19 +0000 (14:40 -0400)
Corrects an oversight in cset f97b62be544f.  The fix there only
failed queued SCUpgradeReq packets that encountered an
invalidation, which meant that the upgrade had to reach the L2
cache.  To handle pending requests in the L1 we must similarly
fail StoreCondReq packets too.

src/mem/cache/cache_impl.hh
src/mem/cache/mshr.cc
src/mem/packet.cc
src/mem/packet.hh

index 3f3dc6877b55cd2f15c5a96d9eca21c75247a679..4f4d720b6ccb2b75f2888fa977b0645128c579d1 100644 (file)
@@ -900,9 +900,10 @@ Cache<TagStore>::handleResponse(PacketPtr pkt)
                 assert(!target->pkt->req->isUncacheable());
                 missLatency[target->pkt->cmdToIndex()][0/*pkt->req->threadId()*/] +=
                     completion_time - target->recvTime;
-            } else if (target->pkt->cmd == MemCmd::StoreCondReq &&
-                       pkt->cmd == MemCmd::UpgradeFailResp) {
+            } else if (pkt->cmd == MemCmd::UpgradeFailResp) {
                 // failed StoreCond upgrade
+                assert(target->pkt->cmd == MemCmd::StoreCondReq ||
+                       target->pkt->cmd == MemCmd::StoreCondFailReq);
                 completion_time = tags->getHitLatency() + pkt->finishTime;
                 target->pkt->req->setExtraData(0);
             } else {
@@ -1443,10 +1444,11 @@ Cache<TagStore>::getTimingPacket()
     PacketPtr tgt_pkt = mshr->getTarget()->pkt;
     PacketPtr pkt = NULL;
 
-    if (tgt_pkt->cmd == MemCmd::SCUpgradeFailReq) {
-        // SCUpgradeReq saw invalidation while queued in MSHR, so now
-        // that we are getting around to processing it, just treat it
-        // as if we got a failure response
+    if (tgt_pkt->cmd == MemCmd::SCUpgradeFailReq ||
+        tgt_pkt->cmd == MemCmd::StoreCondFailReq) {
+        // SCUpgradeReq or StoreCondReq saw invalidation while queued
+        // in MSHR, so now that we are getting around to processing
+        // it, just treat it as if we got a failure response
         pkt = new Packet(tgt_pkt);
         pkt->cmd = MemCmd::UpgradeFailResp;
         pkt->senderState = mshr;
index bbddf2aee8d80cadeffdd6564b67487672b261d9..54977346f51c7ec60dc7d0bacb3ced3f5abb698b 100644 (file)
@@ -72,7 +72,10 @@ MSHR::TargetList::add(PacketPtr pkt, Tick readyTime,
             needsExclusive = true;
         }
 
-        if (pkt->isUpgrade()) {
+        // StoreCondReq is effectively an upgrade if it's in an MSHR
+        // since it would have been failed already if we didn't have a
+        // read-only copy
+        if (pkt->isUpgrade() || pkt->cmd == MemCmd::StoreCondReq) {
             hasUpgrade = true;
         }
     }
@@ -98,6 +101,9 @@ replaceUpgrade(PacketPtr pkt)
     } else if (pkt->cmd == MemCmd::SCUpgradeReq) {
         pkt->cmd = MemCmd::SCUpgradeFailReq;
         DPRINTF(Cache, "Replacing SCUpgradeReq with SCUpgradeFailReq\n");
+    } else if (pkt->cmd == MemCmd::StoreCondReq) {
+        pkt->cmd = MemCmd::StoreCondFailReq;
+        DPRINTF(Cache, "Replacing StoreCondReq with StoreCondFailReq\n");
     }
 }
 
index 5eb2ecc4b02e56f82d66b686b2ce95f4772d7e7c..d0b1fed8343e65e7d4f9fc9c744d151171d5fd5a 100644 (file)
@@ -123,6 +123,10 @@ MemCmd::commandInfo[] =
     { SET6(IsWrite, NeedsExclusive, IsLlsc,
            IsRequest, NeedsResponse, HasData),
             StoreCondResp, "StoreCondReq" },
+    /* StoreCondFailReq: generates failing StoreCondResp ASAP */
+    { SET6(IsWrite, NeedsExclusive, IsLlsc,
+           IsRequest, NeedsResponse, HasData),
+            StoreCondResp, "StoreCondFailReq" },
     /* StoreCondResp */
     { SET4(IsWrite, NeedsExclusive, IsLlsc, IsResponse),
             InvalidCmd, "StoreCondResp" },
index cc2a39d0e7e4d6c9c3f61b05953af2c4cf8a891d..cefb7c2edaa14596c47bf54b07d0076afa1189f6 100644 (file)
@@ -90,6 +90,7 @@ class MemCmd
         ReadExResp,
         LoadLockedReq,
         StoreCondReq,
+        StoreCondFailReq,       // Failed StoreCondReq in MSHR (never sent)
         StoreCondResp,
         SwapReq,
         SwapResp,