memory system: fix functional access bug.
Make sure not to keep processing functional accesses after they've been responded to. Also use checkFunctional() return value instead of checking packet command field where possible, mostly just for consistency. --HG-- extra : convert_revision : 29fc76bc18731bd93a4ed05a281297827028ef75
This commit is contained in:
parent
08474ccf68
commit
2f93db6f95
5 changed files with 20 additions and 19 deletions
4
src/mem/cache/base_cache.cc
vendored
4
src/mem/cache/base_cache.cc
vendored
|
@ -81,9 +81,9 @@ BaseCache::CachePort::deviceBlockSize()
|
|||
void
|
||||
BaseCache::CachePort::checkAndSendFunctional(PacketPtr pkt)
|
||||
{
|
||||
checkFunctional(pkt);
|
||||
if (!pkt->isResponse())
|
||||
if (!checkFunctional(pkt)) {
|
||||
sendFunctional(pkt);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
8
src/mem/cache/cache_impl.hh
vendored
8
src/mem/cache/cache_impl.hh
vendored
|
@ -1253,9 +1253,9 @@ template<class TagStore>
|
|||
void
|
||||
Cache<TagStore>::CpuSidePort::recvFunctional(PacketPtr pkt)
|
||||
{
|
||||
checkFunctional(pkt);
|
||||
if (!pkt->isResponse())
|
||||
if (!checkFunctional(pkt)) {
|
||||
myCache()->functionalAccess(pkt, cache->memSidePort);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -1327,9 +1327,9 @@ template<class TagStore>
|
|||
void
|
||||
Cache<TagStore>::MemSidePort::recvFunctional(PacketPtr pkt)
|
||||
{
|
||||
checkFunctional(pkt);
|
||||
if (!pkt->isResponse())
|
||||
if (!checkFunctional(pkt)) {
|
||||
myCache()->functionalAccess(pkt, cache->cpuSidePort);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -400,12 +400,12 @@ PhysicalMemory::MemoryPort::recvAtomic(PacketPtr pkt)
|
|||
void
|
||||
PhysicalMemory::MemoryPort::recvFunctional(PacketPtr pkt)
|
||||
{
|
||||
checkFunctional(pkt);
|
||||
|
||||
// Default implementation of SimpleTimingPort::recvFunctional()
|
||||
// calls recvAtomic() and throws away the latency; we can save a
|
||||
// little here by just not calculating the latency.
|
||||
memory->doFunctionalAccess(pkt);
|
||||
if (!checkFunctional(pkt)) {
|
||||
// Default implementation of SimpleTimingPort::recvFunctional()
|
||||
// calls recvAtomic() and throws away the latency; we can save a
|
||||
// little here by just not calculating the latency.
|
||||
memory->doFunctionalAccess(pkt);
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
|
||||
#include "mem/tport.hh"
|
||||
|
||||
void
|
||||
bool
|
||||
SimpleTimingPort::checkFunctional(PacketPtr pkt)
|
||||
{
|
||||
DeferredPacketIterator i = transmitList.begin();
|
||||
|
@ -41,19 +41,20 @@ SimpleTimingPort::checkFunctional(PacketPtr pkt)
|
|||
// If the target contains data, and it overlaps the
|
||||
// probed request, need to update data
|
||||
if (pkt->checkFunctional(target)) {
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
SimpleTimingPort::recvFunctional(PacketPtr pkt)
|
||||
{
|
||||
checkFunctional(pkt);
|
||||
|
||||
// Just do an atomic access and throw away the returned latency
|
||||
if (!pkt->isResponse())
|
||||
if (!checkFunctional(pkt)) {
|
||||
// Just do an atomic access and throw away the returned latency
|
||||
recvAtomic(pkt);
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
|
@ -99,7 +99,7 @@ class SimpleTimingPort : public Port
|
|||
|
||||
/** Check the list of buffered packets against the supplied
|
||||
* functional request. */
|
||||
void checkFunctional(PacketPtr funcPkt);
|
||||
bool checkFunctional(PacketPtr funcPkt);
|
||||
|
||||
/** Check whether we have a packet ready to go on the transmit list. */
|
||||
bool deferredPacketReady()
|
||||
|
|
Loading…
Reference in a new issue