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);