changeset 0964165d1857 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=0964165d1857
description:
        mem: Unify delayed packet deletion

        This patch unifies how we deal with delayed packet deletion, where the
        receiving slave is responsible for deleting the packet, but the
        sending agent (e.g. a cache) is still relying on the pointer until the
        call to sendTimingReq completes. Previously we used a mix of a
        deletion vector and a construct using unique_ptr. With this patch we
        ensure all slaves use the latter approach.

diffstat:

 src/mem/cache/cache.cc   |  29 +++++++++--------------------
 src/mem/cache/cache.hh   |   7 +++----
 src/mem/coherent_xbar.cc |  11 ++++-------
 src/mem/coherent_xbar.hh |   7 +++----
 src/mem/dram_ctrl.cc     |  10 ++--------
 src/mem/dram_ctrl.hh     |   8 ++++----
 src/mem/dramsim2.cc      |  13 +++----------
 src/mem/dramsim2.hh      |   8 ++++----
 src/mem/simple_mem.cc    |  10 ++--------
 src/mem/simple_mem.hh    |   8 ++++----
 src/mem/tport.cc         |  12 ++----------
 src/mem/tport.hh         |   8 +++-----
 12 files changed, 43 insertions(+), 88 deletions(-)

diffs (truncated from 326 to 300 lines):

diff -r 4237221d3e31 -r 0964165d1857 src/mem/cache/cache.cc
--- a/src/mem/cache/cache.cc    Fri Nov 06 03:26:16 2015 -0500
+++ b/src/mem/cache/cache.cc    Fri Nov 06 03:26:21 2015 -0500
@@ -542,15 +542,6 @@
 Cache::recvTimingReq(PacketPtr pkt)
 {
     DPRINTF(CacheTags, "%s tags: %s\n", __func__, tags->print());
-//@todo Add back in MemDebug Calls
-//    MemDebug::cacheAccess(pkt);
-
-
-    /// @todo temporary hack to deal with memory corruption issue until
-    /// 4-phase transactions are complete
-    for (int x = 0; x < pendingDelete.size(); x++)
-        delete pendingDelete[x];
-    pendingDelete.clear();
 
     assert(pkt->isRequest());
 
@@ -602,10 +593,9 @@
             // main memory will delete the packet
         }
 
-        /// @todo nominally we should just delete the packet here,
-        /// however, until 4-phase stuff we can't because sending
-        /// cache is still relying on it.
-        pendingDelete.push_back(pkt);
+        // queue for deletion, as the sending cache is still relying
+        // on the packet
+        pendingDelete.reset(pkt);
 
         // no need to take any action in this particular cache as the
         // caches along the path to memory are allowed to keep lines
@@ -678,12 +668,11 @@
             // by access(), that calls accessBlock() function.
             cpuSidePort->schedTimingResp(pkt, request_time);
         } else {
-            /// @todo nominally we should just delete the packet here,
-            /// however, until 4-phase stuff we can't because sending cache is
-            /// still relying on it. If the block is found in access(),
-            /// CleanEvict and Writeback messages will be deleted here as
-            /// well.
-            pendingDelete.push_back(pkt);
+            // queue the packet for deletion, as the sending cache is
+            // still relying on it; if the block is found in access(),
+            // CleanEvict and Writeback messages will be deleted
+            // here as well
+            pendingDelete.reset(pkt);
         }
     } else {
         // miss
@@ -754,7 +743,7 @@
                 // CleanEvicts corresponding to blocks which have outstanding
                 // requests in MSHRs can be deleted here.
                 if (pkt->cmd == MemCmd::CleanEvict) {
-                    pendingDelete.push_back(pkt);
+                    pendingDelete.reset(pkt);
                 } else {
                     DPRINTF(Cache, "%s coalescing MSHR for %s addr %#llx size 
%d\n",
                             __func__, pkt->cmdString(), pkt->getAddr(),
diff -r 4237221d3e31 -r 0964165d1857 src/mem/cache/cache.hh
--- a/src/mem/cache/cache.hh    Fri Nov 06 03:26:16 2015 -0500
+++ b/src/mem/cache/cache.hh    Fri Nov 06 03:26:21 2015 -0500
@@ -195,11 +195,10 @@
     const bool prefetchOnAccess;
 
     /**
-     * @todo this is a temporary workaround until the 4-phase code is 
committed.
-     * upstream caches need this packet until true is returned, so hold it for
-     * deletion until a subsequent call
+     * Upstream caches need this packet until true is returned, so
+     * hold it for deletion until a subsequent call
      */
-    std::vector<PacketPtr> pendingDelete;
+    std::unique_ptr<Packet> pendingDelete;
 
     /**
      * Does all the processing necessary to perform the provided request.
diff -r 4237221d3e31 -r 0964165d1857 src/mem/coherent_xbar.cc
--- a/src/mem/coherent_xbar.cc  Fri Nov 06 03:26:16 2015 -0500
+++ b/src/mem/coherent_xbar.cc  Fri Nov 06 03:26:21 2015 -0500
@@ -140,12 +140,6 @@
 bool
 CoherentXBar::recvTimingReq(PacketPtr pkt, PortID slave_port_id)
 {
-    // @todo temporary hack to deal with memory corruption issue until
-    // 4-phase transactions are complete
-    for (int x = 0; x < pendingDelete.size(); x++)
-        delete pendingDelete[x];
-    pendingDelete.clear();
-
     // determine the source port based on the id
     SlavePort *src_port = slavePorts[slave_port_id];
 
@@ -223,7 +217,10 @@
 
         // update the layer state and schedule an idle event
         reqLayers[master_port_id]->succeededTiming(packetFinishTime);
-        pendingDelete.push_back(pkt);
+
+        // queue the packet for deletion
+        pendingDelete.reset(pkt);
+
         return true;
     }
 
diff -r 4237221d3e31 -r 0964165d1857 src/mem/coherent_xbar.hh
--- a/src/mem/coherent_xbar.hh  Fri Nov 06 03:26:16 2015 -0500
+++ b/src/mem/coherent_xbar.hh  Fri Nov 06 03:26:21 2015 -0500
@@ -274,11 +274,10 @@
     const Cycles snoopResponseLatency;
 
     /**
-     * @todo this is a temporary workaround until the 4-phase code is 
committed.
-     * upstream caches need this packet until true is returned, so hold it for
-     * deletion until a subsequent call
+     * Upstream caches need this packet until true is returned, so
+     * hold it for deletion until a subsequent call
      */
-    std::vector<PacketPtr> pendingDelete;
+    std::unique_ptr<Packet> pendingDelete;
 
     /** Function called by the port when the crossbar is recieving a Timing
       request packet.*/
diff -r 4237221d3e31 -r 0964165d1857 src/mem/dram_ctrl.cc
--- a/src/mem/dram_ctrl.cc      Fri Nov 06 03:26:16 2015 -0500
+++ b/src/mem/dram_ctrl.cc      Fri Nov 06 03:26:21 2015 -0500
@@ -586,12 +586,6 @@
 bool
 DRAMCtrl::recvTimingReq(PacketPtr pkt)
 {
-    /// @todo temporary hack to deal with memory corruption issues until
-    /// 4-phase transactions are complete
-    for (int x = 0; x < pendingDelete.size(); x++)
-        delete pendingDelete[x];
-    pendingDelete.clear();
-
     // This is where we enter from the outside world
     DPRINTF(DRAM, "recvTimingReq: request %s addr %lld size %d\n",
             pkt->cmdString(), pkt->getAddr(), pkt->getSize());
@@ -600,7 +594,7 @@
     if (pkt->memInhibitAsserted() ||
         pkt->cmd == MemCmd::CleanEvict) {
         DPRINTF(DRAM, "Inhibited packet or clean evict -- Dropping it now\n");
-        pendingDelete.push_back(pkt);
+        pendingDelete.reset(pkt);
         return true;
     }
 
@@ -872,7 +866,7 @@
     } else {
         // @todo the packet is going to be deleted, and the DRAMPacket
         // is still having a pointer to it
-        pendingDelete.push_back(pkt);
+        pendingDelete.reset(pkt);
     }
 
     DPRINTF(DRAM, "Done\n");
diff -r 4237221d3e31 -r 0964165d1857 src/mem/dram_ctrl.hh
--- a/src/mem/dram_ctrl.hh      Fri Nov 06 03:26:16 2015 -0500
+++ b/src/mem/dram_ctrl.hh      Fri Nov 06 03:26:21 2015 -0500
@@ -836,11 +836,11 @@
     // timestamp offset
     uint64_t timeStampOffset;
 
-    /** @todo this is a temporary workaround until the 4-phase code is
-     * committed. upstream caches needs this packet until true is returned, so
-     * hold onto it for deletion until a subsequent call
+    /**
+     * Upstream caches need this packet until true is returned, so
+     * hold it for deletion until a subsequent call
      */
-    std::vector<PacketPtr> pendingDelete;
+    std::unique_ptr<Packet> pendingDelete;
 
     /**
      * This function increments the energy when called. If stats are
diff -r 4237221d3e31 -r 0964165d1857 src/mem/dramsim2.cc
--- a/src/mem/dramsim2.cc       Fri Nov 06 03:26:16 2015 -0500
+++ b/src/mem/dramsim2.cc       Fri Nov 06 03:26:21 2015 -0500
@@ -178,16 +178,10 @@
     // we should never see a new request while in retry
     assert(!retryReq);
 
-    // @todo temporary hack to deal with memory corruption issues until
-    // 4-phase transactions are complete
-    for (int x = 0; x < pendingDelete.size(); x++)
-        delete pendingDelete[x];
-    pendingDelete.clear();
-
     if (pkt->memInhibitAsserted()) {
         // snooper will supply based on copy of packet
         // still target's responsibility to delete packet
-        pendingDelete.push_back(pkt);
+        pendingDelete.reset(pkt);
         return true;
     }
 
@@ -281,9 +275,8 @@
         if (!retryResp && !sendResponseEvent.scheduled())
             schedule(sendResponseEvent, time);
     } else {
-        // @todo the packet is going to be deleted, and the DRAMPacket
-        // is still having a pointer to it
-        pendingDelete.push_back(pkt);
+        // queue the packet for deletion
+        pendingDelete.reset(pkt);
     }
 }
 
diff -r 4237221d3e31 -r 0964165d1857 src/mem/dramsim2.hh
--- a/src/mem/dramsim2.hh       Fri Nov 06 03:26:16 2015 -0500
+++ b/src/mem/dramsim2.hh       Fri Nov 06 03:26:21 2015 -0500
@@ -160,11 +160,11 @@
      */
     EventWrapper<DRAMSim2, &DRAMSim2::tick> tickEvent;
 
-    /** @todo this is a temporary workaround until the 4-phase code is
-     * committed. upstream caches needs this packet until true is returned, so
-     * hold onto it for deletion until a subsequent call
+    /**
+     * Upstream caches need this packet until true is returned, so
+     * hold it for deletion until a subsequent call
      */
-    std::vector<PacketPtr> pendingDelete;
+    std::unique_ptr<Packet> pendingDelete;
 
   public:
 
diff -r 4237221d3e31 -r 0964165d1857 src/mem/simple_mem.cc
--- a/src/mem/simple_mem.cc     Fri Nov 06 03:26:16 2015 -0500
+++ b/src/mem/simple_mem.cc     Fri Nov 06 03:26:21 2015 -0500
@@ -97,16 +97,10 @@
 bool
 SimpleMemory::recvTimingReq(PacketPtr pkt)
 {
-    /// @todo temporary hack to deal with memory corruption issues until
-    /// 4-phase transactions are complete
-    for (int x = 0; x < pendingDelete.size(); x++)
-        delete pendingDelete[x];
-    pendingDelete.clear();
-
     if (pkt->memInhibitAsserted()) {
         // snooper will supply based on copy of packet
         // still target's responsibility to delete packet
-        pendingDelete.push_back(pkt);
+        pendingDelete.reset(pkt);
         return true;
     }
 
@@ -165,7 +159,7 @@
         if (!retryResp && !dequeueEvent.scheduled())
             schedule(dequeueEvent, packetQueue.back().tick);
     } else {
-        pendingDelete.push_back(pkt);
+        pendingDelete.reset(pkt);
     }
 
     return true;
diff -r 4237221d3e31 -r 0964165d1857 src/mem/simple_mem.hh
--- a/src/mem/simple_mem.hh     Fri Nov 06 03:26:16 2015 -0500
+++ b/src/mem/simple_mem.hh     Fri Nov 06 03:26:21 2015 -0500
@@ -175,11 +175,11 @@
      */
     Tick getLatency() const;
 
-    /** @todo this is a temporary workaround until the 4-phase code is
-     * committed. upstream caches needs this packet until true is returned, so
-     * hold onto it for deletion until a subsequent call
+    /**
+     * Upstream caches need this packet until true is returned, so
+     * hold it for deletion until a subsequent call
      */
-    std::vector<PacketPtr> pendingDelete;
+    std::unique_ptr<Packet> pendingDelete;
 
   public:
 
diff -r 4237221d3e31 -r 0964165d1857 src/mem/tport.cc
--- a/src/mem/tport.cc  Fri Nov 06 03:26:16 2015 -0500
+++ b/src/mem/tport.cc  Fri Nov 06 03:26:21 2015 -0500
@@ -62,12 +62,6 @@
 bool
 SimpleTimingPort::recvTimingReq(PacketPtr pkt)
 {
-    /// @todo temporary hack to deal with memory corruption issue until
-    /// 4-phase transactions are complete. Remove me later
-    for (int x = 0; x < pendingDelete.size(); x++)
-        delete pendingDelete[x];
-    pendingDelete.clear();
-
     // the SimpleTimingPort should not be used anywhere where there is
     // a need to deal with inhibited packets
     if (pkt->memInhibitAsserted())
@@ -82,10 +76,8 @@
         assert(pkt->isResponse());
         schedTimingResp(pkt, curTick() + latency);
     } else {
-        /// @todo nominally we should just delete the packet here.
-        /// Until 4-phase stuff we can't because the sending
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to