mem: Invalidate a blk when servicing the 1st invalidating target
[gem5.git] / src / mem / cache / cache.cc
index e139b54a23f67ad5039ce6a6356dad44ec332292..1a169c8eac9067172827d9747846b4b8711b5840 100644 (file)
@@ -1393,6 +1393,17 @@ Cache::recvTimingResp(PacketPtr pkt)
                     pkt->payloadDelay;
                 tgt_pkt->req->setExtraData(0);
             } else {
+                // We are about to send a response to a cache above
+                // that asked for an invalidation; we need to
+                // invalidate our copy immediately as the most
+                // up-to-date copy of the block will now be in the
+                // cache above. It will also prevent this cache from
+                // responding (if the block was previously dirty) to
+                // snoops as they should snoop the caches above where
+                // they will get the response from.
+                if (is_invalidate && blk && blk->isValid()) {
+                    invalidateBlock(blk);
+                }
                 // not a cache fill, just forwarding response
                 // responseLatency is the latency of the return path
                 // from lower level cahces/memory to the core.