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:
Andreas Hansson 2015-05-05 03:22:26 -04:00
parent 3d33432136
commit 14e5b2ea55

View file

@ -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()));