summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Hansson <andreas.hansson@arm.com>2015-09-25 07:26:58 -0400
committerAndreas Hansson <andreas.hansson@arm.com>2015-09-25 07:26:58 -0400
commit012dd52dc2e7f6d1b3b31dd0ce34361f54615779 (patch)
tree4d29e42277db3d1b725926b531572c748501d53b
parent5570aa9e9afd7392d561b02081560dfe90dca3f5 (diff)
downloadgem5-012dd52dc2e7f6d1b3b31dd0ce34361f54615779.tar.xz
mem: Fix WriteLineReq fill behaviour
This patch fixes issues in the interactions between deferred snoops and WriteLineReq. More specifically, the patch addresses an issue where deferred snoops caused assertion failures when being serviced on the arrival of an InvalidateResp. The response packet was perceived to be invalidating, when actually it is not for the cache that sent out the original invalidation request.
-rw-r--r--src/mem/cache/cache.cc11
1 files changed, 5 insertions, 6 deletions
diff --git a/src/mem/cache/cache.cc b/src/mem/cache/cache.cc
index 5ca17b88d..fe715fa6d 100644
--- a/src/mem/cache/cache.cc
+++ b/src/mem/cache/cache.cc
@@ -1228,7 +1228,7 @@ Cache::recvTimingResp(PacketPtr pkt)
// allow invalidation responses originating from write-line
// requests to be discarded
- bool discard_invalidate = false;
+ bool is_invalidate = pkt->isInvalidate();
// First offset for critical word first calculations
int initial_offset = initial_tgt->pkt->getOffset(blkSize);
@@ -1271,7 +1271,7 @@ Cache::recvTimingResp(PacketPtr pkt)
// treat as a fill, and discard the invalidation
// response
is_fill = true;
- discard_invalidate = true;
+ is_invalidate = false;
}
if (is_fill) {
@@ -1327,7 +1327,7 @@ Cache::recvTimingResp(PacketPtr pkt)
if (is_error)
tgt_pkt->copyError(pkt);
if (tgt_pkt->cmd == MemCmd::ReadResp &&
- (pkt->isInvalidate() || mshr->hasPostInvalidate())) {
+ (is_invalidate || mshr->hasPostInvalidate())) {
// If intermediate cache got ReadRespWithInvalidate,
// propagate that. Response should not have
// isInvalidate() set otherwise.
@@ -1353,7 +1353,7 @@ Cache::recvTimingResp(PacketPtr pkt)
assert(!is_error);
// response to snoop request
DPRINTF(Cache, "processing deferred snoop...\n");
- assert(!(pkt->isInvalidate() && !mshr->hasPostInvalidate()));
+ assert(!(is_invalidate && !mshr->hasPostInvalidate()));
handleSnoop(tgt_pkt, blk, true, true, mshr->hasPostInvalidate());
break;
@@ -1368,8 +1368,7 @@ Cache::recvTimingResp(PacketPtr pkt)
// an invalidate response stemming from a write line request
// should not invalidate the block, so check if the
// invalidation should be discarded
- if ((pkt->isInvalidate() || mshr->hasPostInvalidate()) &&
- !discard_invalidate) {
+ if (is_invalidate || mshr->hasPostInvalidate()) {
assert(blk != tempBlock);
tags->invalidate(blk);
blk->invalidate();