So, you committed that fix to the dynamic creating of virtual ports. What's the status of this diff?
> 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 > > _______________________________________________ m5-dev mailing list m5-dev@m5sim.org http://m5sim.org/mailman/listinfo/m5-dev