mem-cache: set the second chance to false when inserting a block
authorMingyuan <xiang_my@outlook.com>
Mon, 2 Sep 2019 22:48:03 +0000 (17:48 -0500)
committerMingyuan Xiang <mxiang6@wisc.edu>
Sun, 13 Oct 2019 16:41:33 +0000 (16:41 +0000)
Modify second chance replacement policy so that entries are inserted
without a second chance. Previously, the second chance bit was set
to true when a cache line was inserted. So the cache line would gain
its second chance when inserting. This is wrong because the cache
block will only get a second chance when it hits.

Here's a quoted citation for the second chance replacement policy:
"Whenever the algorithm examines a  page entry, it extracts the associated
usage bit and enters it into the high-order position of a k-bit shift
register after shifting the contents of the register one bit-position
lower. Then if the shift register is nonzero, the page is retained; if the
shift register is zero, the page is replaced by the new page. In either
case the usage bit for the page is turned off and the circular list
pointer is advanced."
(A Paging Experiment with the Multics System, FJ Corbato, 1968)

Change-Id: I0d07e56aa16c67dd36e0d490c3f457f91e46f320
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/20882
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Daniel Carvalho <odanrc@yahoo.com.br>
Maintainer: Jason Lowe-Power <jason@lowepower.com>

src/mem/cache/replacement_policies/second_chance_rp.cc

index 64e667fe656ab84d3aa9593b6a2dc2496638417f..dda6f50cda7d5be5b59698d7bf321b12e5500746 100644 (file)
@@ -62,7 +62,8 @@ SecondChanceRP::invalidate(
 }
 
 void
-SecondChanceRP::touch(const std::shared_ptr<ReplacementData>& replacement_data) const
+SecondChanceRP::touch(const std::shared_ptr<ReplacementData>&
+                                                    replacement_data) const
 {
     FIFORP::touch(replacement_data);
 
@@ -72,13 +73,14 @@ SecondChanceRP::touch(const std::shared_ptr<ReplacementData>& replacement_data)
 }
 
 void
-SecondChanceRP::reset(const std::shared_ptr<ReplacementData>& replacement_data) const
+SecondChanceRP::reset(const std::shared_ptr<ReplacementData>&
+                                                    replacement_data) const
 {
     FIFORP::reset(replacement_data);
 
     // Entries are inserted with a second chance
     std::static_pointer_cast<SecondChanceReplData>(
-        replacement_data)->hasSecondChance = true;
+        replacement_data)->hasSecondChance = false;
 }
 
 ReplaceableEntry*