mem: Fix cache sender state handling and add clarification
authorAndreas Hansson <andreas.hansson@arm.com>
Mon, 28 Dec 2015 16:14:10 +0000 (11:14 -0500)
committerAndreas Hansson <andreas.hansson@arm.com>
Mon, 28 Dec 2015 16:14:10 +0000 (11:14 -0500)
This patch addresses a bug in how the cache attached the MSHR as a
sender state. Rather than overwriting any existing sender state it now
pushes a new one. The handling of upward snoops is also clarified.

src/mem/cache/cache.cc

index 67e889453d662cfe9cd575167d44ebd45aeb47a8..187ed48019cf90dff3aae342f597f42a01f9369c 100644 (file)
@@ -2330,6 +2330,10 @@ Cache::getTimingPacket()
         // dirty one.
         Packet snoop_pkt(tgt_pkt, true, false);
         snoop_pkt.setExpressSnoop();
+        // We are sending this packet upwards, but if it hits we will
+        // get a snoop response that we end up treating just like a
+        // normal response, hence it needs the MSHR as its sender
+        // state
         snoop_pkt.senderState = mshr;
         cpuSidePort->sendTimingSnoopReq(&snoop_pkt);
 
@@ -2399,7 +2403,9 @@ Cache::getTimingPacket()
     }
 
     assert(pkt != NULL);
-    pkt->senderState = mshr;
+    // play it safe and append (rather than set) the sender state, as
+    // forwarded packets may already have existing state
+    pkt->pushSenderState(mshr);
     return pkt;
 }