From 12497284949cb5418e6bc403723c034aee655666 Mon Sep 17 00:00:00 2001 From: Steve Reinhardt Date: Thu, 9 Sep 2010 14:40:19 -0400 Subject: cache: fail SC when invalidated while waiting for bus Corrects an oversight in cset f97b62be544f. The fix there only failed queued SCUpgradeReq packets that encountered an invalidation, which meant that the upgrade had to reach the L2 cache. To handle pending requests in the L1 we must similarly fail StoreCondReq packets too. --- src/mem/cache/cache_impl.hh | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'src/mem/cache/cache_impl.hh') diff --git a/src/mem/cache/cache_impl.hh b/src/mem/cache/cache_impl.hh index 3f3dc6877..4f4d720b6 100644 --- a/src/mem/cache/cache_impl.hh +++ b/src/mem/cache/cache_impl.hh @@ -900,9 +900,10 @@ Cache::handleResponse(PacketPtr pkt) assert(!target->pkt->req->isUncacheable()); missLatency[target->pkt->cmdToIndex()][0/*pkt->req->threadId()*/] += completion_time - target->recvTime; - } else if (target->pkt->cmd == MemCmd::StoreCondReq && - pkt->cmd == MemCmd::UpgradeFailResp) { + } else if (pkt->cmd == MemCmd::UpgradeFailResp) { // failed StoreCond upgrade + assert(target->pkt->cmd == MemCmd::StoreCondReq || + target->pkt->cmd == MemCmd::StoreCondFailReq); completion_time = tags->getHitLatency() + pkt->finishTime; target->pkt->req->setExtraData(0); } else { @@ -1443,10 +1444,11 @@ Cache::getTimingPacket() PacketPtr tgt_pkt = mshr->getTarget()->pkt; PacketPtr pkt = NULL; - if (tgt_pkt->cmd == MemCmd::SCUpgradeFailReq) { - // SCUpgradeReq saw invalidation while queued in MSHR, so now - // that we are getting around to processing it, just treat it - // as if we got a failure response + if (tgt_pkt->cmd == MemCmd::SCUpgradeFailReq || + tgt_pkt->cmd == MemCmd::StoreCondFailReq) { + // SCUpgradeReq or StoreCondReq saw invalidation while queued + // in MSHR, so now that we are getting around to processing + // it, just treat it as if we got a failure response pkt = new Packet(tgt_pkt); pkt->cmd = MemCmd::UpgradeFailResp; pkt->senderState = mshr; -- cgit v1.2.3