From 6779bd3e5da2355242cd3ba4967cb164c2a0b837 Mon Sep 17 00:00:00 2001 From: Ali Saidi Date: Fri, 19 Aug 2011 15:08:05 -0500 Subject: Prefetcher: Fix some memory leaks with the prefetcher. --- src/mem/cache/prefetch/base.cc | 24 ++++++++++++------------ src/mem/cache/prefetch/stride.cc | 3 +++ 2 files changed, 15 insertions(+), 12 deletions(-) (limited to 'src/mem/cache/prefetch') diff --git a/src/mem/cache/prefetch/base.cc b/src/mem/cache/prefetch/base.cc index 12028ac52..52d117140 100644 --- a/src/mem/cache/prefetch/base.cc +++ b/src/mem/cache/prefetch/base.cc @@ -139,25 +139,25 @@ BasePrefetcher::getPacket() } 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 --git a/src/mem/cache/prefetch/stride.cc b/src/mem/cache/prefetch/stride.cc index f71fd977d..a5cc805ef 100644 --- a/src/mem/cache/prefetch/stride.cc +++ b/src/mem/cache/prefetch/stride.cc @@ -118,6 +118,9 @@ StridePrefetcher::calculatePrefetch(PacketPtr &pkt, std::list &addresses, } } DPRINTF(HWPrefetch, " replacing PC %x\n", (*min_pos)->instAddr); + + // free entry and delete it + delete *min_pos; tab.erase(min_pos); } -- cgit v1.2.3