mem: Ensure InvalidateReq is considered isForward by MSHRs

This patch fixes an issue where an MSHR would incorrectly be perceived
to provide data to targets arriving after an InvalidateReq. To address
this the InvalidateReq is now treated as isForward, much like an
UpgradeReq that did not hit in the cache.

Change-Id: Ia878444d949539b5c33fd19f3e12b0b8a872275e
Reviewed-by: Andreas Hansson <andreas.hansson@arm.com>
Reviewed-by: Stephan Diestelhorst <stephan.diestelhorst@arm.com>
This commit is contained in:
Andreas Hansson 2016-12-05 16:48:23 -05:00
parent e16967941b
commit 50812a20f1

View file

@ -909,7 +909,8 @@ Cache::createMissPacket(PacketPtr cpu_pkt, CacheBlk *blk,
bool blkValid = blk && blk->isValid(); bool blkValid = blk && blk->isValid();
if (cpu_pkt->req->isUncacheable() || if (cpu_pkt->req->isUncacheable() ||
(!blkValid && cpu_pkt->isUpgrade())) { (!blkValid && cpu_pkt->isUpgrade()) ||
cpu_pkt->cmd == MemCmd::InvalidateReq) {
// uncacheable requests and upgrades from upper-level caches // uncacheable requests and upgrades from upper-level caches
// that missed completely just go through as is // that missed completely just go through as is
return nullptr; return nullptr;
@ -936,8 +937,7 @@ Cache::createMissPacket(PacketPtr cpu_pkt, CacheBlk *blk,
// where the determination the StoreCond fails is delayed due to // where the determination the StoreCond fails is delayed due to
// all caches not being on the same local bus. // all caches not being on the same local bus.
cmd = MemCmd::SCUpgradeFailReq; cmd = MemCmd::SCUpgradeFailReq;
} else if (cpu_pkt->cmd == MemCmd::WriteLineReq || } else if (cpu_pkt->cmd == MemCmd::WriteLineReq) {
cpu_pkt->cmd == MemCmd::InvalidateReq) {
// forward as invalidate to all other caches, this gives us // forward as invalidate to all other caches, this gives us
// the line in Exclusive state, and invalidates all other // the line in Exclusive state, and invalidates all other
// copies // copies