summaryrefslogtreecommitdiff
path: root/src/mem/cache/mshr.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem/cache/mshr.cc')
-rw-r--r--src/mem/cache/mshr.cc18
1 files changed, 14 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();
}
}