summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mem/cache/cache.cc13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/mem/cache/cache.cc b/src/mem/cache/cache.cc
index 48382814f..e139b54a2 100644
--- a/src/mem/cache/cache.cc
+++ b/src/mem/cache/cache.cc
@@ -1437,7 +1437,18 @@ Cache::recvTimingResp(PacketPtr pkt)
assert(!is_error);
// response to snoop request
DPRINTF(Cache, "processing deferred snoop...\n");
- assert(!(is_invalidate && !mshr->hasPostInvalidate()));
+ // If the response is invalidating, a snooping target can
+ // be satisfied if it is also invalidating. If the reponse is, not
+ // only invalidating, but more specifically an InvalidateResp, the
+ // MSHR was created due to an InvalidateReq and a cache above is
+ // waiting to satisfy a WriteLineReq. In this case even an
+ // non-invalidating snoop is added as a target here since this is
+ // the ordering point. When the InvalidateResp reaches this cache,
+ // the snooping target will snoop further the cache above with the
+ // WriteLineReq.
+ assert(!(is_invalidate &&
+ pkt->cmd != MemCmd::InvalidateResp &&
+ !mshr->hasPostInvalidate()));
handleSnoop(tgt_pkt, blk, true, true, mshr->hasPostInvalidate());
break;