From e9185363804489ce2b84d50fe77ed94f3a5f1e01 Mon Sep 17 00:00:00 2001 From: Steve Reinhardt Date: Tue, 21 Sep 2010 23:07:34 -0700 Subject: cache: improve coherence handling of writebacks If we write back an exclusive copy, we now mark it as such, so the cache receiving the writeback can mark its copy as exclusive. This avoids some unnecessary upgrade requests when a cache later tries to re-acquire exclusive access to the block. --- src/mem/cache/cache_impl.hh | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src/mem/cache') diff --git a/src/mem/cache/cache_impl.hh b/src/mem/cache/cache_impl.hh index 4f4d720b6..86bf79b7b 100644 --- a/src/mem/cache/cache_impl.hh +++ b/src/mem/cache/cache_impl.hh @@ -360,6 +360,9 @@ Cache::access(PacketPtr pkt, BlkType *&blk, } std::memcpy(blk->data, pkt->getPtr(), blkSize); blk->status |= BlkDirty; + if (pkt->isSupplyExclusive()) { + blk->status |= BlkWritable; + } // nothing else to do; writeback doesn't expect response assert(!pkt->needsResponse()); incHitCount(pkt, id); @@ -1007,6 +1010,9 @@ Cache::writebackBlk(BlkType *blk) Request *writebackReq = new Request(tags->regenerateBlkAddr(blk->tag, blk->set), blkSize, 0); PacketPtr writeback = new Packet(writebackReq, MemCmd::Writeback, -1); + if (blk->isWritable()) { + writeback->setSupplyExclusive(); + } writeback->allocate(); std::memcpy(writeback->getPtr(), blk->data, blkSize); @@ -1307,6 +1313,8 @@ Cache::snoopTiming(PacketPtr pkt) pkt->assertMemInhibit(); if (!pkt->needsExclusive()) { pkt->assertShared(); + // the writeback is no longer the exclusive copy in the system + wb_pkt->clearSupplyExclusive(); } else { // if we're not asserting the shared line, we need to // invalidate our copy. we'll do that below as long as -- cgit v1.2.3