changeset afb40c3d4ba6 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=afb40c3d4ba6
description:
        Prefetcher: Fix some memory leaks with the prefetcher.

diffstat:

 src/mem/cache/cache_impl.hh      |   4 ++++
 src/mem/cache/prefetch/base.cc   |  24 ++++++++++++------------
 src/mem/cache/prefetch/stride.cc |   3 +++
 3 files changed, 19 insertions(+), 12 deletions(-)

diffs (68 lines):

diff -r eb52373b376b -r afb40c3d4ba6 src/mem/cache/cache_impl.hh
--- a/src/mem/cache/cache_impl.hh       Fri Aug 19 15:08:05 2011 -0500
+++ b/src/mem/cache/cache_impl.hh       Fri Aug 19 15:08:05 2011 -0500
@@ -1443,6 +1443,10 @@
                 mshr_misses[pkt->cmdToIndex()][0/*pkt->req->threadId()*/]++;
                 // Don't request bus, since we already have it
                 return allocateMissBuffer(pkt, curTick(), false);
+            } else {
+                // free the request and packet
+                delete pkt->req;
+                delete pkt;
             }
         }
     }
diff -r eb52373b376b -r afb40c3d4ba6 src/mem/cache/prefetch/base.cc
--- a/src/mem/cache/prefetch/base.cc    Fri Aug 19 15:08:05 2011 -0500
+++ b/src/mem/cache/prefetch/base.cc    Fri Aug 19 15:08:05 2011 -0500
@@ -139,25 +139,25 @@
     }
 
     PacketPtr pkt;
-    bool keep_trying = false;
-    do {
+    while (!pf.empty()) {
         pkt = *pf.begin();
         pf.pop_front();
 
-        if (keep_trying) {
-            DPRINTF(HWPrefetch, "addr 0x%x in cache, skipping\n",
-                    pkt->getAddr());
-            delete pkt->req;
-            delete pkt;
-        }
+        Addr blk_addr = pkt->getAddr() & ~(Addr)(blkSize-1);
+
+        if (!inCache(blk_addr) && !inMissQueue(blk_addr))
+            // we found a prefetch, return it
+            break;
+
+        DPRINTF(HWPrefetch, "addr 0x%x in cache, skipping\n", pkt->getAddr());
+        delete pkt->req;
+        delete pkt;
 
         if (pf.empty()) {
             cache->deassertMemSideBusRequest(BaseCache::Request_PF);
-            if (keep_trying) {
-                return NULL; // None left, all were in cache
-            }
+            return NULL; // None left, all were in cache
         }
-    } while (keep_trying);
+    }
 
     pfIssued++;
     assert(pkt != NULL);
diff -r eb52373b376b -r afb40c3d4ba6 src/mem/cache/prefetch/stride.cc
--- a/src/mem/cache/prefetch/stride.cc  Fri Aug 19 15:08:05 2011 -0500
+++ b/src/mem/cache/prefetch/stride.cc  Fri Aug 19 15:08:05 2011 -0500
@@ -118,6 +118,9 @@
                 }
             }
             DPRINTF(HWPrefetch, "  replacing PC %x\n", (*min_pos)->instAddr);
+
+            // free entry and delete it
+            delete *min_pos;
             tab.erase(min_pos);
         }
 
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to