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:
Ron Dreslinski 2006-11-12 09:06:15 -05:00
parent 29cefcbf13
commit a200bccc20
2 changed files with 17 additions and 13 deletions

View file

@ -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");

View file

@ -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;
} }