mem: Remove a redundant heap allocation for a snoop packet
authorAndreas Hansson <andreas.hansson@arm.com>
Thu, 27 Jun 2013 09:49:49 +0000 (05:49 -0400)
committerAndreas Hansson <andreas.hansson@arm.com>
Thu, 27 Jun 2013 09:49:49 +0000 (05:49 -0400)
This patch changes the updards snoop packet to avoid allocating and
later deleting it. As the code executes in 0 time and the lifetime of
the packet does not extend beyond the block there is no reason to heap
allocate it.

src/mem/cache/cache_impl.hh

index 3ebb4eb70d962f3a43901a50a2243da424df30d7..60b72b521b3286aefff3b38da17bd88858db831e 100644 (file)
@@ -1655,23 +1655,22 @@ Cache<TagStore>::getTimingPacket()
             // that, and then we'll have to figure out what to do.
             assert(blk == NULL);
 
-            // We need to check the caches above us to verify that they don't have
-            // a copy of this block in the dirty state at the moment. Without this
-            // check we could get a stale copy from memory  that might get used
-            // in place of the dirty one.
-            PacketPtr snoop_pkt = new Packet(tgt_pkt, true);
-            snoop_pkt->setExpressSnoop();
-            snoop_pkt->senderState = mshr;
-            cpuSidePort->sendTimingSnoopReq(snoop_pkt);
-
-            if (snoop_pkt->memInhibitAsserted()) {
-                markInService(mshr, snoop_pkt);
+            // We need to check the caches above us to verify that
+            // they don't have a copy of this block in the dirty state
+            // at the moment. Without this check we could get a stale
+            // copy from memory that might get used in place of the
+            // dirty one.
+            Packet snoop_pkt(tgt_pkt, true);
+            snoop_pkt.setExpressSnoop();
+            snoop_pkt.senderState = mshr;
+            cpuSidePort->sendTimingSnoopReq(&snoop_pkt);
+
+            if (snoop_pkt.memInhibitAsserted()) {
+                markInService(mshr, &snoop_pkt);
                 DPRINTF(Cache, "Upward snoop of prefetch for addr %#x hit\n",
                         tgt_pkt->getAddr());
-                delete snoop_pkt;
                 return NULL;
             }
-            delete snoop_pkt;
         }
 
         pkt = getBusPacket(tgt_pkt, blk, mshr->needsExclusive());