mem: Add support for repopulating the flags of an MSHR TargetList
authorNikos Nikoleris <nikos.nikoleris@arm.com>
Mon, 5 Dec 2016 21:48:17 +0000 (16:48 -0500)
committerNikos Nikoleris <nikos.nikoleris@arm.com>
Mon, 5 Dec 2016 21:48:17 +0000 (16:48 -0500)
This patch adds support for repopulating the flags of an MSHR
TargetList. The added functionality makes it possible to remove
targets from a TargetList without leaving it in an inconsistent state.

Change-Id: I3f7a8e97bfd3e2e49bebad056d11bbfb087aad91
Reviewed-by: Andreas Hansson <andreas.hansson@arm.com>
Reviewed-by: Stephan Diestelhorst <stephan.diestelhorst@arm.com>
src/mem/cache/mshr.cc
src/mem/cache/mshr.hh

index 86b5a4c0884cd8de5a798aa564a64b3a87e10294..dd827ae125040100a5eb45cfed8e45a7583d23ca 100644 (file)
@@ -74,9 +74,8 @@ MSHR::TargetList::TargetList()
 {}
 
 
-inline void
-MSHR::TargetList::add(PacketPtr pkt, Tick readyTime,
-                      Counter order, Target::Source source, bool markPending)
+void
+MSHR::TargetList::updateFlags(PacketPtr pkt, Target::Source source)
 {
     if (source != Target::FromSnoop) {
         if (pkt->needsWritable()) {
@@ -90,7 +89,22 @@ MSHR::TargetList::add(PacketPtr pkt, Tick readyTime,
             hasUpgrade = true;
         }
     }
+}
+
+void
+MSHR::TargetList::populateFlags()
+{
+    resetFlags();
+    for (auto& t: *this) {
+        updateFlags(t.pkt, t.source);
+    }
+}
 
+inline void
+MSHR::TargetList::add(PacketPtr pkt, Tick readyTime,
+                      Counter order, Target::Source source, bool markPending)
+{
+    updateFlags(pkt, source);
     if (markPending) {
         // Iterate over the SenderState stack and see if we find
         // an MSHR entry. If we do, set the downstreamPending
index 146e5e47a4988c221f9bd399ce5621bb71ccbe32..253f5f38802863872c7aff4ff996523d53e97acb 100644 (file)
@@ -143,7 +143,26 @@ class MSHR : public QueueEntry, public Printable
         bool hasUpgrade;
 
         TargetList();
+
+        /**
+         * Use the provided packet and the source to update the
+         * flags of this TargetList.
+         *
+         * @param pkt Packet considered for the flag update
+         * @param source Indicates the source of the packet
+         */
+        void updateFlags(PacketPtr pkt, Target::Source source);
+
         void resetFlags() { needsWritable = hasUpgrade = false; }
+
+        /**
+         * Goes through the list of targets and uses them to populate
+         * the flags of this TargetList. When the function returns the
+         * flags are consistent with the properties of packets in the
+         * list.
+         */
+        void populateFlags();
+
         bool isReset() const { return !needsWritable && !hasUpgrade; }
         void add(PacketPtr pkt, Tick readyTime, Counter order,
                  Target::Source source, bool markPending);