From: Steve Reinhardt Date: Sat, 17 Nov 2007 04:10:32 +0000 (-0800) Subject: Fix bug on exclusive response to ReadReq with pending WriteReq. X-Git-Tag: m5_2.0_beta5~77^2~7 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f03a62008ac3508e5c8cad214e1df407236e75ec;p=gem5.git Fix bug on exclusive response to ReadReq with pending WriteReq. --HG-- extra : convert_revision : 5429cd7ca84cf6348813a4607fa16f76aa5df7e0 --- 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(); + } }