Fix bugs around uni-coherence invalidates being propogated properly.
src/mem/bus.cc: Make it so that invalidates being sent from the responder up don't call the responder but they should also not Panic. src/mem/packet.hh: If we don't have data in the packet, don't call deleteData: Example: InvalidateRequests never have data. --HG-- extra : convert_revision : 18766bc9f3bb4d852ac651d094254d347abd1634
This commit is contained in:
parent
8155e61a60
commit
c32f3056f9
2 changed files with 26 additions and 18 deletions
|
@ -161,11 +161,11 @@ Bus::recvTiming(PacketPtr pkt)
|
|||
short dest = pkt->getDest();
|
||||
if (dest == Packet::Broadcast) {
|
||||
port = findPort(pkt->getAddr(), pkt->getSrc());
|
||||
if (timingSnoop(pkt, port)) {
|
||||
if (timingSnoop(pkt, port ? port : interfaces[pkt->getSrc()])) {
|
||||
bool success;
|
||||
|
||||
pkt->flags |= SNOOP_COMMIT;
|
||||
success = timingSnoop(pkt, port);
|
||||
success = timingSnoop(pkt, port ? port : interfaces[pkt->getSrc()]);
|
||||
assert(success);
|
||||
|
||||
if (pkt->flags & SATISFIED) {
|
||||
|
@ -192,22 +192,28 @@ Bus::recvTiming(PacketPtr pkt)
|
|||
|
||||
occupyBus(pkt);
|
||||
|
||||
if (port->sendTiming(pkt)) {
|
||||
// Packet was successfully sent. Return true.
|
||||
// Also take care of retries
|
||||
if (inRetry) {
|
||||
DPRINTF(Bus, "Remove retry from list %i\n", retryList.front());
|
||||
retryList.front()->onRetryList(false);
|
||||
retryList.pop_front();
|
||||
inRetry = false;
|
||||
if (port) {
|
||||
if (port->sendTiming(pkt)) {
|
||||
// Packet was successfully sent. Return true.
|
||||
// Also take care of retries
|
||||
if (inRetry) {
|
||||
DPRINTF(Bus, "Remove retry from list %i\n", retryList.front());
|
||||
retryList.front()->onRetryList(false);
|
||||
retryList.pop_front();
|
||||
inRetry = false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// Packet not successfully sent. Leave or put it on the retry list.
|
||||
DPRINTF(Bus, "Adding a retry to RETRY list %i\n", pktPort);
|
||||
addToRetryList(pktPort);
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
//Forwarding up from responder, just return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Packet not successfully sent. Leave or put it on the retry list.
|
||||
DPRINTF(Bus, "Adding a retry to RETRY list %i\n", pktPort);
|
||||
addToRetryList(pktPort);
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -398,12 +404,14 @@ Bus::recvAtomic(PacketPtr pkt)
|
|||
pkt->finishTime = curTick + clock;
|
||||
|
||||
Port *port = findPort(pkt->getAddr(), pkt->getSrc());
|
||||
Tick snoopTime = atomicSnoop(pkt, port);
|
||||
Tick snoopTime = atomicSnoop(pkt, port ? port : interfaces[pkt->getSrc()]);
|
||||
|
||||
if (snoopTime)
|
||||
return snoopTime; //Snoop satisfies it
|
||||
else
|
||||
else if (port)
|
||||
return port->sendAtomic(pkt);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** Function called by the port when the bus is receiving a Functional
|
||||
|
|
|
@ -301,7 +301,7 @@ class Packet
|
|||
|
||||
/** Destructor. */
|
||||
~Packet()
|
||||
{ deleteData(); }
|
||||
{ if (staticData || dynamicData) deleteData(); }
|
||||
|
||||
/** Reinitialize packet address and size from the associated
|
||||
* Request object, and reset other fields that may have been
|
||||
|
|
Loading…
Reference in a new issue