diff options
-rw-r--r-- | src/mem/cache/base.cc | 11 | ||||
-rw-r--r-- | src/mem/cache/base.hh | 5 | ||||
-rw-r--r-- | src/mem/cache/cache_impl.hh | 27 |
3 files changed, 32 insertions, 11 deletions
diff --git a/src/mem/cache/base.cc b/src/mem/cache/base.cc index dd1306270..2a285bf2f 100644 --- a/src/mem/cache/base.cc +++ b/src/mem/cache/base.cc @@ -106,13 +106,20 @@ BaseCache::CacheSlavePort::clearBlocked() DPRINTF(CachePort, "Cache port %s accepting new requests\n", name()); blocked = false; if (mustSendRetry) { - DPRINTF(CachePort, "Cache port %s sending retry\n", name()); - mustSendRetry = false; // @TODO: need to find a better time (next bus cycle?) owner.schedule(sendRetryEvent, curTick() + 1); } } +void +BaseCache::CacheSlavePort::processSendRetry() +{ + DPRINTF(CachePort, "Cache port %s sending retry\n", name()); + + // reset the flag and call retry + mustSendRetry = false; + sendRetry(); +} void BaseCache::init() diff --git a/src/mem/cache/base.hh b/src/mem/cache/base.hh index c1c77cde9..1567aaa62 100644 --- a/src/mem/cache/base.hh +++ b/src/mem/cache/base.hh @@ -182,7 +182,10 @@ class BaseCache : public MemObject private: - EventWrapper<SlavePort, &SlavePort::sendRetry> sendRetryEvent; + void processSendRetry(); + + EventWrapper<CacheSlavePort, + &CacheSlavePort::processSendRetry> sendRetryEvent; }; diff --git a/src/mem/cache/cache_impl.hh b/src/mem/cache/cache_impl.hh index 91cb5a4e3..1a72f285f 100644 --- a/src/mem/cache/cache_impl.hh +++ b/src/mem/cache/cache_impl.hh @@ -1937,16 +1937,27 @@ template<class TagStore> bool Cache<TagStore>::CpuSidePort::recvTimingReq(PacketPtr pkt) { - // always let inhibited requests through even if blocked - if (!pkt->memInhibitAsserted() && blocked) { - assert(!cache->system->bypassCaches()); - DPRINTF(Cache,"Scheduling a retry while blocked\n"); - mustSendRetry = true; - return false; + assert(!cache->system->bypassCaches()); + + bool success = false; + + // always let inhibited requests through, even if blocked + if (pkt->memInhibitAsserted()) { + // this should always succeed + success = cache->recvTimingReq(pkt); + assert(success); + } else if (blocked || mustSendRetry) { + // either already committed to send a retry, or blocked + success = false; + } else { + // for now this should always succeed + success = cache->recvTimingReq(pkt); + assert(success); } - cache->recvTimingReq(pkt); - return true; + // remember if we have to retry + mustSendRetry = !success; + return success; } template<class TagStore> |