On 16 January 2015 at 13:58, Maxim Uvarov <[email protected]> wrote:
> Correctly remove queue from packet i/o and remove it from scheduler.
>
> Signed-off-by: Maxim Uvarov <[email protected]>

Tested-by: Anders Roxell <[email protected]>

> ---
>  v8: fixed Stuart comments and added test. Implementation of 
> odp_pktio_inq_remdef
>         also fixes segfault in existance pktio test.
>
>  .../linux-generic/include/odp_queue_internal.h     | 10 ++++++++
>  platform/linux-generic/odp_packet_io.c             | 29 
> +++++++++++++++++++++-
>  platform/linux-generic/odp_schedule.c              |  5 ++++
>  test/validation/odp_pktio.c                        | 17 +++++++++++++
>  4 files changed, 60 insertions(+), 1 deletion(-)
>
> diff --git a/platform/linux-generic/include/odp_queue_internal.h 
> b/platform/linux-generic/include/odp_queue_internal.h
> index d5c8e4e..dbc42c0 100644
> --- a/platform/linux-generic/include/odp_queue_internal.h
> +++ b/platform/linux-generic/include/odp_queue_internal.h
> @@ -129,6 +129,16 @@ static inline int queue_is_destroyed(odp_queue_t handle)
>
>         return queue->s.status == QUEUE_STATUS_DESTROYED;
>  }
> +
> +static inline int queue_is_sched(odp_queue_t handle)
> +{
> +       queue_entry_t *queue;
> +
> +       queue = queue_to_qentry(handle);
> +
> +       return ((queue->s.status == QUEUE_STATUS_SCHED) &&
> +               (queue->s.pktin != ODP_PKTIO_INVALID));
> +}
>  #ifdef __cplusplus
>  }
>  #endif
> diff --git a/platform/linux-generic/odp_packet_io.c 
> b/platform/linux-generic/odp_packet_io.c
> index cd109d2..04de756 100644
> --- a/platform/linux-generic/odp_packet_io.c
> +++ b/platform/linux-generic/odp_packet_io.c
> @@ -429,7 +429,34 @@ int odp_pktio_inq_setdef(odp_pktio_t id, odp_queue_t 
> queue)
>
>  int odp_pktio_inq_remdef(odp_pktio_t id)
>  {
> -       return odp_pktio_inq_setdef(id, ODP_QUEUE_INVALID);
> +       pktio_entry_t *pktio_entry = get_pktio_entry(id);
> +       odp_queue_t queue;
> +       queue_entry_t *qentry;
> +
> +       if (pktio_entry == NULL)
> +               return -1;
> +
> +       lock_entry(pktio_entry);
> +       queue = pktio_entry->s.inq_default;
> +       qentry = queue_to_qentry(queue);
> +
> +       queue_lock(qentry);
> +       if (qentry->s.status == QUEUE_STATUS_FREE) {
> +               queue_unlock(qentry);
> +               unlock_entry(pktio_entry);
> +               return -1;
> +       }
> +
> +       qentry->s.enqueue = queue_enq_dummy;
> +       qentry->s.enqueue_multi = queue_enq_multi_dummy;
> +       qentry->s.status = QUEUE_STATUS_NOTSCHED;
> +       qentry->s.pktin = ODP_PKTIO_INVALID;
> +       queue_unlock(qentry);
> +
> +       pktio_entry->s.inq_default = ODP_QUEUE_INVALID;
> +       unlock_entry(pktio_entry);
> +
> +       return 0;
>  }
>
>  odp_queue_t odp_pktio_inq_getdef(odp_pktio_t id)
> diff --git a/platform/linux-generic/odp_schedule.c 
> b/platform/linux-generic/odp_schedule.c
> index a14de4f..775b788 100644
> --- a/platform/linux-generic/odp_schedule.c
> +++ b/platform/linux-generic/odp_schedule.c
> @@ -286,6 +286,11 @@ static int schedule(odp_queue_t *out_queue, odp_buffer_t 
> out_buf[],
>                                 desc  = odp_buffer_addr(desc_buf);
>                                 queue = desc->queue;
>
> +                               if (odp_queue_type(queue) ==
> +                                       ODP_QUEUE_TYPE_PKTIN &&
> +                                       !queue_is_sched(queue))
> +                                       continue;
> +
>                                 num = odp_queue_deq_multi(queue,
>                                                           sched_local.buf,
>                                                           max_deq);
> diff --git a/test/validation/odp_pktio.c b/test/validation/odp_pktio.c
> index d1eb0d5..03e954a 100644
> --- a/test/validation/odp_pktio.c
> +++ b/test/validation/odp_pktio.c
> @@ -379,6 +379,7 @@ static void pktio_test_txrx(odp_queue_type_t q_type, int 
> num_pkts)
>         pktio_txrx_multi(&pktios[0], &pktios[if_b], num_pkts);
>
>         for (i = 0; i < num_ifaces; ++i) {
> +               odp_pktio_inq_remdef(pktios[i].id);
>                 ret = odp_pktio_close(pktios[i].id);
>                 CU_ASSERT(ret == 0);
>         }
> @@ -472,6 +473,21 @@ static void test_odp_pktio_mac(void)
>         return;
>  }
>
> +static void test_odp_pktio_inq_remdef(void)
> +{
> +       odp_pktio_t pktio = create_pktio(iface_name[0]);
> +       int i;
> +
> +       CU_ASSERT(pktio != ODP_PKTIO_INVALID);
> +       CU_ASSERT(create_inq(pktio) == 0);
> +       CU_ASSERT(odp_pktio_inq_remdef(pktio) == 0);
> +
> +       for (i = 0; i < 100; i++)
> +               odp_schedule(NULL, ODP_TIME_MSEC);
> +
> +       CU_ASSERT(odp_pktio_close(pktio) == 0);
> +}
> +
>  static void test_odp_pktio_open(void)
>  {
>         odp_pktio_t pktio;
> @@ -582,6 +598,7 @@ CU_TestInfo pktio_tests[] = {
>         {"pktio mtu",           test_odp_pktio_mtu},
>         {"pktio promisc mode",  test_odp_pktio_promisc},
>         {"pktio mac",           test_odp_pktio_mac},
> +       {"pktio inq_remdef",    test_odp_pktio_inq_remdef},
>         CU_TEST_INFO_NULL
>  };
>
> --
> 1.8.5.1.163.gd7aced9
>
>
> _______________________________________________
> lng-odp mailing list
> [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