Correctly remove queue from packet i/o and remove it from scheduler.

Signed-off-by: Maxim Uvarov <[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

Reply via email to