From 382263c6706296fee2548f74fd4b811553106dba Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 22 Apr 2019 11:32:22 +0200 Subject: [PATCH] mem-cache: Fix fix of replacement count Commit 7976b561de61b7523ca9a860154ad7ba701d12a7 tried fixing replacement update when a single location can be associated to multiple blocks. Although the comment of the correct action was added, the proper validation check was forgotten. This change adds that check and moves doing the eviction to when there is a valid block. Change-Id: I31d8bb914ccfd1849e9d97464d70a58a62f59533 Signed-off-by: Daniel Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/18210 Reviewed-by: Jason Lowe-Power Maintainer: Jason Lowe-Power Tested-by: kokoro --- src/mem/cache/base.cc | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/mem/cache/base.cc b/src/mem/cache/base.cc index 849cff598..554a61eb0 100644 --- a/src/mem/cache/base.cc +++ b/src/mem/cache/base.cc @@ -1307,8 +1307,11 @@ BaseCache::allocateBlock(const PacketPtr pkt, PacketList &writebacks) // Check for transient state allocations. If any of the entries listed // for eviction has a transient state, the allocation fails + bool replacement = false; for (const auto& blk : evict_blks) { if (blk->isValid()) { + replacement = true; + Addr repl_addr = regenerateBlkAddr(blk); MSHR *repl_mshr = mshrQueue.findMatch(repl_addr, blk->isSecure()); if (repl_mshr) { @@ -1326,27 +1329,23 @@ BaseCache::allocateBlock(const PacketPtr pkt, PacketList &writebacks) // The victim will be replaced by a new entry, so increase the replacement // counter if a valid block is being replaced - if (evict_blks.size() > 0) { + if (replacement) { + // Evict valid blocks associated to this victim block for (const auto& blk : evict_blks) { if (blk->isValid()) { DPRINTF(CacheRepl, "Evicting %s (%#llx) to make room for " \ "%#llx (%s)\n", blk->print(), regenerateBlkAddr(blk), addr, is_secure); - } - } - replacements++; - } + if (blk->wasPrefetched()) { + unusedPrefetches++; + } - // Evict valid blocks associated to this victim block - for (const auto& blk : evict_blks) { - if (blk->isValid()) { - if (blk->wasPrefetched()) { - unusedPrefetches++; + evictBlock(blk, writebacks); } - - evictBlock(blk, writebacks); } + + replacements++; } // Insert new block at victimized entry -- 2.30.2