Add mechanism for caches to handle failure of the fast path on responses.
authorRon Dreslinski <rdreslin@umich.edu>
Sat, 7 Oct 2006 16:02:59 +0000 (12:02 -0400)
committerRon Dreslinski <rdreslin@umich.edu>
Sat, 7 Oct 2006 16:02:59 +0000 (12:02 -0400)
For now, responses have priority over requests (may want to revist this).

src/mem/cache/base_cache.cc:
src/mem/cache/base_cache.hh:
    Add mechanism for caches to handle failure of the fast path on responses.

--HG--
extra : convert_revision : 01524c727d1bb300cc21bdc989eb862ec8bf0b7a

src/mem/cache/base_cache.cc
src/mem/cache/base_cache.hh

index e6138e32044652cebf0ab64aa4ab306b04494876..fd97ea3aa5fcd72c698d7c6d0f9af67f8c6d8a75 100644 (file)
@@ -96,6 +96,15 @@ void
 BaseCache::CachePort::recvRetry()
 {
     Packet *pkt;
+    if (!drainList.empty()) {
+        //We have some responses to drain first
+        bool result = true;
+        while (result && !drainList.empty()) {
+            result = sendTiming(drainList.front());
+            if (result)
+                drainList.pop_front();
+        }
+    }
 
     if (!isCpuSide)
     {
@@ -202,7 +211,10 @@ BaseCache::CacheEvent::process()
     //Know the packet to send
     pkt->result = Packet::Success;
     pkt->makeTimingResponse();
-    assert(cachePort->sendTiming(pkt));
+    if (!cachePort->sendTiming(pkt)) {
+        //It failed, save it to list of drain events
+        cachePort->drainList.push_back(pkt);
+    }
 }
 
 const char *
index 7c16398aaa8e30860aa63223ae10615112bd3c16..c69fb7fd5fc9fc89578bd38905960a9d3c13b601 100644 (file)
@@ -110,6 +110,8 @@ class BaseCache : public MemObject
         bool mustSendRetry;
 
         bool isCpuSide;
+
+        std::list<Packet *> drainList;
     };
 
     struct CacheEvent : public Event