summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndreas Hansson <andreas.hansson@arm.com>2015-01-20 08:12:01 -0500
committerAndreas Hansson <andreas.hansson@arm.com>2015-01-20 08:12:01 -0500
commit6096e2f9c11afbb57b78f985f8b8fe7e059821b0 (patch)
treeb44abb5bbdc399d0285f18ebd09943f5b0a2c9a4 /src
parentda0c770943a26cd258fcd9bf608e1c78ff8e6be5 (diff)
downloadgem5-6096e2f9c11afbb57b78f985f8b8fe7e059821b0.tar.xz
mem: Fix bug in cache request retry mechanism
This patch ensures that inhibited packets that are about to be turned into express snoops do not update the retry flag in the cache.
Diffstat (limited to 'src')
-rw-r--r--src/mem/cache/cache_impl.hh11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/mem/cache/cache_impl.hh b/src/mem/cache/cache_impl.hh
index cb02f7558..62b65fc42 100644
--- a/src/mem/cache/cache_impl.hh
+++ b/src/mem/cache/cache_impl.hh
@@ -2029,11 +2029,14 @@ Cache<TagStore>::CpuSidePort::recvTimingReq(PacketPtr pkt)
bool success = false;
- // always let inhibited requests through, even if blocked
+ // always let inhibited requests through, even if blocked,
+ // ultimately we should check if this is an express snoop, but at
+ // the moment that flag is only set in the cache itself
if (pkt->memInhibitAsserted()) {
- // this should always succeed
- success = cache->recvTimingReq(pkt);
- assert(success);
+ // do not change the current retry state
+ bool M5_VAR_USED bypass_success = cache->recvTimingReq(pkt);
+ assert(bypass_success);
+ return true;
} else if (blocked || mustSendRetry) {
// either already committed to send a retry, or blocked
success = false;