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.
This commit is contained in:
parent
8e74d5484f
commit
76088fb9ca
1 changed files with 9 additions and 12 deletions
21
src/mem/cache/cache.cc
vendored
21
src/mem/cache/cache.cc
vendored
|
@ -1828,17 +1828,13 @@ Cache::handleSnoop(PacketPtr pkt, CacheBlk *blk, bool is_timing,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!pkt->req->isUncacheable() && pkt->isRead() && !invalidate) {
|
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);
|
assert(!needs_exclusive);
|
||||||
pkt->assertShared();
|
pkt->assertShared();
|
||||||
int bits_to_clear = BlkWritable;
|
blk->status &= ~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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (respond) {
|
if (respond) {
|
||||||
|
@ -1850,9 +1846,10 @@ Cache::handleSnoop(PacketPtr pkt, CacheBlk *blk, bool is_timing,
|
||||||
// will write it back at a later point
|
// will write it back at a later point
|
||||||
pkt->assertMemInhibit();
|
pkt->assertMemInhibit();
|
||||||
if (have_exclusive) {
|
if (have_exclusive) {
|
||||||
// in the case of an uncacheable request there is no need
|
// in the case of an uncacheable request there is no point
|
||||||
// to set the exclusive flag, but since the recipient does
|
// in setting the exclusive flag, but since the recipient
|
||||||
// not care there is no harm in doing so
|
// does not care there is no harm in doing so, in any case
|
||||||
|
// it is just a hint
|
||||||
pkt->setSupplyExclusive();
|
pkt->setSupplyExclusive();
|
||||||
}
|
}
|
||||||
if (is_timing) {
|
if (is_timing) {
|
||||||
|
|
Loading…
Reference in a new issue