From e656eeb288f8de94cc293012ba74c9c05fd75da3 Mon Sep 17 00:00:00 2001 From: Nikos Nikoleris Date: Sat, 17 Mar 2018 00:52:52 +0000 Subject: mem-cache: Fix promoting of targets that need writable There are cases where a request which does not need a writable copy gets an response upgraded reponse and fills in a writable copy. When this happens, we promote deferred MSHR targets that were deferred because they needed a writable copy to service them immediately. Previously, we would uncoditionally promote deferred targets. Since the deferred targets might contain a cache invalidation operation, we have to make sure that any targets following the cache invalidation is not promoted. Change-Id: I1f7b28f7d35f84329e065c8f63117db21852365a Reviewed-on: https://gem5-review.googlesource.com/11016 Reviewed-by: Daniel Carvalho Reviewed-by: Jason Lowe-Power Maintainer: Jason Lowe-Power --- src/mem/cache/mshr.cc | 18 ++++++++++++++---- src/mem/cache/mshr.hh | 7 +++++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/mem/cache/mshr.cc b/src/mem/cache/mshr.cc index d6208dde9..8ef8a2ca2 100644 --- a/src/mem/cache/mshr.cc +++ b/src/mem/cache/mshr.cc @@ -566,10 +566,20 @@ MSHR::promoteWritable() // if any of the deferred targets were upper-level cache // requests marked downstreamPending, need to clear that assert(!downstreamPending); // not pending here anymore - deferredTargets.clearDownstreamPending(); - // this clears out deferredTargets too - targets.splice(targets.end(), deferredTargets); - deferredTargets.resetFlags(); + + auto last_it = std::find_if( + deferredTargets.begin(), deferredTargets.end(), + [](MSHR::Target &t) { + assert(t.source == Target::FromCPU); + return t.pkt->req->isCacheInvalidate(); + }); + deferredTargets.clearDownstreamPending(deferredTargets.begin(), + last_it); + targets.splice(targets.end(), deferredTargets, + deferredTargets.begin(), last_it); + // We need to update the flags for the target lists after the + // modifications + deferredTargets.populateFlags(); } } diff --git a/src/mem/cache/mshr.hh b/src/mem/cache/mshr.hh index f93d3c0f5..71c2da2c4 100644 --- a/src/mem/cache/mshr.hh +++ b/src/mem/cache/mshr.hh @@ -385,6 +385,13 @@ class MSHR : public QueueEntry, public Printable bool promoteDeferredTargets(); + /** + * Promotes deferred targets that do not require writable + * + * Requests in the deferred target list are moved to the target + * list up until the first target that is a cache maintenance + * operation or needs a writable copy of the block + */ void promoteWritable(); bool checkFunctional(PacketPtr pkt); -- cgit v1.2.3