mem: Delay servicing an MSHR after its allocation
authorNikos Nikoleris <nikos.nikoleris@arm.com>
Mon, 10 Oct 2016 12:48:08 +0000 (13:48 +0100)
committerNikos Nikoleris <nikos.nikoleris@arm.com>
Thu, 18 Oct 2018 09:40:05 +0000 (09:40 +0000)
An MSHR is allocated and the computed latency determines when the MSHR
will be ready and can be serviced by the cache. This patch adds a
function that allows changing the time that an MSHR is ready and
adjusts the queue such that other MSHRs can be serviced first if they
are ready.

Change-Id: Ie908191fcb3c2d84d4c6f855c8b1e41ca5881bff
Reviewed-on: https://gem5-review.googlesource.com/c/12906
Reviewed-by: Daniel Carvalho <odanrc@yahoo.com.br>
Maintainer: Nikos Nikoleris <nikos.nikoleris@arm.com>

src/mem/cache/mshr.hh
src/mem/cache/mshr_queue.cc
src/mem/cache/mshr_queue.hh

index 56b81b6b233378038b2f228bf241244322b971d1..b94dfb9c53721f412b7d777fa06f8f33666cab78 100644 (file)
@@ -513,6 +513,16 @@ class MSHR : public QueueEntry, public Printable
 
     bool trySatisfyFunctional(PacketPtr pkt);
 
+    /**
+     * Adds a delay relative to the current tick to the current MSHR
+     * @param delay_ticks the desired delay in ticks
+     */
+    void delay(Tick delay_ticks)
+    {
+        assert(readyTime <= curTick());
+        readyTime = curTick() + delay_ticks;
+    }
+
     /**
      * Prints the contents of this MSHR for debugging.
      */
index e44a21954b50299b8548499cb7cd7480f24d7c7c..f4b80540c78a7677b69e84c5a8709e39dd3c32ab 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2013, 2015-2016 ARM Limited
+ * Copyright (c) 2012-2013, 2015-2016, 2018 ARM Limited
  * All rights reserved.
  *
  * The license below extends only to copyright in the software and shall
@@ -84,6 +84,17 @@ MSHRQueue::moveToFront(MSHR *mshr)
     }
 }
 
+void
+MSHRQueue::delay(MSHR *mshr, Tick delay_ticks)
+{
+    mshr->delay(delay_ticks);
+    auto it = std::find_if(mshr->readyIter, readyList.end(),
+                            [mshr] (const MSHR* _mshr) {
+                                return mshr->readyTime >= _mshr->readyTime;
+                            });
+    readyList.splice(it, readyList, mshr->readyIter);
+}
+
 void
 MSHRQueue::markInService(MSHR *mshr, bool pending_modified_resp)
 {
index 1b960a5a2036d03da96258a9fb3ee214df072a44..1e4eaeb514a2d7bd099adf1e6a67c10aea8a007c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2013, 2015-2016 ARM Limited
+ * Copyright (c) 2012-2013, 2015-2016, 2018 ARM Limited
  * All rights reserved.
  *
  * The license below extends only to copyright in the software and shall
@@ -106,6 +106,15 @@ class MSHRQueue : public Queue<MSHR>
      */
     void moveToFront(MSHR *mshr);
 
+    /**
+     * Adds a delay to the provided MSHR and moves MSHRs that will be
+     * ready earlier than this entry to the top of the list
+     *
+     * @param mshr that needs to be delayed
+     * @param delay_ticks ticks of the desired delay
+     */
+    void delay(MSHR *mshr, Tick delay_ticks);
+
     /**
      * Mark the given MSHR as in service. This removes the MSHR from the
      * readyList or deallocates the MSHR if it does not expect a response.