diff -r 297a63e7b162 -r 470ea388b6a0 src/mem/bridge.cc --- a/src/mem/bridge.cc Mon Oct 26 18:12:03 2015 +0000 +++ b/src/mem/bridge.cc Mon Oct 26 18:13:03 2015 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2013 ARM Limited + * Copyright (c) 2011-2013, 2015 ARM Limited * All rights reserved * * The license below extends only to copyright in the software and shall @@ -150,6 +150,13 @@ DPRINTF(Bridge, "recvTimingReq: %s addr 0x%x\n", pkt->cmdString(), pkt->getAddr()); + // sink inhibited packets and clean evictions + if (pkt->memInhibitAsserted() || + pkt->cmd == MemCmd::CleanEvict) { + pendingDelete.reset(pkt); + return true; + } + // we should not see a timing request if we are already in a retry assert(!retryReq); diff -r 297a63e7b162 -r 470ea388b6a0 src/mem/dramsim2.cc --- a/src/mem/dramsim2.cc Mon Oct 26 18:12:03 2015 +0000 +++ b/src/mem/dramsim2.cc Mon Oct 26 18:13:03 2015 +0000 @@ -175,16 +175,16 @@ bool DRAMSim2::recvTimingReq(PacketPtr pkt) { - // we should never see a new request while in retry - assert(!retryReq); - - if (pkt->memInhibitAsserted()) { - // snooper will supply based on copy of packet - // still target's responsibility to delete packet + // sink inhibited packets and clean evictions + if (pkt->memInhibitAsserted() || + pkt->cmd == MemCmd::CleanEvict) { pendingDelete.reset(pkt); return true; } + // we should never see a new request while in retry + assert(!retryReq); + // if we cannot accept we need to send a retry once progress can // be made bool can_accept = nbrOutstanding() < wrapper.queueSize(); diff -r 297a63e7b162 -r 470ea388b6a0 src/mem/simple_mem.cc --- a/src/mem/simple_mem.cc Mon Oct 26 18:12:03 2015 +0000 +++ b/src/mem/simple_mem.cc Mon Oct 26 18:13:03 2015 +0000 @@ -97,9 +97,9 @@ bool SimpleMemory::recvTimingReq(PacketPtr pkt) { - if (pkt->memInhibitAsserted()) { - // snooper will supply based on copy of packet - // still target's responsibility to delete packet + // sink inhibited packets and clean evictions + if (pkt->memInhibitAsserted() || + pkt->cmd == MemCmd::CleanEvict) { pendingDelete.reset(pkt); return true; } diff -r 297a63e7b162 -r 470ea388b6a0 src/mem/bridge.hh --- a/src/mem/bridge.hh Mon Oct 26 18:12:03 2015 +0000 +++ b/src/mem/bridge.hh Mon Oct 26 18:13:03 2015 +0000 @@ -136,6 +136,12 @@ unsigned int respQueueLimit; /** + * Upstream caches need this packet until true is returned, so + * hold it for deletion until a subsequent call + */ + std::unique_ptr pendingDelete; + + /** * Is this side blocked from accepting new response packets. * * @return true if the reserved space has reached the set limit