mem-cache: Fix FALRU hash invalidation
authorDaniel R. Carvalho <odanrc@yahoo.com.br>
Thu, 4 Oct 2018 08:53:12 +0000 (10:53 +0200)
committerDaniel Carvalho <odanrc@yahoo.com.br>
Fri, 5 Oct 2018 18:42:49 +0000 (18:42 +0000)
The block was being invalidated before the hash could erase
its entry, therefore it was using invalid values (tag was
being assigned MaxAddr and the secure bit was reset).

This change reorders the calls, so that the appropriate hash
entry is erased.

Change-Id: I161463df0f8f5220179bc68d7be12051e5390d01
Signed-off-by: Daniel R. Carvalho <odanrc@yahoo.com.br>
Reviewed-on: https://gem5-review.googlesource.com/c/13210
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Maintainer: Nikos Nikoleris <nikos.nikoleris@arm.com>

src/mem/cache/tags/fa_lru.cc

index 604bd7d07fa0b5679421fbf6ef7cd53762fdcd4f..51f360eb47883c3d77bc858e653a7e0bde0e5ed7 100644 (file)
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2018 Inria
  * Copyright (c) 2013,2016-2018 ARM Limited
  * All rights reserved.
  *
@@ -39,6 +40,7 @@
  *
  * Authors: Erik Hallnor
  *          Nikos Nikoleris
+ *          Daniel Carvalho
  */
 
 /**
@@ -110,6 +112,13 @@ FALRU::regStats()
 void
 FALRU::invalidate(CacheBlk *blk)
 {
+    // Erase block entry reference in the hash table
+    auto num_erased = tagHash.erase(std::make_pair(blk->tag, blk->isSecure()));
+
+    // Sanity check; only one block reference should be erased
+    assert(num_erased == 1);
+
+    // Invalidate block entry. Must be done after the hash is erased
     BaseTags::invalidate(blk);
 
     // Decrease the number of tags in use
@@ -117,9 +126,6 @@ FALRU::invalidate(CacheBlk *blk)
 
     // Move the block to the tail to make it the next victim
     moveToTail((FALRUBlk*)blk);
-
-    // Erase block entry in the hash table
-    tagHash.erase(std::make_pair(blk->tag, blk->isSecure()));
 }
 
 CacheBlk*