Changed the definition of odp_queue_enq_multi() to support partial success
(e.g. enqueued some but not all of the events specified). Returns the number
of events enqueued (equivalent to odp_queue_deq_multi()). This change is
necessary to support ODP implementations that use fixed size queues (e.g.
ODP linux-dpdk).
Updated the implementation in odp_queue.c to conform to the new semantics.
Updated the necessary test/validation/performance programs.

Signed-off-by: Ola Liljedahl <ola.liljed...@linaro.org>
---
(This document/code contribution attached is provided under the terms of
agreement LES-LTM-21309)

 include/odp/api/queue.h                |  9 +++++----
 platform/linux-generic/odp_packet_io.c |  4 ++--
 platform/linux-generic/odp_queue.c     |  4 ++--
 test/performance/odp_scheduling.c      | 10 +++++++---
 test/validation/odp_pktio.c            | 16 ++++++++++------
 test/validation/odp_queue.c            |  3 ++-
 6 files changed, 28 insertions(+), 18 deletions(-)

diff --git a/include/odp/api/queue.h b/include/odp/api/queue.h
index b63cc34..377a7da 100644
--- a/include/odp/api/queue.h
+++ b/include/odp/api/queue.h
@@ -224,12 +224,13 @@ int odp_queue_enq(odp_queue_t queue, odp_event_t ev);
  * Enqueue multiple events to a queue
  *
  * @param queue   Queue handle
- * @param ev      Event handles
- * @param num     Number of event handles
+ * @param[in] events Array of event handles
+ * @param num     Number of event handles to enqueue
  *
- * @return 0 if succesful
+ * @return Number of events actually enqueued (0 ... num)
+ * @retval <0 on failure
  */
-int odp_queue_enq_multi(odp_queue_t queue, odp_event_t ev[], int num);
+int odp_queue_enq_multi(odp_queue_t queue, const odp_event_t events[], int 
num);
 
 /**
  * Queue dequeue
diff --git a/platform/linux-generic/odp_packet_io.c 
b/platform/linux-generic/odp_packet_io.c
index f156dd3..86620a1 100644
--- a/platform/linux-generic/odp_packet_io.c
+++ b/platform/linux-generic/odp_packet_io.c
@@ -410,7 +410,7 @@ static int enq_loopback(pktio_entry_t *pktio_entry, 
odp_packet_t pkt_tbl[],
                hdr_tbl[i] = odp_buf_to_hdr(_odp_packet_to_buffer(pkt_tbl[i]));
 
        qentry = queue_to_qentry(pktio_entry->s.loopq);
-       return queue_enq_multi(qentry, hdr_tbl, len) == 0 ? len : 0;
+       return queue_enq_multi(qentry, hdr_tbl, len);
 }
 
 int odp_pktio_send(odp_pktio_t id, odp_packet_t pkt_table[], unsigned len)
@@ -552,7 +552,7 @@ int pktout_enq_multi(queue_entry_t *qentry, 
odp_buffer_hdr_t *buf_hdr[],
                pkt_tbl[i] = _odp_packet_from_buffer(buf_hdr[i]->handle.handle);
 
        nbr = odp_pktio_send(qentry->s.pktout, pkt_tbl, num);
-       return (nbr == num ? 0 : -1);
+       return nbr;
 }
 
 int pktout_deq_multi(queue_entry_t *qentry ODP_UNUSED,
diff --git a/platform/linux-generic/odp_queue.c 
b/platform/linux-generic/odp_queue.c
index 60be9c2..76bf4d7 100644
--- a/platform/linux-generic/odp_queue.c
+++ b/platform/linux-generic/odp_queue.c
@@ -369,7 +369,7 @@ int queue_enq_multi(queue_entry_t *queue, odp_buffer_hdr_t 
*buf_hdr[], int num)
        if (sched == 1)
                odp_schedule_queue(queue->s.handle, queue->s.param.sched.prio);
 
-       return 0;
+       return num; /* All events enqueued */
 }
 
 int queue_enq_dummy(queue_entry_t *queue ODP_UNUSED,
@@ -385,7 +385,7 @@ int queue_enq_multi_dummy(queue_entry_t *queue ODP_UNUSED,
        return -1;
 }
 
-int odp_queue_enq_multi(odp_queue_t handle, odp_event_t ev[], int num)
+int odp_queue_enq_multi(odp_queue_t handle, const odp_event_t ev[], int num)
 {
        odp_buffer_hdr_t *buf_hdr[QUEUE_MULTI_MAX];
        queue_entry_t *queue;
diff --git a/test/performance/odp_scheduling.c 
b/test/performance/odp_scheduling.c
index ba13d8e..2f4d8a1 100644
--- a/test/performance/odp_scheduling.c
+++ b/test/performance/odp_scheduling.c
@@ -526,7 +526,9 @@ static int test_schedule_multi(const char *str, int thr,
                        ev[j] = odp_buffer_to_event(buf);
                }
 
-               if (odp_queue_enq_multi(queue, ev, MULTI_BUFS_MAX)) {
+               /* Assume we can enqueue all events */
+               if (odp_queue_enq_multi(queue, ev, MULTI_BUFS_MAX) !=
+                   MULTI_BUFS_MAX) {
                        LOG_ERR("  [%i] Queue enqueue failed.\n", thr);
                        return -1;
                }
@@ -541,7 +543,8 @@ static int test_schedule_multi(const char *str, int thr,
 
                tot += num;
 
-               if (odp_queue_enq_multi(queue, ev, num)) {
+               /* Assume we can enqueue all events */
+               if (odp_queue_enq_multi(queue, ev, num) != num) {
                        LOG_ERR("  [%i] Queue enqueue failed.\n", thr);
                        return -1;
                }
@@ -559,7 +562,8 @@ static int test_schedule_multi(const char *str, int thr,
 
                tot += num;
 
-               if (odp_queue_enq_multi(queue, ev, num)) {
+               /* Assume we can enqueue all events */
+               if (odp_queue_enq_multi(queue, ev, num) != num) {
                        LOG_ERR("  [%i] Queue enqueue failed.\n", thr);
                        return -1;
                }
diff --git a/test/validation/odp_pktio.c b/test/validation/odp_pktio.c
index e1ca793..9df4887 100644
--- a/test/validation/odp_pktio.c
+++ b/test/validation/odp_pktio.c
@@ -325,14 +325,18 @@ static void pktio_txrx_multi(pktio_info_t *pktio_a, 
pktio_info_t *pktio_b,
        }
 
        /* send packet(s) out */
-       if (num_pkts == 1)
+       if (num_pkts == 1) {
                ret = odp_queue_enq(pktio_a->outq, tx_ev[0]);
-       else
+               if (ret != 0) {
+                       CU_FAIL("failed to enqueue test packet");
+                       return;
+               }
+       } else {
                ret = odp_queue_enq_multi(pktio_a->outq, tx_ev, num_pkts);
-
-       if (ret != 0) {
-               CU_FAIL("failed to enqueue test packets");
-               return;
+               if (ret != num_pkts) {
+                       CU_FAIL("failed to enqueue test packets");
+                       return;
+               }
        }
 
        /* and wait for them to arrive back */
diff --git a/test/validation/odp_queue.c b/test/validation/odp_queue.c
index 198b4e2..91a32dc 100644
--- a/test/validation/odp_queue.c
+++ b/test/validation/odp_queue.c
@@ -83,9 +83,10 @@ static void test_odp_queue_sunnyday(void)
        /*
         * odp_queue_enq_multi may return 0..n buffers due to the resource
         * constraints in the implementation at that given point of time.
+        * But here we assume that we succeed in enqueuing all buffers.
         */
        ret = odp_queue_enq_multi(queue_id, enev, MAX_BUFFER_QUEUE);
-       CU_ASSERT(0 == ret);
+       CU_ASSERT(MAX_BUFFER_QUEUE == ret);
        pev_tmp = deev;
        do {
                deq_ret  = odp_queue_deq_multi(queue_id, pev_tmp,
-- 
1.9.1


_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to