From 76088fb9ca0ecb747e84bdfc825cd67b189b502d Mon Sep 17 00:00:00 2001 From: Andreas Hansson Date: Fri, 4 Sep 2015 13:13:58 -0400 Subject: mem: Tidy up the snoop state-transition logic Remove broken and unused option to pass dirty data on non-exclusive snoops. Also beef up the comments a bit. --- src/mem/cache/cache.cc | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) (limited to 'src/mem/cache') diff --git a/src/mem/cache/cache.cc b/src/mem/cache/cache.cc index 81c2d35e1..3060c3e77 100644 --- a/src/mem/cache/cache.cc +++ b/src/mem/cache/cache.cc @@ -1828,17 +1828,13 @@ Cache::handleSnoop(PacketPtr pkt, CacheBlk *blk, bool is_timing, } if (!pkt->req->isUncacheable() && pkt->isRead() && !invalidate) { + // reading non-exclusive shared data, note that we retain + // the block in owned state if it is dirty, with the response + // taken care of below, and otherwhise simply downgrade to + // shared assert(!needs_exclusive); pkt->assertShared(); - int bits_to_clear = BlkWritable; - const bool haveOwnershipState = true; // for now - if (!haveOwnershipState) { - // if we don't support pure ownership (dirty && !writable), - // have to clear dirty bit here, assume memory snarfs data - // on cache-to-cache xfer - bits_to_clear |= BlkDirty; - } - blk->status &= ~bits_to_clear; + blk->status &= ~BlkWritable; } if (respond) { @@ -1850,9 +1846,10 @@ Cache::handleSnoop(PacketPtr pkt, CacheBlk *blk, bool is_timing, // will write it back at a later point pkt->assertMemInhibit(); if (have_exclusive) { - // in the case of an uncacheable request there is no need - // to set the exclusive flag, but since the recipient does - // not care there is no harm in doing so + // in the case of an uncacheable request there is no point + // in setting the exclusive flag, but since the recipient + // does not care there is no harm in doing so, in any case + // it is just a hint pkt->setSupplyExclusive(); } if (is_timing) { -- cgit v1.2.3