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.
This commit is contained in:
parent
0bd9cea340
commit
e918536380
2 changed files with 9 additions and 0 deletions
8
src/mem/cache/cache_impl.hh
vendored
8
src/mem/cache/cache_impl.hh
vendored
|
@ -360,6 +360,9 @@ Cache<TagStore>::access(PacketPtr pkt, BlkType *&blk,
|
|||
}
|
||||
std::memcpy(blk->data, pkt->getPtr<uint8_t>(), 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<TagStore>::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<uint8_t>(), blk->data, blkSize);
|
||||
|
||||
|
@ -1307,6 +1313,8 @@ Cache<TagStore>::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
|
||||
|
|
|
@ -422,6 +422,7 @@ class Packet : public FastAlloc, public Printable
|
|||
void setExpressSnoop() { flags.set(EXPRESS_SNOOP); }
|
||||
bool isExpressSnoop() { return flags.isSet(EXPRESS_SNOOP); }
|
||||
void setSupplyExclusive() { flags.set(SUPPLY_EXCLUSIVE); }
|
||||
void clearSupplyExclusive() { flags.clear(SUPPLY_EXCLUSIVE); }
|
||||
bool isSupplyExclusive() { return flags.isSet(SUPPLY_EXCLUSIVE); }
|
||||
|
||||
// Network error conditions... encapsulate them as methods since
|
||||
|
|
Loading…
Reference in a new issue