summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mem/packet_queue.cc31
1 files changed, 15 insertions, 16 deletions
diff --git a/src/mem/packet_queue.cc b/src/mem/packet_queue.cc
index 45378aec6..282625a76 100644
--- a/src/mem/packet_queue.cc
+++ b/src/mem/packet_queue.cc
@@ -123,13 +123,6 @@ PacketQueue::schedSendTiming(PacketPtr pkt, Tick when)
name());
}
- // nothing on the list
- if (transmitList.empty()) {
- transmitList.emplace_front(when, pkt);
- schedSendEvent(when);
- return;
- }
-
// we should either have an outstanding retry, or a send event
// scheduled, but there is an unfortunate corner case where the
// x86 page-table walker and timing CPU send out a new request as
@@ -142,15 +135,21 @@ PacketQueue::schedSendTiming(PacketPtr pkt, Tick when)
// order by tick; however, if forceOrder is set, also make sure
// not to re-order in front of some existing packet with the same
// address
- auto i = transmitList.end();
- --i;
- while (i != transmitList.begin() && when < i->tick &&
- !(forceOrder && i->pkt->getAddr() == pkt->getAddr()))
- --i;
-
- // emplace inserts the element before the position pointed to by
- // the iterator, so advance it one step
- transmitList.emplace(++i, when, pkt);
+ auto it = transmitList.end();
+ while (it != transmitList.begin()) {
+ --it;
+ if ((forceOrder && it->pkt->getAddr() == pkt->getAddr()) ||
+ it->tick <= when) {
+ // emplace inserts the element before the position pointed to by
+ // the iterator, so advance it one step
+ transmitList.emplace(++it, when, pkt);
+ return;
+ }
+ }
+ // either the packet list is empty or this has to be inserted
+ // before every other packet
+ transmitList.emplace_front(when, pkt);
+ schedSendEvent(when);
}
void