Daniel Carvalho has uploaded this change for review. ( https://gem5-review.googlesource.com/10812

Change subject: mem-cache: Insert on block allocation
......................................................................

mem-cache: Insert on block allocation

When a block is being replaced in an allocation, if successfull,
the block will be inserted. Therefore we move the insertion
functionality to allocateBlock().

allocateBlock's signature has been modified to allow this
modification.

Change-Id: I60d17a83ff4f3021fdc976378868ccde6c7507bc
---
M src/mem/cache/base.cc
M src/mem/cache/base.hh
2 files changed, 17 insertions(+), 13 deletions(-)



diff --git a/src/mem/cache/base.cc b/src/mem/cache/base.cc
index a8f29e3..f5431f2 100644
--- a/src/mem/cache/base.cc
+++ b/src/mem/cache/base.cc
@@ -971,13 +971,12 @@

         if (!blk) {
             // need to do a replacement
- blk = allocateBlock(pkt->getAddr(), pkt->isSecure(), writebacks);
+            blk = allocateBlock(pkt, writebacks);
             if (!blk) {
// no replaceable block available: give up, fwd to next level.
                 incMissCount(pkt);
                 return false;
             }
-            tags->insertBlock(pkt, blk);

             blk->status |= (BlkValid | BlkReadable);
         }
@@ -1029,15 +1028,13 @@
                 return false;
             } else {
                 // a writeback that misses needs to allocate a new block
-                blk = allocateBlock(pkt->getAddr(), pkt->isSecure(),
-                                    writebacks);
+                blk = allocateBlock(pkt, writebacks);
                 if (!blk) {
                     // no replaceable block available: give up, fwd to
                     // next level.
                     incMissCount(pkt);
                     return false;
                 }
-                tags->insertBlock(pkt, blk);

                 blk->status |= (BlkValid | BlkReadable);
             }
@@ -1125,7 +1122,7 @@

         // need to do a replacement if allocating, otherwise we stick
         // with the temporary storage
- blk = allocate ? allocateBlock(addr, is_secure, writebacks) : nullptr;
+        blk = allocate ? allocateBlock(pkt, writebacks) : nullptr;

         if (!blk) {
             // No replaceable block or a mostly exclusive
@@ -1136,8 +1133,6 @@
             tempBlock->insert(addr, is_secure);
             DPRINTF(Cache, "using temp block for %#llx (%s)\n", addr,
                     is_secure ? "s" : "ns");
-        } else {
-            tags->insertBlock(pkt, blk);
         }

         // we should never be overwriting a valid block
@@ -1206,8 +1201,14 @@
 }

 CacheBlk*
-BaseCache::allocateBlock(Addr addr, bool is_secure, PacketList &writebacks)
+BaseCache::allocateBlock(const PacketPtr pkt, PacketList &writebacks)
 {
+    // Get address
+    const Addr addr = pkt->getAddr();
+
+    // Get secure bit
+    const bool is_secure = pkt->isSecure();
+
     // Find replacement victim
     std::vector<CacheBlk*> evict_blks;
     CacheBlk *victim = tags->findVictim(addr, is_secure, evict_blks);
@@ -1258,6 +1259,9 @@
         }
     }

+    // Insert new block at victimized entry
+    tags->insertBlock(pkt, victim);
+
     return victim;
 }

diff --git a/src/mem/cache/base.hh b/src/mem/cache/base.hh
index 6600aeb..4ba256b 100644
--- a/src/mem/cache/base.hh
+++ b/src/mem/cache/base.hh
@@ -659,14 +659,14 @@
      *
      * Find a victim block and if necessary prepare writebacks for any
      * existing data. May return nullptr if there are no replaceable
-     * blocks.
+     * blocks. If a replaceable block is found, it inserts the new block in
+     * its place. The new block, however, is not set as valid yet.
      *
-     * @param addr Physical address of the new block
-     * @param is_secure Set if the block should be secure
+     * @param pkt Packet holding the address to update
      * @param writebacks A list of writeback packets for the evicted blocks
      * @return the allocated block
      */
- CacheBlk *allocateBlock(Addr addr, bool is_secure, PacketList &writebacks);
+    CacheBlk *allocateBlock(const PacketPtr pkt, PacketList &writebacks);
     /**
      * Evict a cache block.
      *

--
To view, visit https://gem5-review.googlesource.com/10812
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-Change-Id: I60d17a83ff4f3021fdc976378868ccde6c7507bc
Gerrit-Change-Number: 10812
Gerrit-PatchSet: 1
Gerrit-Owner: Daniel Carvalho <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to