cache: don't allow dirty data in the i-cache
authorAnthony Gutierrez <atgutier@umich.edu>
Fri, 27 Jul 2012 20:08:04 +0000 (16:08 -0400)
committerAnthony Gutierrez <atgutier@umich.edu>
Fri, 27 Jul 2012 20:08:04 +0000 (16:08 -0400)
removes the optimization that forwards an exclusive copy to a requester on a
read, only for the i-cache. this optimization isn't necessary because we
typically won't be writing to the i-cache.

src/mem/cache/cache_impl.hh

index 7b332e31d7800374d9f01e7b24ea2b57b54520f8..8e6c3964403535c8b698641d2d3a549be0e8cbe8 100644 (file)
@@ -172,7 +172,7 @@ Cache<TagStore>::satisfyCpuSideRequest(PacketPtr pkt, BlkType *blk,
                 // on ReadExReq we give up our copy unconditionally
                 tags->invalidateBlk(blk);
             } else if (blk->isWritable() && !pending_downgrade
-                       && !pkt->sharedAsserted()) {
+                      && !pkt->sharedAsserted() && !pkt->req->isInstFetch()) {
                 // we can give the requester an exclusive copy (by not
                 // asserting shared line) on a read request if:
                 // - we have an exclusive copy at this level (& below)
@@ -180,7 +180,9 @@ Cache<TagStore>::satisfyCpuSideRequest(PacketPtr pkt, BlkType *blk,
                 //   signaling another read request
                 // - no other cache above has a copy (otherwise it
                 //   would have asseretd shared line on request)
-                
+                // - we are not satisfying an instruction fetch (this
+                //   prevents dirty data in the i-cache)
+
                 if (blk->isDirty()) {
                     // special considerations if we're owner:
                     if (!deferred_response && !isTopLevel) {