arch, x86: Delete packet in IntDevice::recvResponse
authorJoel Hestness <jthestness@gmail.com>
Tue, 29 Sep 2015 14:28:26 +0000 (09:28 -0500)
committerJoel Hestness <jthestness@gmail.com>
Tue, 29 Sep 2015 14:28:26 +0000 (09:28 -0500)
IntDevice::recvResponse is called from two places in current mainline: (1) the
short circuit path of X86ISA::IntDevice::IntMasterPort::sendMessage for atomic
mode, and (2) the full request->response path to and from the x86 interrupts
device (finally called from MessageMasterPort::recvTimingResp). In the former
case, the packet was deleted correctly, but in the latter case, the packet and
request leak. To fix the leak, move request and packet deletion into IntDevice
inherited class implementations of recvResponse.

src/dev/x86/i82094aa.cc
src/dev/x86/i82094aa.hh
src/dev/x86/intdev.cc
src/dev/x86/intdev.hh

index 44fa291549b8b052eff851bd32effdfe5905c620..ffc6312106602b40f9d68465707461e10469e091 100644 (file)
@@ -87,6 +87,15 @@ X86ISA::I82094AA::getIntAddrRange() const
     return ranges;
 }
 
+Tick
+X86ISA::I82094AA::recvResponse(PacketPtr pkt)
+{
+    // Packet instantiated calling sendMessage() in signalInterrupt()
+    delete pkt->req;
+    delete pkt;
+    return 0;
+}
+
 Tick
 X86ISA::I82094AA::read(PacketPtr pkt)
 {
index afa597e659dbc6d5b5a30a766f8c5db8f36b7e34..d047a49da7ef4d291586570236d5e4d9a8786282 100644 (file)
@@ -105,6 +105,8 @@ class I82094AA : public BasicPioDevice, public IntDevice
     BaseMasterPort &getMasterPort(const std::string &if_name,
                                   PortID idx = InvalidPortID);
 
+    Tick recvResponse(PacketPtr pkt) M5_ATTR_OVERRIDE;
+
     void signalInterrupt(int line);
     void raiseInterruptPin(int number);
     void lowerInterruptPin(int number);
index 88307330233bf19cb25b69b93fa7e38ea996133a..a35f76b5fc0331f06368b116bdbd4cb5654c6d62 100644 (file)
@@ -59,8 +59,6 @@ X86ISA::IntDevice::IntMasterPort::sendMessage(ApicList apics,
             assert(pkt->isResponse());
             // also ignore the latency in handling the response
             recvResponse(pkt);
-            delete pkt->req;
-            delete pkt;
         }
     }
 }
index d63e64010c609da299d36ba25f05dc90fcc31b58..65ad8727db58c907098951f235046cc1a31d193d 100644 (file)
@@ -150,6 +150,7 @@ class IntDevice
     virtual Tick
     recvResponse(PacketPtr pkt)
     {
+        panic("recvResponse not implemented.\n");
         return 0;
     }