summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Nikoleris <nikos.nikoleris@arm.com>2018-12-04 15:52:17 +0000
committerNikos Nikoleris <nikos.nikoleris@arm.com>2019-01-17 11:09:41 +0000
commitfa0c2bd148419c5e6f17d5fd28aeae90fedad3da (patch)
tree3aa5389ad04a7956b96de9f6f2e08d36bfdf3e6a
parentccc50b7355fa9964c6da3ca1de2b3c48b7728bae (diff)
downloadgem5-fa0c2bd148419c5e6f17d5fd28aeae90fedad3da.tar.xz
mem: Allow inserts in the begining of a packet queue
A packet queue keeps track of packets that are scheduled to be sent at a specified time. Packets are sorted such that the packet with the earliest scheduled time is at the front of the list (unless there are other ordering requirements). Previouly, the implemented algorithm didn't allow packets to be placed at the front of the queue resulting in uneccessary delays. This change fixes the implementation of schedSendTiming. Change-Id: Ic74abec7c3f4c12dbf67b5ab26a8d4232e18e19e Signed-off-by: Nikos Nikoleris <nikos.nikoleris@arm.com> Reviewed-on: https://gem5-review.googlesource.com/c/15556 Reviewed-by: Bradley Wang <radwang@ucdavis.edu> Reviewed-by: Jason Lowe-Power <jason@lowepower.com> Maintainer: Jason Lowe-Power <jason@lowepower.com>
-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