From 97075b9982537b8d7cf7f921b8e0e667ffa7691c Mon Sep 17 00:00:00 2001 From: Nikos Nikoleris Date: Sat, 17 Mar 2018 00:22:23 +0000 Subject: mem-cache: Selectively clear downstream pending Until now, all deferred targets of an MSHR would be promoted together as soon as the targets were serviced. When we promote deferred targets we also clear the downstreamPending flag. Due to the way we handle cache clean operations we might need to promote only deferred targets that don't require writable, leaving some targets as deferred. To allow for partial target promotion, this change adds support for clearing the downstreamPending only for a subset of a TargetsList. Change-Id: Id06953643ba9a975ebacc76ac10215441e264e74 Reviewed-on: https://gem5-review.googlesource.com/11015 Reviewed-by: Daniel Carvalho Reviewed-by: Jason Lowe-Power Maintainer: Jason Lowe-Power --- src/mem/cache/mshr.cc | 17 ++++++++++++----- src/mem/cache/mshr.hh | 1 + 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/mem/cache/mshr.cc b/src/mem/cache/mshr.cc index 21ce8a36d..d6208dde9 100644 --- a/src/mem/cache/mshr.cc +++ b/src/mem/cache/mshr.cc @@ -179,25 +179,32 @@ MSHR::TargetList::replaceUpgrades() void -MSHR::TargetList::clearDownstreamPending() +MSHR::TargetList::clearDownstreamPending(MSHR::TargetList::iterator begin, + MSHR::TargetList::iterator end) { - for (auto& t : *this) { - if (t.markedPending) { + for (auto t = begin; t != end; t++) { + if (t->markedPending) { // Iterate over the SenderState stack and see if we find // an MSHR entry. If we find one, clear the // downstreamPending flag by calling // clearDownstreamPending(). This recursively clears the // downstreamPending flag in all caches this packet has // passed through. - MSHR *mshr = t.pkt->findNextSenderState(); + MSHR *mshr = t->pkt->findNextSenderState(); if (mshr != nullptr) { mshr->clearDownstreamPending(); } - t.markedPending = false; + t->markedPending = false; } } } +void +MSHR::TargetList::clearDownstreamPending() +{ + clearDownstreamPending(begin(), end()); +} + bool MSHR::TargetList::checkFunctional(PacketPtr pkt) diff --git a/src/mem/cache/mshr.hh b/src/mem/cache/mshr.hh index 5c5a9e8d1..f93d3c0f5 100644 --- a/src/mem/cache/mshr.hh +++ b/src/mem/cache/mshr.hh @@ -234,6 +234,7 @@ class MSHR : public QueueEntry, public Printable void replaceUpgrades(); void clearDownstreamPending(); + void clearDownstreamPending(iterator begin, iterator end); bool checkFunctional(PacketPtr pkt); void print(std::ostream &os, int verbosity, const std::string &prefix) const; -- cgit v1.2.3