memory system: fix functional access bug.
authorSteve Reinhardt <stever@gmail.com>
Mon, 30 Jul 2007 03:17:03 +0000 (20:17 -0700)
committerSteve Reinhardt <stever@gmail.com>
Mon, 30 Jul 2007 03:17:03 +0000 (20:17 -0700)
Make sure not to keep processing functional accesses
after they've been responded to.
Also use checkFunctional() return value instead of checking
packet command field where possible, mostly just for consistency.

--HG--
extra : convert_revision : 29fc76bc18731bd93a4ed05a281297827028ef75

src/mem/cache/base_cache.cc
src/mem/cache/cache_impl.hh
src/mem/physical.cc
src/mem/tport.cc
src/mem/tport.hh

index ec9e1cf9b1fec2a0936b18cfb69ceef7ef132aea..b44468486cb14c271873363e55d770c1a5e5f032 100644 (file)
@@ -81,9 +81,9 @@ BaseCache::CachePort::deviceBlockSize()
 void
 BaseCache::CachePort::checkAndSendFunctional(PacketPtr pkt)
 {
-    checkFunctional(pkt);
-    if (!pkt->isResponse())
+    if (!checkFunctional(pkt)) {
         sendFunctional(pkt);
+    }
 }
 
 
index c1b01d6762ed70a278561bd282a7e4035e1293e4..d144266ed60108d4340e894cadc2e10bdbaaad25 100644 (file)
@@ -1253,9 +1253,9 @@ template<class TagStore>
 void
 Cache<TagStore>::CpuSidePort::recvFunctional(PacketPtr pkt)
 {
-    checkFunctional(pkt);
-    if (!pkt->isResponse())
+    if (!checkFunctional(pkt)) {
         myCache()->functionalAccess(pkt, cache->memSidePort);
+    }
 }
 
 
@@ -1327,9 +1327,9 @@ template<class TagStore>
 void
 Cache<TagStore>::MemSidePort::recvFunctional(PacketPtr pkt)
 {
-    checkFunctional(pkt);
-    if (!pkt->isResponse())
+    if (!checkFunctional(pkt)) {
         myCache()->functionalAccess(pkt, cache->cpuSidePort);
+    }
 }
 
 
index b96fb8a5609b38567e1cea815889665464e48bbf..2f358daf21cdc3252edbd54fb7443cf6ad73ef23 100644 (file)
@@ -400,12 +400,12 @@ PhysicalMemory::MemoryPort::recvAtomic(PacketPtr pkt)
 void
 PhysicalMemory::MemoryPort::recvFunctional(PacketPtr pkt)
 {
-    checkFunctional(pkt);
-
-    // Default implementation of SimpleTimingPort::recvFunctional()
-    // calls recvAtomic() and throws away the latency; we can save a
-    // little here by just not calculating the latency.
-    memory->doFunctionalAccess(pkt);
+    if (!checkFunctional(pkt)) {
+        // Default implementation of SimpleTimingPort::recvFunctional()
+        // calls recvAtomic() and throws away the latency; we can save a
+        // little here by just not calculating the latency.
+        memory->doFunctionalAccess(pkt);
+    }
 }
 
 unsigned int
index e4b8d70e9d2131127dbb2a6a994066411c5c82bc..b1a6a48131cfa3f3c5ae4856b6c61ac0c70bd9c3 100644 (file)
@@ -30,7 +30,7 @@
 
 #include "mem/tport.hh"
 
-void
+bool
 SimpleTimingPort::checkFunctional(PacketPtr pkt)
 {
     DeferredPacketIterator i = transmitList.begin();
@@ -41,19 +41,20 @@ SimpleTimingPort::checkFunctional(PacketPtr pkt)
         // If the target contains data, and it overlaps the
         // probed request, need to update data
         if (pkt->checkFunctional(target)) {
-            return;
+            return true;
         }
     }
+
+    return false;
 }
 
 void
 SimpleTimingPort::recvFunctional(PacketPtr pkt)
 {
-    checkFunctional(pkt);
-
-    // Just do an atomic access and throw away the returned latency
-    if (!pkt->isResponse())
+    if (!checkFunctional(pkt)) {
+        // Just do an atomic access and throw away the returned latency
         recvAtomic(pkt);
+    }
 }
 
 bool
index bc9da6c44fea716adbe0848b9f26881142bc6710..d0f1be4253095d24a23fe174daa7806de5207222 100644 (file)
@@ -99,7 +99,7 @@ class SimpleTimingPort : public Port
 
     /** Check the list of buffered packets against the supplied
      * functional request. */
-    void checkFunctional(PacketPtr funcPkt);
+    bool checkFunctional(PacketPtr funcPkt);
 
     /** Check whether we have a packet ready to go on the transmit list. */
     bool deferredPacketReady()