On 02/25/2015 04:02 PM, Bill Fischofer wrote:
The term routines cover normal termination. That means the application is responsible for all "bookend" calls. If the application called odp_pool_create() then it is the application's responsibility to call odp_pool_destroy() as part of its normal termination path. As a result odp_pool_term_global() simply verifies that this has been done--it does not do this for the application.

This is consistent with all other term routines.


From that point of view patches are ok.

Maxim.

On Wed, Feb 25, 2015 at 6:54 AM, Maxim Uvarov <[email protected] <mailto:[email protected]>> wrote:

    On 02/25/2015 02:03 PM, Bill Fischofer wrote:

        odp_pool_create() issues an odp_shm_reserve() call.
        odp_pool_destroy() issues a corresponding odp_shm_free() call.
        What else is needed? Presumably any needed map/unmap calls are
        internal to the odp_shm_xxx( routines, no?

    yes, odp_shm_free() frees shm, which is the same as
    pool->s.pool_base_addr.  But I still think that pool termination
    has to be simple:
            for (i = 0; i < ODP_CONFIG_POOLS; i++) {
                    pool = get_pool_entry(i);
                    ret += odp_pool_destroy(pool_index_to_handle(pool));
            }
            return ret;

    The reasons are:
    1. That flag needed to be accounted:
            if (!pool->s.flags.user_supplied_shm)
                    odp_shm_free(pool->s.pool_shm);
    You can not free pool which was not automatically allocated.

    2.  Set to invalid:
    pool->s.pool_shm = ODP_SHM_INVALID

    3.  No idea what should we do if there are still some packets.
    Probably also fail to terminate pool.
            /* Call fails if pool has allocated buffers */
            if (odp_atomic_load_u32(&pool->s.bufcount) <
    pool->s.buf_num) {
                    POOL_UNLOCK(&pool->s.lock);
                    return -1;
            }

    Thanks,
    Maxim.


        On Wed, Feb 25, 2015 at 3:27 AM, Maxim Uvarov
        <[email protected] <mailto:[email protected]>
        <mailto:[email protected]
        <mailto:[email protected]>>> wrote:

            On 02/25/2015 01:21 AM, Bill Fischofer wrote:

                Maxim, there's no need to do all that since
        odp_pool_create()
                handles a full re-init of the pool structures as part of
                (re)allocating it for another create operation.

                Actually, having vestigial info about past usage can be
                valuable for debugging core dumps.  A pool is
        unallocated if
                pool->s.pool_shm == ODP_SHM_INVALID and that's the key
                variable that determines whether the rest of the items
        in the
                struct are active.

                Bill

            But at least we need unmap(pool->s.pool_base_addr), to prevent
            memory leaks right?

            Maxim.

                On Tue, Feb 24, 2015 at 7:19 AM, Maxim Uvarov
                <[email protected]
        <mailto:[email protected]>
        <mailto:[email protected] <mailto:[email protected]>>
                <mailto:[email protected]
        <mailto:[email protected]>
                <mailto:[email protected]
        <mailto:[email protected]>>>> wrote:

                    On 02/23/2015 11:36 PM, Robbie King wrote:

                        +int odp_pool_term_global(void)
                        +{
                        +       int i;
                        +       pool_entry_t *pool;
                        +       int ret = 0;
                        +       int rc = 0;
                        +
                        +       for (i = 0; i < ODP_CONFIG_POOLS; i++) {
                        +               pool = get_pool_entry(i);
                        +
                        +  POOL_LOCK(&pool->s.lock);
                        +               if (pool->s.pool_shm !=
        ODP_SHM_INVALID) {
                        +                       ODP_ERR("Not destroyed
        pool:
                %s\n",
                        pool->s.name <http://s.name> <http://s.name>
        <http://s.name>);
                        +                       rc = -1;
                        +               }
                        +  POOL_UNLOCK(&pool->s.lock);
                        +       }

                    what this for does?
                    you should do:
                    pool->s.name <http://s.name> <http://s.name>
        <http://s.name>[0] = 0;
                    pool->s.flags.has_name = 1;
                    unmap(pool->s.pool_base_addr);

                    Also I would like to zero everything that
        odp_pool_create()
                    created. Including atomic counters.

                    Thanks,
                    Maxim.

                        +
                        +       ret =
                odp_shm_free(odp_shm_lookup(SHM_DEFAULT_NAME));
                        +       if (ret < 0) {
                        +               ODP_ERR("shm free failed for %s",
                        SHM_DEFAULT_NAME);
                        +               rc = -1;
                        +       }
                        +
                        +       return rc;
                        +}
                        +



                    _______________________________________________
                    lng-odp mailing list
        [email protected] <mailto:[email protected]>
        <mailto:[email protected]
        <mailto:[email protected]>>
                <mailto:[email protected]
        <mailto:[email protected]>
                <mailto:[email protected]
        <mailto:[email protected]>>>
        http://lists.linaro.org/mailman/listinfo/lng-odp








_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to