From: Nikos Nikoleris Date: Tue, 12 Feb 2019 08:26:14 +0000 (+0000) Subject: mem-cache: Fix MSHR handling of cache clean requests X-Git-Tag: v19.0.0.0~975 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a8d5dd1c136529e9605066368877d3b8e24dcdba;p=gem5.git mem-cache: Fix MSHR handling of cache clean requests Previously satisfied clean requests would not snoop in-service MSHRs. This is a problem when a clean request is also invalidating, in which case we have to post-invalidate or post-downgrade outstanding requests. This changes fixes this bug. Change-Id: I31e42aa94dd3637b2818e00fbaae68c810145eaf Signed-off-by: Nikos Nikoleris Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/17728 Reviewed-by: Daniel Carvalho --- diff --git a/src/mem/cache/cache.cc b/src/mem/cache/cache.cc index 89e40f328..938b6f4e9 100644 --- a/src/mem/cache/cache.cc +++ b/src/mem/cache/cache.cc @@ -1180,13 +1180,6 @@ Cache::recvTimingSnoopReq(PacketPtr pkt) return; } - // Bypass any existing cache maintenance requests if the request - // has been satisfied already (i.e., the dirty block has been - // found). - if (mshr && pkt->req->isCacheMaintenance() && pkt->satisfied()) { - return; - } - // Let the MSHR itself track the snoop and decide whether we want // to go ahead and do the regular cache snoop if (mshr && mshr->handleSnoop(pkt, order++)) { diff --git a/src/mem/cache/mshr.cc b/src/mem/cache/mshr.cc index 5b9302925..8db7c2997 100644 --- a/src/mem/cache/mshr.cc +++ b/src/mem/cache/mshr.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2013, 2015-2018 ARM Limited + * Copyright (c) 2012-2013, 2015-2019 ARM Limited * All rights reserved. * * The license below extends only to copyright in the software and shall @@ -459,7 +459,14 @@ MSHR::handleSnoop(PacketPtr pkt, Counter _order) // in the case of an uncacheable request there is no need // to set the responderHadWritable flag, but since the // recipient does not care there is no harm in doing so + } else if (isPendingModified() && pkt->isClean()) { + // this cache doesn't respond to the clean request, a + // destination xbar will respond to this request, but to + // do so it needs to know if it should wait for the + // WriteCleanReq + pkt->setSatisfied(); } + targets.add(cp_pkt, curTick(), _order, Target::FromSnoop, downstreamPending && targets.needsWritable, false); @@ -467,10 +474,6 @@ MSHR::handleSnoop(PacketPtr pkt, Counter _order) // This transaction will take away our pending copy postInvalidate = true; } - - if (isPendingModified() && pkt->isClean()) { - pkt->setSatisfied(); - } } if (!pkt->needsWritable() && !pkt->req->isUncacheable()) {