From 0ecaab4ea8039f707a95f5e3efcc68591dbcd407 Mon Sep 17 00:00:00 2001 From: Joel Hestness Date: Tue, 29 Sep 2015 09:28:26 -0500 Subject: arch, x86: Delete packet in IntDevice::recvResponse 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 | 9 +++++++++ src/dev/x86/i82094aa.hh | 2 ++ src/dev/x86/intdev.cc | 2 -- src/dev/x86/intdev.hh | 1 + 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/dev/x86/i82094aa.cc b/src/dev/x86/i82094aa.cc index 44fa29154..ffc631210 100644 --- a/src/dev/x86/i82094aa.cc +++ b/src/dev/x86/i82094aa.cc @@ -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) { diff --git a/src/dev/x86/i82094aa.hh b/src/dev/x86/i82094aa.hh index afa597e65..d047a49da 100644 --- a/src/dev/x86/i82094aa.hh +++ b/src/dev/x86/i82094aa.hh @@ -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); diff --git a/src/dev/x86/intdev.cc b/src/dev/x86/intdev.cc index 883073302..a35f76b5f 100644 --- a/src/dev/x86/intdev.cc +++ b/src/dev/x86/intdev.cc @@ -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; } } } diff --git a/src/dev/x86/intdev.hh b/src/dev/x86/intdev.hh index d63e64010..65ad8727d 100644 --- a/src/dev/x86/intdev.hh +++ b/src/dev/x86/intdev.hh @@ -150,6 +150,7 @@ class IntDevice virtual Tick recvResponse(PacketPtr pkt) { + panic("recvResponse not implemented.\n"); return 0; } -- cgit v1.2.3