Unsent packet has to be released. If the event type is obvious from the
context, use directly the relevant release functions, otherwise
odp_event(free).
Wider error handling is attempted, but this patch can't fix all the flaws
in the many calling functions of odp_queue_enq()

Signed-off-by: Zoltan Kiss <[email protected]>
---
 example/classifier/odp_classifier.c                       |  7 ++++++-
 example/generator/odp_generator.c                         |  1 +
 example/ipsec/odp_ipsec.c                                 | 11 ++++++++---
 example/ipsec/odp_ipsec_stream.c                          |  6 +++++-
 example/packet/odp_pktio.c                                |  6 +++++-
 platform/linux-generic/include/odp_schedule_internal.h    |  4 ++--
 platform/linux-generic/odp_crypto.c                       |  5 ++++-
 platform/linux-generic/odp_queue.c                        |  8 ++++----
 platform/linux-generic/odp_schedule.c                     | 14 ++++++++++----
 platform/linux-generic/odp_timer.c                        |  4 +++-
 test/performance/odp_l2fwd.c                              |  6 +++++-
 test/performance/odp_pktio_perf.c                         | 10 ++++++++--
 test/performance/odp_scheduling.c                         |  7 +++++++
 test/validation/classification/odp_classification_tests.c |  3 ++-
 test/validation/odp_pktio.c                               |  1 +
 test/validation/odp_queue.c                               |  9 ++++++---
 test/validation/odp_scheduler.c                           | 12 ++++++++----
 17 files changed, 85 insertions(+), 29 deletions(-)

diff --git a/example/classifier/odp_classifier.c 
b/example/classifier/odp_classifier.c
index 48fc1ab..129b042 100644
--- a/example/classifier/odp_classifier.c
+++ b/example/classifier/odp_classifier.c
@@ -292,7 +292,12 @@ static void *pktio_receive_thread(void *arg)
                if (appl->appl_mode == APPL_MODE_DROP)
                        odp_packet_free(pkt);
                else
-                       odp_queue_enq(outq_def, ev);
+                       if (odp_queue_enq(outq_def, ev)) {
+                               EXAMPLE_ERR("  [%i] Queue enqueue failed.\n",
+                                           thr);
+                               odp_packet_free(pkt);
+                               continue;
+                       }
        }
 
        return NULL;
diff --git a/example/generator/odp_generator.c 
b/example/generator/odp_generator.c
index cbe93b5..c4ef361 100644
--- a/example/generator/odp_generator.c
+++ b/example/generator/odp_generator.c
@@ -410,6 +410,7 @@ static void *gen_send_thread(void *arg)
                err = odp_queue_enq(outq_def, odp_packet_to_event(pkt));
                if (err != 0) {
                        EXAMPLE_ERR("  [%02i] send pkt err!\n", thr);
+                       odp_packet_free(pkt);
                        return NULL;
                }
 
diff --git a/example/ipsec/odp_ipsec.c b/example/ipsec/odp_ipsec.c
index cb8f535..1d034dd 100644
--- a/example/ipsec/odp_ipsec.c
+++ b/example/ipsec/odp_ipsec.c
@@ -1078,7 +1078,8 @@ void *pktio_thread(void *arg EXAMPLE_UNUSED)
                                        ctx->state = PKT_STATE_TRANSMIT;
                                } else {
                                        ctx->state = PKT_STATE_IPSEC_OUT_SEQ;
-                                       odp_queue_enq(seqnumq, ev);
+                                       if (odp_queue_enq(seqnumq, ev))
+                                               rc = PKT_DROP;
                                }
                                break;
 
@@ -1096,8 +1097,12 @@ void *pktio_thread(void *arg EXAMPLE_UNUSED)
 
                        case PKT_STATE_TRANSMIT:
 
-                               odp_queue_enq(ctx->outq, ev);
-                               rc = PKT_DONE;
+                               if (odp_queue_enq(ctx->outq, ev)) {
+                                       odp_event_free(ev);
+                                       rc = PKT_DROP;
+                               } else {
+                                       rc = PKT_DONE;
+                               }
                                break;
 
                        default:
diff --git a/example/ipsec/odp_ipsec_stream.c b/example/ipsec/odp_ipsec_stream.c
index 35042f5..af143ee 100644
--- a/example/ipsec/odp_ipsec_stream.c
+++ b/example/ipsec/odp_ipsec_stream.c
@@ -494,7 +494,11 @@ int create_stream_db_inputs(void)
                                break;
                        }
                        stream->created++;
-                       odp_queue_enq(queue, odp_packet_to_event(pkt));
+                       if (odp_queue_enq(queue, odp_packet_to_event(pkt))) {
+                               odp_packet_free(pkt);
+                               printf("Queue enqueue failed\n");
+                               break;
+                       }
 
                        /* Count this stream when we create first packet */
                        if (1 == stream->created)
diff --git a/example/packet/odp_pktio.c b/example/packet/odp_pktio.c
index 0b4a8f1..8004d69 100644
--- a/example/packet/odp_pktio.c
+++ b/example/packet/odp_pktio.c
@@ -233,7 +233,11 @@ static void *pktio_queue_thread(void *arg)
                swap_pkt_addrs(&pkt, 1);
 
                /* Enqueue the packet for output */
-               odp_queue_enq(outq_def, ev);
+               if (odp_queue_enq(outq_def, ev)) {
+                       EXAMPLE_ERR("  [%i] Queue enqueue failed.\n", thr);
+                       odp_packet_free(pkt);
+                       continue;
+               }
 
                /* Print packet counts every once in a while */
                if (odp_unlikely(pkt_cnt++ % 100000 == 0)) {
diff --git a/platform/linux-generic/include/odp_schedule_internal.h 
b/platform/linux-generic/include/odp_schedule_internal.h
index 904bfbd..4c6577d 100644
--- a/platform/linux-generic/include/odp_schedule_internal.h
+++ b/platform/linux-generic/include/odp_schedule_internal.h
@@ -23,9 +23,9 @@ extern "C" {
 int schedule_queue_init(queue_entry_t *qe);
 void schedule_queue_destroy(queue_entry_t *qe);
 
-static inline void schedule_queue(const queue_entry_t *qe)
+static inline int schedule_queue(const queue_entry_t *qe)
 {
-       odp_queue_enq(qe->s.pri_queue, qe->s.cmd_ev);
+       return odp_queue_enq(qe->s.pri_queue, qe->s.cmd_ev);
 }
 
 
diff --git a/platform/linux-generic/odp_crypto.c 
b/platform/linux-generic/odp_crypto.c
index b16316c..e799047 100644
--- a/platform/linux-generic/odp_crypto.c
+++ b/platform/linux-generic/odp_crypto.c
@@ -431,7 +431,10 @@ odp_crypto_operation(odp_crypto_op_params_t *params,
                op_result = get_op_result_from_event(completion_event);
                op_result->magic = OP_RESULT_MAGIC;
                op_result->result = local_result;
-               odp_queue_enq(session->compl_queue, completion_event);
+               if (odp_queue_enq(session->compl_queue, completion_event)) {
+                       odp_event_free(completion_event);
+                       return -1;
+               }
 
                /* Indicate to caller operation was async */
                *posted = 1;
diff --git a/platform/linux-generic/odp_queue.c 
b/platform/linux-generic/odp_queue.c
index 4a0465b..818e28e 100644
--- a/platform/linux-generic/odp_queue.c
+++ b/platform/linux-generic/odp_queue.c
@@ -355,8 +355,8 @@ int queue_enq(queue_entry_t *queue, odp_buffer_hdr_t 
*buf_hdr)
        UNLOCK(&queue->s.lock);
 
        /* Add queue to scheduling */
-       if (sched)
-               schedule_queue(queue);
+       if (sched && schedule_queue(queue))
+               return -1;
 
        return 0;
 }
@@ -395,8 +395,8 @@ int queue_enq_multi(queue_entry_t *queue, odp_buffer_hdr_t 
*buf_hdr[], int num)
        UNLOCK(&queue->s.lock);
 
        /* Add queue to scheduling */
-       if (sched)
-               schedule_queue(queue);
+       if (sched && schedule_queue(queue))
+               return -1;
 
        return num; /* All events enqueued */
 }
diff --git a/platform/linux-generic/odp_schedule.c 
b/platform/linux-generic/odp_schedule.c
index 9206d5c..9e20fda 100644
--- a/platform/linux-generic/odp_schedule.c
+++ b/platform/linux-generic/odp_schedule.c
@@ -355,7 +355,10 @@ int schedule_pktio_start(odp_pktio_t pktio, int prio)
 
        pri_queue  = pri_set_pktio(pktio, prio);
 
-       odp_queue_enq(pri_queue, odp_buffer_to_event(buf));
+       if (odp_queue_enq(pri_queue, odp_buffer_to_event(buf))) {
+               odp_buffer_free(buf);
+               return -1;
+       }
 
        return 0;
 }
@@ -365,7 +368,8 @@ void odp_schedule_release_atomic(void)
        if (sched_local.pri_queue != ODP_QUEUE_INVALID &&
            sched_local.num       == 0) {
                /* Release current atomic queue */
-               odp_queue_enq(sched_local.pri_queue, sched_local.cmd_ev);
+               if (odp_queue_enq(sched_local.pri_queue, sched_local.cmd_ev))
+                       odp_event_free(sched_local.cmd_ev);
                sched_local.pri_queue = ODP_QUEUE_INVALID;
        }
 }
@@ -456,7 +460,8 @@ static int schedule(odp_queue_t *out_queue, odp_event_t 
out_ev[],
                                        odp_buffer_free(buf);
                                } else {
                                        /* Continue scheduling the pktio */
-                                       odp_queue_enq(pri_q, ev);
+                                       if (odp_queue_enq(pri_q, ev))
+                                               odp_event_free(ev);
                                }
 
                                continue;
@@ -487,7 +492,8 @@ static int schedule(odp_queue_t *out_queue, odp_event_t 
out_ev[],
                                sched_local.cmd_ev    = ev;
                        } else {
                                /* Continue scheduling the queue */
-                               odp_queue_enq(pri_q, ev);
+                               if (odp_queue_enq(pri_q, ev))
+                                       odp_event_free(ev);
                        }
 
                        /* Output the source queue handle */
diff --git a/platform/linux-generic/odp_timer.c 
b/platform/linux-generic/odp_timer.c
index f51d2de..4072db5 100644
--- a/platform/linux-generic/odp_timer.c
+++ b/platform/linux-generic/odp_timer.c
@@ -577,9 +577,11 @@ static unsigned timer_expire(odp_timer_pool *tp, uint32_t 
idx, uint64_t tick)
                /* Post the timeout to the destination queue */
                int rc = odp_queue_enq(tim->queue,
                                       odp_buffer_to_event(tmo_buf));
-               if (odp_unlikely(rc != 0))
+               if (odp_unlikely(rc != 0)) {
+                       odp_buffer_free(tmo_buf);
                        ODP_ABORT("Failed to enqueue timeout buffer (%d)\n",
                                  rc);
+               }
                return 1;
        } else {
                /* Else false positive, ignore */
diff --git a/test/performance/odp_l2fwd.c b/test/performance/odp_l2fwd.c
index dd0b4b1..9cc201f 100644
--- a/test/performance/odp_l2fwd.c
+++ b/test/performance/odp_l2fwd.c
@@ -152,7 +152,11 @@ static void *pktio_queue_thread(void *arg)
                outq_def = lookup_dest_q(pkt);
 
                /* Enqueue the packet for output */
-               odp_queue_enq(outq_def, ev);
+               if (odp_queue_enq(outq_def, ev)) {
+                       printf("  [%i] Queue enqueue failed.\n", thr);
+                       odp_packet_free(pkt);
+                       continue;
+               }
 
                stats->packets += 1;
        }
diff --git a/test/performance/odp_pktio_perf.c 
b/test/performance/odp_pktio_perf.c
index b746eca..1ef07ae 100644
--- a/test/performance/odp_pktio_perf.c
+++ b/test/performance/odp_pktio_perf.c
@@ -272,8 +272,14 @@ static int send_packets(odp_queue_t outq,
 {
        if (num_pkts == 0)
                return 0;
-       else if (num_pkts == 1)
-               return odp_queue_enq(outq, event_tbl[0]) == 0 ? 1 : 0;
+       else if (num_pkts == 1) {
+               if (odp_queue_enq(outq, event_tbl[0])) {
+                       odp_event_free(event_tbl[0]);
+                       return 0;
+               } else {
+                       return 1;
+               }
+       }
 
        return odp_queue_enq_multi(outq, event_tbl, num_pkts);
 }
diff --git a/test/performance/odp_scheduling.c 
b/test/performance/odp_scheduling.c
index 558fec8..1283986 100644
--- a/test/performance/odp_scheduling.c
+++ b/test/performance/odp_scheduling.c
@@ -114,6 +114,7 @@ static int create_queue(int thr, odp_pool_t msg_pool, int 
prio)
 
        if (odp_queue_enq(queue, odp_buffer_to_event(buf))) {
                LOG_ERR("  [%i] Queue enqueue failed.\n", thr);
+               odp_buffer_free(buf);
                return -1;
        }
 
@@ -161,6 +162,7 @@ static int create_queues(int thr, odp_pool_t msg_pool, int 
prio)
 
                if (odp_queue_enq(queue, odp_buffer_to_event(buf))) {
                        LOG_ERR("  [%i] Queue enqueue failed.\n", thr);
+                       odp_buffer_free(buf);
                        return -1;
                }
        }
@@ -294,6 +296,7 @@ static int test_poll_queue(int thr, odp_pool_t msg_pool)
 
                if (odp_queue_enq(queue, ev)) {
                        LOG_ERR("  [%i] Queue enqueue failed.\n", thr);
+                       odp_buffer_free(buf);
                        return -1;
                }
 
@@ -352,6 +355,7 @@ static int test_schedule_single(const char *str, int thr,
 
                if (odp_queue_enq(queue, ev)) {
                        LOG_ERR("  [%i] Queue enqueue failed.\n", thr);
+                       odp_event_free(ev);
                        return -1;
                }
        }
@@ -371,6 +375,7 @@ static int test_schedule_single(const char *str, int thr,
 
                if (odp_queue_enq(queue, ev)) {
                        LOG_ERR("  [%i] Queue enqueue failed.\n", thr);
+                       odp_event_free(ev);
                        return -1;
                }
        }
@@ -431,6 +436,7 @@ static int test_schedule_many(const char *str, int thr,
 
                if (odp_queue_enq(queue, ev)) {
                        LOG_ERR("  [%i] Queue enqueue failed.\n", thr);
+                       odp_event_free(ev);
                        return -1;
                }
        }
@@ -450,6 +456,7 @@ static int test_schedule_many(const char *str, int thr,
 
                if (odp_queue_enq(queue, ev)) {
                        LOG_ERR("  [%i] Queue enqueue failed.\n", thr);
+                       odp_event_free(ev);
                        return -1;
                }
        }
diff --git a/test/validation/classification/odp_classification_tests.c 
b/test/validation/classification/odp_classification_tests.c
index 441c194..ed4739d 100644
--- a/test/validation/classification/odp_classification_tests.c
+++ b/test/validation/classification/odp_classification_tests.c
@@ -109,7 +109,8 @@ void enqueue_loop_interface(odp_packet_t pkt)
        odp_queue_t defqueue = odp_pktio_outq_getdef(pktio_loop);
 
        ev = odp_packet_to_event(pkt);
-       CU_ASSERT(odp_queue_enq(defqueue, ev) == 0);
+       if (!(CU_ASSERT(odp_queue_enq(defqueue, ev) == 0)))
+               odp_packet_free(pkt);
 }
 
 static inline
diff --git a/test/validation/odp_pktio.c b/test/validation/odp_pktio.c
index 090057b..3027b25 100644
--- a/test/validation/odp_pktio.c
+++ b/test/validation/odp_pktio.c
@@ -380,6 +380,7 @@ static void pktio_txrx_multi(pktio_info_t *pktio_a, 
pktio_info_t *pktio_b,
                ret = odp_queue_enq(pktio_a->outq, tx_ev[0]);
                if (ret != 0) {
                        CU_FAIL("failed to enqueue test packet");
+                       odp_packet_free(tx_pkt[0]);
                        return;
                }
        } else {
diff --git a/test/validation/odp_queue.c b/test/validation/odp_queue.c
index 01a704c..f8c64f7 100644
--- a/test/validation/odp_queue.c
+++ b/test/validation/odp_queue.c
@@ -71,9 +71,12 @@ static void test_odp_queue_sunnyday(void)
        CU_ASSERT_FATAL(buf != ODP_BUFFER_INVALID);
        ev  = odp_buffer_to_event(buf);
 
-       odp_queue_enq(queue_id, ev);
-       CU_ASSERT_EQUAL(ev, odp_queue_deq(queue_id));
-       odp_buffer_free(buf);
+       if (!(CU_ASSERT(odp_queue_enq(queue_id, ev) == 0))) {
+               odp_buffer_free(buf);
+       } else {
+               CU_ASSERT_EQUAL(ev, odp_queue_deq(queue_id));
+               odp_buffer_free(buf);
+       }
 
        for (i = 0; i < MAX_BUFFER_QUEUE; i++) {
                odp_buffer_t buf = odp_buffer_alloc(msg_pool);
diff --git a/test/validation/odp_scheduler.c b/test/validation/odp_scheduler.c
index e4df4f2..fa03f39 100644
--- a/test/validation/odp_scheduler.c
+++ b/test/validation/odp_scheduler.c
@@ -138,7 +138,8 @@ static void test_schedule_queue_destroy(void)
                u32[0] = MAGIC;
 
                ev = odp_buffer_to_event(buf);
-               CU_ASSERT(odp_queue_enq(queue, ev) == 0);
+               if (!(CU_ASSERT(odp_queue_enq(queue, ev) == 0)))
+                       odp_buffer_free(buf);
 
                ev = odp_schedule(&from, ODP_SCHED_WAIT);
 
@@ -288,8 +289,10 @@ static void fill_queues(thread_args_t *args)
                                buf = odp_buffer_alloc(pool);
                                CU_ASSERT_FATAL(buf != ODP_BUFFER_INVALID);
                                ev = odp_buffer_to_event(buf);
-                               CU_ASSERT(odp_queue_enq(queue, ev) == 0);
-                               buf_count++;
+                               if (!(CU_ASSERT(odp_queue_enq(queue, ev) == 0)))
+                                       odp_buffer_free(buf);
+                               else
+                                       buf_count++;
                        }
                }
        }
@@ -560,7 +563,8 @@ static void test_schedule_pause_resume(void)
                buf = odp_buffer_alloc(pool);
                CU_ASSERT_FATAL(buf != ODP_BUFFER_INVALID);
                ev = odp_buffer_to_event(buf);
-               odp_queue_enq(queue, ev);
+               if (odp_queue_enq(queue, ev))
+                       odp_buffer_free(buf);
        }
 
        for (i = 0; i < NUM_BUFS_BEFORE_PAUSE; i++) {
-- 
1.9.1

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

Reply via email to