Handle packets being deleted by lower level properly.
Fixes for Mem Leak associated with Writebacks. src/mem/cache/miss/mshr_queue.cc: Fixes for Mem Leak associated with Writebacks. (Double Delete removed) --HG-- extra : convert_revision : 7a52ddd57da35995896f2c4438a58aa53f762416
This commit is contained in:
parent
29cefcbf13
commit
a200bccc20
2 changed files with 17 additions and 13 deletions
25
src/mem/cache/cache_impl.hh
vendored
25
src/mem/cache/cache_impl.hh
vendored
|
@ -53,6 +53,8 @@
|
||||||
|
|
||||||
#include "sim/sim_exit.hh" // for SimExitEvent
|
#include "sim/sim_exit.hh" // for SimExitEvent
|
||||||
|
|
||||||
|
bool SIGNAL_NACK_HACK;
|
||||||
|
|
||||||
template<class TagStore, class Buffering, class Coherence>
|
template<class TagStore, class Buffering, class Coherence>
|
||||||
bool
|
bool
|
||||||
Cache<TagStore,Buffering,Coherence>::
|
Cache<TagStore,Buffering,Coherence>::
|
||||||
|
@ -242,6 +244,11 @@ Cache<TagStore,Buffering,Coherence>::access(PacketPtr &pkt)
|
||||||
missQueue->handleMiss(pkt, size, curTick + hitLatency);
|
missQueue->handleMiss(pkt, size, curTick + hitLatency);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pkt->cmd == Packet::Writeback) {
|
||||||
|
//Need to clean up the packet on a writeback miss, but leave the request
|
||||||
|
delete pkt;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -265,6 +272,7 @@ Cache<TagStore,Buffering,Coherence>::getPacket()
|
||||||
|
|
||||||
assert(!doMasterRequest() || missQueue->havePending());
|
assert(!doMasterRequest() || missQueue->havePending());
|
||||||
assert(!pkt || pkt->time <= curTick);
|
assert(!pkt || pkt->time <= curTick);
|
||||||
|
SIGNAL_NACK_HACK = false;
|
||||||
return pkt;
|
return pkt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -273,16 +281,15 @@ void
|
||||||
Cache<TagStore,Buffering,Coherence>::sendResult(PacketPtr &pkt, MSHR* mshr,
|
Cache<TagStore,Buffering,Coherence>::sendResult(PacketPtr &pkt, MSHR* mshr,
|
||||||
bool success)
|
bool success)
|
||||||
{
|
{
|
||||||
if (success && !(pkt && (pkt->flags & NACKED_LINE))) {
|
if (success && !(SIGNAL_NACK_HACK)) {
|
||||||
if (!mshr->pkt->needsResponse()
|
//Remember if it was an upgrade because writeback MSHR's are removed
|
||||||
&& !(mshr->pkt->cmd == Packet::UpgradeReq)
|
//in Mark in Service
|
||||||
&& (pkt && (pkt->flags & SATISFIED))) {
|
bool upgrade = (mshr->pkt && mshr->pkt->cmd == Packet::UpgradeReq);
|
||||||
//Writeback, clean up the non copy version of the packet
|
|
||||||
delete pkt;
|
|
||||||
}
|
|
||||||
missQueue->markInService(mshr->pkt, mshr);
|
missQueue->markInService(mshr->pkt, mshr);
|
||||||
|
|
||||||
//Temp Hack for UPGRADES
|
//Temp Hack for UPGRADES
|
||||||
if (mshr->pkt && mshr->pkt->cmd == Packet::UpgradeReq) {
|
if (upgrade) {
|
||||||
assert(pkt); //Upgrades need to be fixed
|
assert(pkt); //Upgrades need to be fixed
|
||||||
pkt->flags &= ~CACHE_LINE_FILL;
|
pkt->flags &= ~CACHE_LINE_FILL;
|
||||||
BlkType *blk = tags->findBlock(pkt);
|
BlkType *blk = tags->findBlock(pkt);
|
||||||
|
@ -300,6 +307,7 @@ Cache<TagStore,Buffering,Coherence>::sendResult(PacketPtr &pkt, MSHR* mshr,
|
||||||
}
|
}
|
||||||
} else if (pkt && !pkt->req->isUncacheable()) {
|
} else if (pkt && !pkt->req->isUncacheable()) {
|
||||||
pkt->flags &= ~NACKED_LINE;
|
pkt->flags &= ~NACKED_LINE;
|
||||||
|
SIGNAL_NACK_HACK = false;
|
||||||
pkt->flags &= ~SATISFIED;
|
pkt->flags &= ~SATISFIED;
|
||||||
pkt->flags &= ~SNOOP_COMMIT;
|
pkt->flags &= ~SNOOP_COMMIT;
|
||||||
|
|
||||||
|
@ -404,6 +412,7 @@ Cache<TagStore,Buffering,Coherence>::snoop(PacketPtr &pkt)
|
||||||
assert(!(pkt->flags & SATISFIED));
|
assert(!(pkt->flags & SATISFIED));
|
||||||
pkt->flags |= SATISFIED;
|
pkt->flags |= SATISFIED;
|
||||||
pkt->flags |= NACKED_LINE;
|
pkt->flags |= NACKED_LINE;
|
||||||
|
SIGNAL_NACK_HACK = true;
|
||||||
///@todo NACK's from other levels
|
///@todo NACK's from other levels
|
||||||
//warn("NACKs from devices not connected to the same bus "
|
//warn("NACKs from devices not connected to the same bus "
|
||||||
//"not implemented\n");
|
//"not implemented\n");
|
||||||
|
|
5
src/mem/cache/miss/mshr_queue.cc
vendored
5
src/mem/cache/miss/mshr_queue.cc
vendored
|
@ -198,11 +198,6 @@ MSHRQueue::markInService(MSHR* mshr)
|
||||||
//assert(mshr == pendingList.front());
|
//assert(mshr == pendingList.front());
|
||||||
if (!mshr->pkt->needsResponse() && !(mshr->pkt->cmd == Packet::UpgradeReq)) {
|
if (!mshr->pkt->needsResponse() && !(mshr->pkt->cmd == Packet::UpgradeReq)) {
|
||||||
assert(mshr->getNumTargets() == 0);
|
assert(mshr->getNumTargets() == 0);
|
||||||
if ((mshr->pkt->flags & SATISFIED) && (mshr->pkt->cmd == Packet::Writeback)) {
|
|
||||||
//Writeback hit, so delete it
|
|
||||||
//otherwise the consumer will delete it
|
|
||||||
delete mshr->pkt->req;
|
|
||||||
}
|
|
||||||
deallocate(mshr);
|
deallocate(mshr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue