diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mem/cache/base.cc | 8 | ||||
-rw-r--r-- | src/mem/cache/cache.cc | 8 |
2 files changed, 10 insertions, 6 deletions
diff --git a/src/mem/cache/base.cc b/src/mem/cache/base.cc index a510bac8a..8fd9ac298 100644 --- a/src/mem/cache/base.cc +++ b/src/mem/cache/base.cc @@ -491,6 +491,12 @@ BaseCache::recvTimingResp(PacketPtr pkt) // The block was marked not readable while there was a pending // cache maintenance operation, restore its flag. blk->status |= BlkReadable; + + // This was a cache clean operation (without invalidate) + // and we have a copy of the block already. Since there + // is no invalidation, we can promote targets that don't + // require a writable copy + mshr->promoteReadable(); } if (blk && blk->isWritable() && !pkt->req->isCacheInvalidate()) { @@ -887,6 +893,8 @@ BaseCache::satisfyRequest(PacketPtr pkt, CacheBlk *blk, bool, bool) pkt->setCacheResponding(); blk->status &= ~BlkDirty; } + } else if (pkt->isClean()) { + blk->status &= ~BlkDirty; } else { assert(pkt->isInvalidate()); invalidateBlock(blk); diff --git a/src/mem/cache/cache.cc b/src/mem/cache/cache.cc index ffd60811e..9b1612904 100644 --- a/src/mem/cache/cache.cc +++ b/src/mem/cache/cache.cc @@ -674,8 +674,6 @@ Cache::serviceMSHRTargets(MSHR *mshr, const PacketPtr pkt, CacheBlk *blk, const int initial_offset = initial_tgt->pkt->getOffset(blkSize); const bool is_error = pkt->isError(); - bool is_fill = !mshr->isForward && - (pkt->isRead() || pkt->cmd == MemCmd::UpgradeResp); // allow invalidation responses originating from write-line // requests to be discarded bool is_invalidate = pkt->isInvalidate(); @@ -716,13 +714,11 @@ Cache::serviceMSHRTargets(MSHR *mshr, const PacketPtr pkt, CacheBlk *blk, targets.allocOnFill); assert(blk); - // treat as a fill, and discard the invalidation - // response - is_fill = true; + // discard the invalidation response is_invalidate = false; } - if (is_fill) { + if (blk && blk->isValid() && !mshr->isForward) { satisfyRequest(tgt_pkt, blk, true, mshr->hasPostDowngrade()); // How many bytes past the first request is this one |