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