On 04/14/16 23:29, Bill Fischofer wrote:


On Thu, Apr 14, 2016 at 2:50 PM, Maxim Uvarov <[email protected] <mailto:[email protected]>> wrote:



    On 14 April 2016 at 22:16, Bill Fischofer
    <[email protected] <mailto:[email protected]>> wrote:



        On Thu, Apr 14, 2016 at 11:35 AM, Maxim Uvarov
        <[email protected] <mailto:[email protected]>> wrote:

            - use odp_config_queues() to get number of queues and int
            cycle
              iterrator. That makes it more easy to reuse that
            function for
              other platfroms.;
            - remove declaring variables to invalid at the bottom and
            check for
              them down the code;
            - make code more easy to read;

            Signed-off-by: Maxim Uvarov <[email protected]
            <mailto:[email protected]>>
            ---
             platform/linux-generic/odp_queue.c | 36
            +++++++++++++++---------------------
             1 file changed, 15 insertions(+), 21 deletions(-)

            diff --git a/platform/linux-generic/odp_queue.c
            b/platform/linux-generic/odp_queue.c
            index 342ffa2..0f7fd15 100644
            --- a/platform/linux-generic/odp_queue.c
            +++ b/platform/linux-generic/odp_queue.c
            @@ -234,10 +234,8 @@ int odp_queue_lock_count(odp_queue_t
            handle)

             odp_queue_t odp_queue_create(const char *name, const
            odp_queue_param_t *param)
             {
            -       uint32_t i;
            +       int i;
                    queue_entry_t *queue;
            -       odp_queue_t handle = ODP_QUEUE_INVALID;
            -       odp_queue_type_t type;
                    odp_queue_param_t default_param;

                    if (param == NULL) {
            @@ -245,7 +243,7 @@ odp_queue_t odp_queue_create(const
            char *name, const odp_queue_param_t *param)
                            param = &default_param;
                    }

            -       for (i = 0; i < ODP_CONFIG_QUEUES; i++) {
            +       for (i = 0; i < odp_config_queues(); i++) {


        This is needlessly inefficient. The #defines are perfectly OK
        for implementation internal use.  This makes an extra function
        call for each iteration.

                            queue = &queue_tbl->queue[i];

                            if (queue->s.status != QUEUE_STATUS_FREE)
            @@ -253,33 +251,29 @@ odp_queue_t odp_queue_create(const
            char *name, const odp_queue_param_t *param)

            LOCK(&queue->s.lock);
                            if (queue->s.status == QUEUE_STATUS_FREE) {
            -                       if (queue_init(queue, name, param)) {
            +                       if (queue_init(queue, name, param) ||
            +  queue->s.handle == ODP_QUEUE_INVALID) {


        This is a redundant check as this field is initialized part
        part of queue_init_global() and does not change

            UNLOCK(&queue->s.lock);
            -  return handle;
            +  return ODP_QUEUE_INVALID;
                                    }

            -                       type = queue->s.type;
            -
            -                       if (type == ODP_QUEUE_TYPE_SCHED)
            +                       if (queue->s.type ==
            ODP_QUEUE_TYPE_SCHED) {
            queue->s.status = QUEUE_STATUS_NOTSCHED;
            -                       else
            +                               if
            (schedule_queue_init(queue)) {


        In the original code this routine is called with the queue
        unlocked. While holding the lock across this call should still
        work, in general we want to release locks as soon as possible
        so I don't see this as an improvement.


    ah, that is main comment.  If we want schedule_queue_init() run
    without lock than it's better to use current code, I think, so I
    will apply your patch.


    One small note about current code which I just realized (might be
    it's too late for today).

    schedule_queue_init() may fail. Should we in that case set
    queue->s.status back to QUEUE_STATUS_FREE  before


That's a good catch. However that should be done by odp_queue_destroy() since at the point of the failure the queue lock is not held. It's a one line fix. If you want to add it to this patch I'm fine with that or I can submit a follow-up bug and patch.

I think separate patch for that to not depend on original patch.

Maxim.

    return ODP_QUEUE_INVALID ?

    Maxim.


            +      ODP_ERR("schedule queue init failed\n");
            +  UNLOCK(&queue->s.lock);
            +      return ODP_QUEUE_INVALID;
            +                               }
            +                       } else {
            queue->s.status = QUEUE_STATUS_READY;
            -
            -                       handle = queue->s.handle;
            +                       }
            UNLOCK(&queue->s.lock);
            -                       break;
            +                       return queue->s.handle;
                            }
            UNLOCK(&queue->s.lock);
                    }

            -       if (handle != ODP_QUEUE_INVALID && type ==
            ODP_QUEUE_TYPE_SCHED) {
            -               if (schedule_queue_init(queue)) {
            -  ODP_ERR("schedule queue init failed\n");
            -                       return ODP_QUEUE_INVALID;
            -               }
            -       }
            -
            -       return handle;
            +       return ODP_QUEUE_INVALID;
             }

             void queue_destroy_finalize(queue_entry_t *queue)
            --
            2.7.1.250.gff4ea60

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





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

Reply via email to