summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Nikoleris <nikos.nikoleris@arm.com>2018-03-17 00:22:23 +0000
committerNikos Nikoleris <nikos.nikoleris@arm.com>2018-06-22 17:39:16 +0000
commit97075b9982537b8d7cf7f921b8e0e667ffa7691c (patch)
treefbc5d76238d4e17724374aae1a7468b6b2dc6fb2
parent60b24f43959d1a99962cda42075a4f16966becb2 (diff)
downloadgem5-97075b9982537b8d7cf7f921b8e0e667ffa7691c.tar.xz
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 <odanrc@yahoo.com.br> Reviewed-by: Jason Lowe-Power <jason@lowepower.com> Maintainer: Jason Lowe-Power <jason@lowepower.com>
-rw-r--r--src/mem/cache/mshr.cc17
-rw-r--r--src/mem/cache/mshr.hh1
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 *mshr = t->pkt->findNextSenderState<MSHR>();
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;