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
void
BaseCache::CachePort::checkAndSendFunctional(PacketPtr pkt)
{
- checkFunctional(pkt);
- if (!pkt->isResponse())
+ if (!checkFunctional(pkt)) {
sendFunctional(pkt);
+ }
}
void
Cache<TagStore>::CpuSidePort::recvFunctional(PacketPtr pkt)
{
- checkFunctional(pkt);
- if (!pkt->isResponse())
+ if (!checkFunctional(pkt)) {
myCache()->functionalAccess(pkt, cache->memSidePort);
+ }
}
void
Cache<TagStore>::MemSidePort::recvFunctional(PacketPtr pkt)
{
- checkFunctional(pkt);
- if (!pkt->isResponse())
+ if (!checkFunctional(pkt)) {
myCache()->functionalAccess(pkt, cache->cpuSidePort);
+ }
}
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
#include "mem/tport.hh"
-void
+bool
SimpleTimingPort::checkFunctional(PacketPtr pkt)
{
DeferredPacketIterator i = transmitList.begin();
// 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
/** 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()