diff options
Diffstat (limited to 'src/mem/cache')
-rw-r--r-- | src/mem/cache/mshr.cc | 18 | ||||
-rw-r--r-- | 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); |