From f03a62008ac3508e5c8cad214e1df407236e75ec Mon Sep 17 00:00:00 2001 From: Steve Reinhardt Date: Fri, 16 Nov 2007 20:10:32 -0800 Subject: Fix bug on exclusive response to ReadReq with pending WriteReq. --HG-- extra : convert_revision : 5429cd7ca84cf6348813a4607fa16f76aa5df7e0 --- src/mem/cache/miss/mshr.cc | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/mem/cache/miss/mshr.cc b/src/mem/cache/miss/mshr.cc index 4e9b98481..e2ff444d5 100644 --- a/src/mem/cache/miss/mshr.cc +++ b/src/mem/cache/miss/mshr.cc @@ -330,6 +330,23 @@ MSHR::handleFill(Packet *pkt, CacheBlk *blk) // service... assert shared line on its behalf pkt->assertShared(); } + + if (!pkt->sharedAsserted() && !pendingInvalidate + && deferredTargets->needsExclusive) { + // We got an exclusive response, but we have deferred targets + // which are waiting to request an exclusive copy (not because + // of a pending invalidate). This can happen if the original + // request was for a read-only (non-exclusive) block, but we + // got an exclusive copy anyway because of the E part of the + // MOESI/MESI protocol. Since we got the exclusive copy + // there's no need to defer the targets, so move them up to + // the regular target list. + assert(!targets->needsExclusive); + targets->needsExclusive = true; + // this clears out deferredTargets too + targets->splice(targets->end(), *deferredTargets); + deferredTargets->resetFlags(); + } } -- cgit v1.2.3