diff options
Diffstat (limited to 'src/mem/cache/cache_impl.hh')
-rw-r--r-- | src/mem/cache/cache_impl.hh | 27 |
1 files changed, 19 insertions, 8 deletions
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> |