mem: Pass shared downstream through caches
This patch ensures that we pass on information about a packet being shared (rather than exclusive), when forwarding a packet downstream. Without this patch there is a risk that a downstream cache considers the line exclusive when it really isn't.
This commit is contained in:
parent
3d33432136
commit
14e5b2ea55
1 changed files with 12 additions and 0 deletions
12
src/mem/cache/cache_impl.hh
vendored
12
src/mem/cache/cache_impl.hh
vendored
|
@ -819,6 +819,18 @@ Cache::getBusPacket(PacketPtr cpu_pkt, CacheBlk *blk,
|
||||||
}
|
}
|
||||||
PacketPtr pkt = new Packet(cpu_pkt->req, cmd, blkSize);
|
PacketPtr pkt = new Packet(cpu_pkt->req, cmd, blkSize);
|
||||||
|
|
||||||
|
// if there are sharers in the upper levels, pass that info downstream
|
||||||
|
if (cpu_pkt->sharedAsserted()) {
|
||||||
|
// note that cpu_pkt may have spent a considerable time in the
|
||||||
|
// MSHR queue and that the information could possibly be out
|
||||||
|
// of date, however, there is no harm in conservatively
|
||||||
|
// assuming the block is shared
|
||||||
|
pkt->assertShared();
|
||||||
|
DPRINTF(Cache, "%s passing shared from %s to %s addr %#llx size %d\n",
|
||||||
|
__func__, cpu_pkt->cmdString(), pkt->cmdString(),
|
||||||
|
pkt->getAddr(), pkt->getSize());
|
||||||
|
}
|
||||||
|
|
||||||
// the packet should be block aligned
|
// the packet should be block aligned
|
||||||
assert(pkt->getAddr() == blockAlign(pkt->getAddr()));
|
assert(pkt->getAddr() == blockAlign(pkt->getAddr()));
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue