Fixes to cache eliminating the assumption that the Packet is still valid after sending out a request.

Still need to rework upgrades into this system, but works for now.

src/mem/cache/base_cache.cc:
    Re order code to be more readable
src/mem/cache/base_cache.hh:
    Be sure to delete the copy on a bus block
src/mem/cache/cache_impl.hh:
    Be sure to remove the copy on a writeback success
src/mem/cache/miss/mshr_queue.cc:
    Demorgans to make it easier to understand
src/mem/tport.cc:
    Delete writebacks

--HG--
extra : convert_revision : 9519fb37b46ead781d340de29bb342a322a6a92e
This commit is contained in:
Ron Dreslinski 2006-10-17 16:47:22 -04:00
parent 6e8bfa4e63
commit 4fff6d4603
5 changed files with 43 additions and 10 deletions

View file

@ -179,16 +179,23 @@ BaseCache::CachePort::recvRetry()
return;
}
pkt = cache->getPacket();
MSHR* mshr = (MSHR*)pkt->senderState;
MSHR* mshr = (MSHR*) pkt->senderState;
//Copy the packet, it may be modified/destroyed elsewhere
Packet * copyPkt = new Packet(*pkt);
copyPkt->dataStatic<uint8_t>(pkt->getPtr<uint8_t>());
mshr->pkt = copyPkt;
bool success = sendTiming(pkt);
DPRINTF(Cache, "Address %x was %s in sending the timing request\n",
pkt->getAddr(), success ? "succesful" : "unsuccesful");
cache->sendResult(pkt, mshr, success);
waitingOnRetry = !success;
if (waitingOnRetry) {
DPRINTF(CachePort, "%s now waiting on a retry\n", name());
}
cache->sendResult(pkt, mshr, success);
if (success && cache->doMasterRequest())
{
DPRINTF(CachePort, "%s has more requests\n", name());
@ -301,10 +308,13 @@ BaseCache::CacheEvent::process()
bool success = cachePort->sendTiming(pkt);
DPRINTF(Cache, "Address %x was %s in sending the timing request\n",
pkt->getAddr(), success ? "succesful" : "unsuccesful");
cachePort->cache->sendResult(pkt, mshr, success);
cachePort->waitingOnRetry = !success;
if (cachePort->waitingOnRetry)
if (cachePort->waitingOnRetry) {
DPRINTF(CachePort, "%s now waiting on a retry\n", cachePort->name());
}
cachePort->cache->sendResult(pkt, mshr, success);
if (success && cachePort->cache->doMasterRequest())
{
DPRINTF(CachePort, "%s still more MSHR requests to send\n",

View file

@ -525,8 +525,11 @@ class BaseCache : public MemObject
reqCpu->schedule(time);
}
else {
if (pkt->cmd == Packet::Writeback) delete pkt->req;
delete pkt;
if (pkt->cmd != Packet::UpgradeReq)
{
delete pkt->req;
delete pkt;
}
}
}
@ -545,8 +548,11 @@ class BaseCache : public MemObject
reqCpu->schedule(time);
}
else {
if (pkt->cmd == Packet::Writeback) delete pkt->req;
delete pkt;
if (pkt->cmd != Packet::UpgradeReq)
{
delete pkt->req;
delete pkt;
}
}
}

View file

@ -273,9 +273,14 @@ void
Cache<TagStore,Buffering,Coherence>::sendResult(PacketPtr &pkt, MSHR* mshr, bool success)
{
if (success && !(pkt && (pkt->flags & NACKED_LINE))) {
if (!mshr->pkt->needsResponse() && !(mshr->pkt->cmd == Packet::UpgradeReq)
&& (pkt && (pkt->flags & SATISFIED))) {
//Writeback, clean up the non copy version of the packet
delete pkt;
}
missQueue->markInService(mshr->pkt, mshr);
//Temp Hack for UPGRADES
if (mshr->pkt->cmd == Packet::UpgradeReq) {
if (mshr->pkt && mshr->pkt->cmd == Packet::UpgradeReq) {
assert(pkt); //Upgrades need to be fixed
pkt->flags &= ~CACHE_LINE_FILL;
BlkType *blk = tags->findBlock(pkt);
@ -295,6 +300,11 @@ Cache<TagStore,Buffering,Coherence>::sendResult(PacketPtr &pkt, MSHR* mshr, bool
pkt->flags &= ~NACKED_LINE;
pkt->flags &= ~SATISFIED;
pkt->flags &= ~SNOOP_COMMIT;
//Rmove copy from mshr
delete mshr->pkt;
mshr->pkt = pkt;
missQueue->restoreOrigCmd(pkt);
}
}

View file

@ -213,7 +213,7 @@ void
MSHRQueue::markInService(MSHR* mshr)
{
//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);
if ((mshr->pkt->flags & SATISFIED) && (mshr->pkt->cmd == Packet::Writeback)) {
//Writeback hit, so delete it

View file

@ -66,6 +66,13 @@ SimpleTimingPort::recvTiming(Packet *pkt)
pkt->makeTimingResponse();
sendTimingLater(pkt, latency);
}
else {
if (pkt->cmd != Packet::UpgradeReq)
{
delete pkt->req;
delete pkt;
}
}
return true;
}