I think someone just needs to reapply it and test it.

Steve

On Mon, Jul 7, 2008 at 9:11 PM, nathan binkert <[EMAIL PROTECTED]> wrote:
> 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
>
_______________________________________________
m5-dev mailing list
m5-dev@m5sim.org
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to