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