mem: Allow packet queue to move next send event forward
authorAndreas Hansson <andreas.hansson@arm.com>
Thu, 9 Oct 2014 21:51:52 +0000 (17:51 -0400)
committerAndreas Hansson <andreas.hansson@arm.com>
Thu, 9 Oct 2014 21:51:52 +0000 (17:51 -0400)
This patch changes the packet queue such that when scheduling a send,
the queue is allowed to move the event forward.

src/mem/packet_queue.cc

index 428f8c13f9ed26fdab9d953682e621c3c12326d4..e9fe72ead1bc2dd838adc355fec8f6ae51ea4842 100644 (file)
@@ -168,13 +168,19 @@ PacketQueue::scheduleSend(Tick time)
 {
     // the next ready time is either determined by the next deferred packet,
     // or in the cache through the MSHR ready time
-    Tick nextReady = std::min(deferredPacketReadyTime(), time);
+    Tick nextReady = std::max(std::min(deferredPacketReadyTime(), time),
+                              curTick() + 1);
 
     if (nextReady != MaxTick) {
         // if the sendTiming caused someone else to call our
         // recvTiming we could already have an event scheduled, check
-        if (!sendEvent.scheduled())
-            em.schedule(&sendEvent, std::max(nextReady, curTick() + 1));
+        if (!sendEvent.scheduled()) {
+            em.schedule(&sendEvent, nextReady);
+        } else if (nextReady < sendEvent.when()) {
+            // if the new time is earlier than when the event
+            // currently is scheduled, move it forward
+            em.reschedule(&sendEvent, nextReady);
+        }
     } else {
         // no more to send, so if we're draining, we may be done
         if (drainManager && transmitList.empty() && !sendEvent.scheduled()) {