summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mem/cache/mshr.cc20
-rw-r--r--src/mem/cache/mshr.hh19
2 files changed, 36 insertions, 3 deletions
diff --git a/src/mem/cache/mshr.cc b/src/mem/cache/mshr.cc
index 86b5a4c08..dd827ae12 100644
--- a/src/mem/cache/mshr.cc
+++ b/src/mem/cache/mshr.cc
@@ -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
diff --git a/src/mem/cache/mshr.hh b/src/mem/cache/mshr.hh
index 146e5e47a..253f5f388 100644
--- a/src/mem/cache/mshr.hh
+++ b/src/mem/cache/mshr.hh
@@ -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);