Make sure responses never get blocked.
authorSteve Reinhardt <stever@eecs.umich.edu>
Tue, 17 Jul 2007 15:15:23 +0000 (08:15 -0700)
committerSteve Reinhardt <stever@eecs.umich.edu>
Tue, 17 Jul 2007 15:15:23 +0000 (08:15 -0700)
--HG--
extra : convert_revision : 29f359d743994a94dc403aa0621ba72cd137d1a1

src/mem/bus.cc

index e70558bd6cefcde74d1df8cc3f89d595df8fe28e..da8df06ea5f9bb6cd7617dddfc0b3a16a3c25327 100644 (file)
@@ -183,7 +183,7 @@ Bus::recvTiming(PacketPtr pkt)
 
     // If the bus is busy, or other devices are in line ahead of the current
     // one, put this device on the retry list.
-    if (!pkt->isExpressSnoop() &&
+    if (!(pkt->isResponse() || pkt->isExpressSnoop()) &&
         (tickNextIdle > curTick ||
          (retryList.size() && (!inRetry || pktPort != retryList.front()))))
     {
@@ -194,8 +194,6 @@ Bus::recvTiming(PacketPtr pkt)
 
     short dest = pkt->getDest();
 
-    // Make sure to clear the snoop commit flag so it doesn't think an
-    // access has been handled twice.
     if (dest == Packet::Broadcast) {
         port_id = findPort(pkt->getAddr());
         timingSnoop(pkt, interfaces[port_id]);
@@ -234,6 +232,8 @@ Bus::recvTiming(PacketPtr pkt)
         }
 
         // Packet not successfully sent. Leave or put it on the retry list.
+        // illegal to block responses... can lead to deadlock
+        assert(!pkt->isResponse());
         DPRINTF(Bus, "Adding2 a retry to RETRY list %d\n",
                 pktPort->getId());
         addToRetryList(pktPort);