Well, I think the first step is understanding why the cached version of the virtual port in the thread context behaves differently than a newly created one. From reading the code it doesn't seem like there should be a difference, however using the cached version doesn't work so there must be.
Ali If we fixed that then we might not need On Jun 29, 2008, at 6:28 PM, nathan binkert wrote: > I'd actually like to see this changset go back in. It seems that all > that needs to happen is that setPeer should delete the peer if it is a > defaultPort. There are a couple of ways to do this: > 1) Have setPeer call disconnect(), though I'm not clear on how the > deletePort() thing is supposed to work > 2) in setPeer, dynamic_cast<DefaultPort *>(this) and delete it if it > isn't null > 3) create a new virtual function on Port that does nothing, and > override it to delete this in DefaultPort. Call this function from > setPeer. > > Anyway, Steve, since you're the most familiar with this code, I'd > prefer you put it back in, but I would be handy to have soon. > > Nate > > >> changeset 85c8d296c1cb in /z/repo/m5 >> details: http://repo.m5sim.org/m5?cmd=changeset;node=85c8d296c1cb >> summary: Backed out changeset 94a7bb476fca: caused memory leak. >> >> changeset 0d9fac06c402 in /z/repo/m5 >> details: http://repo.m5sim.org/m5?cmd=changeset;node=0d9fac06c402 >> summary: Automated merge after backout. >> >> diffstat: >> >> 11 files changed, 7 insertions(+), 17 deletions(-) >> src/cpu/o3/fetch.hh | 1 - >> src/cpu/o3/lsq.hh | 1 - >> src/mem/bus.cc | 1 - >> src/mem/cache/cache_impl.hh | 4 ++-- >> src/mem/mem_object.cc | 1 - >> src/mem/mem_object.hh | 3 --- >> src/mem/port.cc | 7 ------- >> src/mem/port.hh | 2 ++ >> src/python/swig/event.i | 1 - >> src/sim/sim_object.hh | 2 ++ >> src/sim/sim_object_params.hh | 1 + >> >> diffs (truncated from 453 to 300 lines): >> >> diff -r 94a7bb476fca -r 0d9fac06c402 src/cpu/o3/fetch.hh >> --- a/src/cpu/o3/fetch.hh Sat Jun 21 01:04:43 2008 -0400 >> +++ b/src/cpu/o3/fetch.hh Sat Jun 28 13:20:00 2008 -0400 >> @@ -80,8 +80,8 @@ class DefaultFetch >> >> public: >> /** Default constructor. */ >> - IcachePort(DefaultFetch<Impl> *_fetch, O3CPU *_cpu) >> - : Port(_fetch->name() + "-iport", _cpu), fetch(_fetch) >> + IcachePort(DefaultFetch<Impl> *_fetch) >> + : Port(_fetch->name() + "-iport"), fetch(_fetch) >> { } >> >> bool snoopRangeSent; >> diff -r 94a7bb476fca -r 0d9fac06c402 src/cpu/o3/fetch_impl.hh >> --- a/src/cpu/o3/fetch_impl.hh Sat Jun 21 01:04:43 2008 -0400 >> +++ b/src/cpu/o3/fetch_impl.hh Sat Jun 28 13:20:00 2008 -0400 >> @@ -167,7 +167,7 @@ DefaultFetch<Impl>::DefaultFetch(O3CPU * >> instSize = sizeof(TheISA::MachInst); >> >> // Name is finally available, so create the port. >> - icachePort = new IcachePort(this, cpu); >> + icachePort = new IcachePort(this); >> >> icachePort->snoopRangeSent = false; >> >> diff -r 94a7bb476fca -r 0d9fac06c402 src/cpu/o3/lsq.hh >> --- a/src/cpu/o3/lsq.hh Sat Jun 21 01:04:43 2008 -0400 >> +++ b/src/cpu/o3/lsq.hh Sat Jun 28 13:20:00 2008 -0400 >> @@ -296,8 +296,8 @@ class LSQ { >> >> public: >> /** Default constructor. */ >> - DcachePort(LSQ *_lsq, O3CPU *_cpu) >> - : Port(_lsq->name() + "-dport", _cpu), lsq(_lsq) >> + DcachePort(LSQ *_lsq) >> + : Port(_lsq->name() + "-dport"), lsq(_lsq) >> { } >> >> bool snoopRangeSent; >> diff -r 94a7bb476fca -r 0d9fac06c402 src/cpu/o3/lsq_impl.hh >> --- a/src/cpu/o3/lsq_impl.hh Sat Jun 21 01:04:43 2008 -0400 >> +++ b/src/cpu/o3/lsq_impl.hh Sat Jun 28 13:20:00 2008 -0400 >> @@ -112,7 +112,7 @@ LSQ<Impl>::DcachePort::recvRetry() >> >> template <class Impl> >> LSQ<Impl>::LSQ(O3CPU *cpu_ptr, IEW *iew_ptr, Params *params) >> - : cpu(cpu_ptr), iewStage(iew_ptr), dcachePort(this, cpu_ptr), >> + : cpu(cpu_ptr), iewStage(iew_ptr), dcachePort(this), >> LQEntries(params->LQEntries), >> SQEntries(params->SQEntries), >> numThreads(params->numberOfThreads), >> diff -r 94a7bb476fca -r 0d9fac06c402 src/cpu/o3/ >> thread_context_impl.hh >> --- a/src/cpu/o3/thread_context_impl.hh Sat Jun 21 01:04:43 2008 >> -0400 >> +++ b/src/cpu/o3/thread_context_impl.hh Sat Jun 28 13:20:00 2008 >> -0400 >> @@ -103,6 +103,7 @@ O3ThreadContext<Impl>::delVirtPort(Virtu >> O3ThreadContext<Impl>::delVirtPort(VirtualPort *vp) >> { >> if (vp != thread->getVirtPort()) { >> + vp->removeConn(); >> delete vp; >> } >> } >> diff -r 94a7bb476fca -r 0d9fac06c402 src/cpu/ozone/cpu_impl.hh >> --- a/src/cpu/ozone/cpu_impl.hh Sat Jun 21 01:04:43 2008 -0400 >> +++ b/src/cpu/ozone/cpu_impl.hh Sat Jun 28 13:20:00 2008 -0400 >> @@ -747,6 +747,7 @@ void >> void >> OzoneCPU<Impl>::OzoneTC::delVirtPort(VirtualPort *vp) >> { >> + vp->removeConn(); >> delete vp; >> } >> #endif >> diff -r 94a7bb476fca -r 0d9fac06c402 src/cpu/simple_thread.cc >> --- a/src/cpu/simple_thread.cc Sat Jun 21 01:04:43 2008 -0400 >> +++ b/src/cpu/simple_thread.cc Sat Jun 28 13:20:00 2008 -0400 >> @@ -302,6 +302,7 @@ SimpleThread::delVirtPort(VirtualPort *v >> SimpleThread::delVirtPort(VirtualPort *vp) >> { >> if (vp != virtPort) { >> + vp->removeConn(); >> delete vp; >> } >> } >> diff -r 94a7bb476fca -r 0d9fac06c402 src/cpu/thread_state.cc >> --- a/src/cpu/thread_state.cc Sat Jun 21 01:04:43 2008 -0400 >> +++ b/src/cpu/thread_state.cc Sat Jun 28 13:20:00 2008 -0400 >> @@ -126,7 +126,7 @@ ThreadState::connectPhysPort() >> // already existed. Fix this memory leak once the bus port IDs >> // for functional ports is resolved. >> if (physPort) >> - physPort->disconnectFromPeer(); >> + physPort->removeConn(); >> else >> physPort = new FunctionalPort(csprintf("%s-%d-funcport", >> baseCpu->name(), tid)); >> @@ -140,7 +140,7 @@ ThreadState::connectVirtPort() >> // already existed. Fix this memory leak once the bus port IDs >> // for functional ports is resolved. >> if (virtPort) >> - virtPort->disconnectFromPeer(); >> + virtPort->removeConn(); >> else >> virtPort = new VirtualPort(csprintf("%s-%d-vport", >> baseCpu->name(), tid)); >> diff -r 94a7bb476fca -r 0d9fac06c402 src/mem/bridge.cc >> --- a/src/mem/bridge.cc Sat Jun 21 01:04:43 2008 -0400 >> +++ b/src/mem/bridge.cc Sat Jun 28 13:20:00 2008 -0400 >> @@ -47,7 +47,7 @@ Bridge::BridgePort::BridgePort(const std >> int _delay, int _nack_delay, int >> _req_limit, >> int _resp_limit, >> std::vector<Range<Addr> > >> filter_ranges) >> - : Port(_name, _bridge), bridge(_bridge), otherPort(_otherPort), >> + : Port(_name), bridge(_bridge), otherPort(_otherPort), >> delay(_delay), nackDelay(_nack_delay), >> filterRanges(filter_ranges), >> outstandingResponses(0), queuedRequests(0), inRetry(false), >> reqQueueLimit(_req_limit), respQueueLimit(_resp_limit), >> sendEvent(this) >> diff -r 94a7bb476fca -r 0d9fac06c402 src/mem/bus.cc >> --- a/src/mem/bus.cc Sat Jun 21 01:04:43 2008 -0400 >> +++ b/src/mem/bus.cc Sat Jun 28 13:20:00 2008 -0400 >> @@ -72,8 +72,8 @@ Bus::getPort(const std::string &if_name, >> return bp; >> } >> >> -bool >> -Bus::deletePort(Port *p) >> +void >> +Bus::deletePortRefs(Port *p) >> { >> >> BusPort *bp = dynamic_cast<BusPort*>(p); >> @@ -81,11 +81,10 @@ Bus::deletePort(Port *p) >> panic("Couldn't convert Port* to BusPort*\n"); >> // If this is our one functional port >> if (funcPort == bp) >> - return false; >> + return; >> interfaces.erase(bp->getId()); >> clearBusCache(); >> delete bp; >> - return true; >> } >> >> /** Get the ranges of anyone other buses that we are connected to. */ >> @@ -524,9 +523,12 @@ Bus::recvStatusChange(Port::Status statu >> for (iter = ranges.begin(); iter != ranges.end(); iter++) { >> DPRINTF(BusAddrRanges, "Adding range %#llx - %#llx for >> id %d\n", >> iter->start, iter->end, id); >> - if (portMap.insert(*iter, id) == portMap.end()) >> - panic("Two devices with same range\n"); >> - >> + if (portMap.insert(*iter, id) == portMap.end()) { >> + int conflict_id = portMap.find(*iter)->second; >> + fatal("%s has two ports with same range:\n\t%s\n\t >> %s\n", >> + name(), interfaces[id]->getPeer()->name(), >> + interfaces[conflict_id]->getPeer()->name()); >> + } >> } >> } >> DPRINTF(MMU, "port list has %d entries\n", portMap.size()); >> diff -r 94a7bb476fca -r 0d9fac06c402 src/mem/bus.hh >> --- a/src/mem/bus.hh Sat Jun 21 01:04:43 2008 -0400 >> +++ b/src/mem/bus.hh Sat Jun 28 13:20:00 2008 -0400 >> @@ -364,7 +364,7 @@ class Bus : public MemObject >> >> /** A function used to return the port associated with this bus >> object. */ >> virtual Port *getPort(const std::string &if_name, int idx = -1); >> - virtual bool deletePort(Port *p); >> + virtual void deletePortRefs(Port *p); >> >> virtual void init(); >> virtual void startup(); >> diff -r 94a7bb476fca -r 0d9fac06c402 src/mem/cache/cache.hh >> --- a/src/mem/cache/cache.hh Sat Jun 21 01:04:43 2008 -0400 >> +++ b/src/mem/cache/cache.hh Sat Jun 28 13:20:00 2008 -0400 >> @@ -217,7 +217,7 @@ class Cache : public BaseCache >> Cache(const Params *p, TagStore *tags, BasePrefetcher >> *prefetcher); >> >> virtual Port *getPort(const std::string &if_name, int idx = -1); >> - virtual bool deletePort(Port *p); >> + virtual void deletePortRefs(Port *p); >> >> void regStats(); >> >> diff -r 94a7bb476fca -r 0d9fac06c402 src/mem/cache/cache_impl.hh >> --- a/src/mem/cache/cache_impl.hh Sat Jun 21 01:04:43 2008 >> -0400 >> +++ b/src/mem/cache/cache_impl.hh Sat Jun 28 13:20:00 2008 >> -0400 >> @@ -105,14 +105,13 @@ Cache<TagStore>::getPort(const std::stri >> } >> >> template<class TagStore> >> -bool >> -Cache<TagStore>::deletePort(Port *p) >> +void >> +Cache<TagStore>::deletePortRefs(Port *p) >> { >> if (cpuSidePort == p || memSidePort == p) >> panic("Can only delete functional ports\n"); >> >> delete p; >> - return true; >> } >> >> >> diff -r 94a7bb476fca -r 0d9fac06c402 src/mem/mem_object.cc >> --- a/src/mem/mem_object.cc Sat Jun 21 01:04:43 2008 -0400 >> +++ b/src/mem/mem_object.cc Sat Jun 28 13:20:00 2008 -0400 >> @@ -43,8 +43,8 @@ MemObject::makeParams(const std::string >> return params; >> } >> >> -bool >> -MemObject::deletePort(Port *p) >> +void >> +MemObject::deletePortRefs(Port *p) >> { >> panic("This object does not support port deletion\n"); >> } >> diff -r 94a7bb476fca -r 0d9fac06c402 src/mem/mem_object.hh >> --- a/src/mem/mem_object.hh Sat Jun 21 01:04:43 2008 -0400 >> +++ b/src/mem/mem_object.hh Sat Jun 28 13:20:00 2008 -0400 >> @@ -64,13 +64,9 @@ class MemObject : public SimObject >> /** Additional function to return the Port of a memory object. */ >> virtual Port *getPort(const std::string &if_name, int idx = -1) >> = 0; >> >> - /** Tell MemObject that this port is no longer in use, so it >> - * should remove it from any structures that it's keeping it in. >> - * If the port was allocated dynamically for this connection, it >> - * should be deleted here. >> - * @return True if the port was deleted, false if it still >> exists. >> - */ >> - virtual bool deletePort(Port *p); >> + /** Tell object that this port is about to disappear, so it >> should remove it >> + * from any structures that it's keeping it in. */ >> + virtual void deletePortRefs(Port *p) ; >> }; >> >> #endif //__MEM_MEM_OBJECT_HH__ >> diff -r 94a7bb476fca -r 0d9fac06c402 src/mem/port.cc >> --- a/src/mem/port.cc Sat Jun 21 01:04:43 2008 -0400 >> +++ b/src/mem/port.cc Sat Jun 28 13:20:00 2008 -0400 >> @@ -39,25 +39,17 @@ >> #include "mem/mem_object.hh" >> #include "mem/port.hh" >> >> -/** >> - * Special class for port objects that are used as peers for >> - * unconnected ports. Assigning instances of this class to newly >> - * allocated ports allows us to guarantee that every port has a peer >> - * object (so there's no need to check for null peer pointers), >> while >> - * catching uses of unconnected ports. >> - */ >> class DefaultPeerPort : public Port >> { >> protected: >> void blowUp() >> { >> - Port *peer = getPeer(); >> - fatal("unconnected port: %s", peer ? peer->name() : >> "<unknown>"); >> + fatal("%s: Unconnected port!", peer->name()); >> } >> >> public: >> - DefaultPeerPort(Port *_peer) >> - : Port("default_port", NULL, _peer) >> + DefaultPeerPort() >> + : Port("default_port") >> { } >> >> bool recvTiming(PacketPtr) >> @@ -96,59 +88,36 @@ class DefaultPeerPort : public Port >> bool isDefaultPort() const { return true; } >> }; >> >> +DefaultPeerPort defaultPeerPort; >> >> -Port::Port(const std::string &_name, MemObject *_owner, Port >> *_peer) : >> - portName(_name), >> - peer(_peer ? _peer : new DefaultPeerPort(this)), >> - owner(_owner) >> +Port::Port() >> + : peer(&defaultPeerPort), owner(NULL) >> +{ >> +} >> + >> +Port::Port(const std::string &_name, MemObject *_owner) >> + : portName(_name), peer(&defaultPeerPort), owner(_owner) >> { >> } >> >> Port::~Port() >> { >> - disconnectFromPeer(); >> -} >> - >> -void >> -Port::disconnectFromPeer() >> -{ >> - if (peer) { >> _______________________________________________ >> m5-dev mailing list >> m5-dev@m5sim.org >> http://m5sim.org/mailman/listinfo/m5-dev >> >> > _______________________________________________ > m5-dev mailing list > m5-dev@m5sim.org > http://m5sim.org/mailman/listinfo/m5-dev > _______________________________________________ m5-dev mailing list m5-dev@m5sim.org http://m5sim.org/mailman/listinfo/m5-dev