diff -r 65db40192591 -r ba65669135cb src/mem/cache/cache.hh --- a/src/mem/cache/cache.hh Wed Dec 09 22:56:31 2015 -0500 +++ b/src/mem/cache/cache.hh Wed Dec 09 11:14:42 2015 +0800 @@ -392,7 +392,8 @@ * @return The snoop delay incurred by the upwards snoop */ uint32_t handleSnoop(PacketPtr pkt, CacheBlk *blk, - bool is_timing, bool is_deferred, bool pending_inval); + bool is_timing, bool is_deferred, bool pending_inval, + MSHR* mshr = nullptr); /** * Create a writeback request for the given block. diff -r 65db40192591 -r ba65669135cb src/mem/cache/cache.cc --- a/src/mem/cache/cache.cc Wed Dec 09 22:56:31 2015 -0500 +++ b/src/mem/cache/cache.cc Wed Dec 09 11:14:42 2015 +0800 @@ -1439,7 +1439,8 @@ // response to snoop request DPRINTF(Cache, "processing deferred snoop...\n"); assert(!(is_invalidate && !mshr->hasPostInvalidate())); - handleSnoop(tgt_pkt, blk, true, true, mshr->hasPostInvalidate()); + handleSnoop(tgt_pkt, blk, true, true, mshr->hasPostInvalidate(), + mshr); break; default: @@ -1867,7 +1868,7 @@ uint32_t Cache::handleSnoop(PacketPtr pkt, CacheBlk *blk, bool is_timing, - bool is_deferred, bool pending_inval) + bool is_deferred, bool pending_inval, MSHR *mshr) { DPRINTF(Cache, "%s for %s addr %#llx size %d\n", __func__, pkt->cmdString(), pkt->getAddr(), pkt->getSize()); @@ -2015,7 +2016,12 @@ // need to delete the request and not rely on the packet // destructor assert(pkt->needsResponse()); - delete pkt->req; + + // check if pkt->req is created by mshr before deleting it. + if (mshr && mshr->createdRequests.count(pkt->req)) { + mshr->createdRequests.erase(pkt->req); + delete pkt->req; + } delete pkt; } diff -r 65db40192591 -r ba65669135cb src/mem/cache/mshr.hh --- a/src/mem/cache/mshr.hh Wed Dec 09 22:56:31 2015 -0500 +++ b/src/mem/cache/mshr.hh Wed Dec 09 11:14:42 2015 +0800 @@ -187,6 +187,9 @@ /** Thread number of the miss. */ ThreadID threadNum; + /** Created requests in this MSHR */ + std::set createdRequests; + private: /** Data buffer (if needed). Currently used only for pending diff -r 65db40192591 -r ba65669135cb src/mem/cache/mshr.cc --- a/src/mem/cache/mshr.cc Wed Dec 09 22:56:31 2015 -0500 +++ b/src/mem/cache/mshr.cc Wed Dec 09 11:14:42 2015 +0800 @@ -392,6 +392,10 @@ // => Create a copy of the request, as that may get deallocated as // well cp_pkt = new Packet(new Request(*pkt->req), pkt->cmd); + + // store the created request for verification when deleting it. + createdRequests.insert(pkt->req); + DPRINTF(Cache, "Copying packet %p -> %p and request %p -> %p\n", pkt, cp_pkt, pkt->req, cp_pkt->req); }