changeset 97aa1ee1c2d9 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=97aa1ee1c2d9
description:
        mem: Fix bug relating to writebacks and prefetches

        Previously the code commented about an unhandled case where it might be
        possible for a writeback to arrive after a prefetch was generated but
        before it was sent to the memory system.  I hit that case.  Luckily
        the prefetchSquash() logic already in the code handles dropping prefetch
        request in certian circumstances.

diffstat:

 src/mem/cache/cache_impl.hh |  12 ++++--------
 1 files changed, 4 insertions(+), 8 deletions(-)

diffs (29 lines):

diff -r b9646f4546ad -r 97aa1ee1c2d9 src/mem/cache/cache_impl.hh
--- a/src/mem/cache/cache_impl.hh       Tue Dec 23 09:31:18 2014 -0500
+++ b/src/mem/cache/cache_impl.hh       Tue Dec 23 09:31:18 2014 -0500
@@ -1892,12 +1892,6 @@
         BlkType *blk = tags->findBlock(mshr->addr, mshr->isSecure);
 
         if (tgt_pkt->cmd == MemCmd::HardPFReq) {
-            // It might be possible for a writeback to arrive between
-            // the time the prefetch is placed in the MSHRs and when
-            // it's selected to send... if so, this assert will catch
-            // that, and then we'll have to figure out what to do.
-            assert(blk == NULL);
-
             // We need to check the caches above us to verify that
             // they don't have a copy of this block in the dirty state
             // at the moment. Without this check we could get a stale
@@ -1909,8 +1903,10 @@
             cpuSidePort->sendTimingSnoopReq(&snoop_pkt);
 
             // Check to see if the prefetch was squashed by an upper cache
-            if (snoop_pkt.prefetchSquashed()) {
-                DPRINTF(Cache, "Prefetch squashed by upper cache.  "
+            // Or if a writeback arrived between the time the prefetch was
+            // placed in the MSHRs and when it was selected to send.
+            if (snoop_pkt.prefetchSquashed() || blk != NULL) {
+                DPRINTF(Cache, "Prefetch squashed by cache.  "
                                "Deallocating mshr target %#x.\n", mshr->addr);
 
                 // Deallocate the mshr target
_______________________________________________
gem5-dev mailing list
gem5-dev@gem5.org
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to