Signed-off-by: Kevin Wang <kevin.w...@arm.com>
Reviewed-by: Brian Brooks <brian.bro...@arm.com>
Reviewed-by: Honnappa Nagarahalli <honnappa.nagaraha...@arm.com>
---
 .../linux-generic/include/odp_queue_internal.h     | 65 ++++++++++++++++
 platform/linux-generic/odp_classification.c        |  4 +-
 platform/linux-generic/odp_packet_io.c             | 89 +++++++++++++---------
 platform/linux-generic/odp_queue.c                 |  2 +-
 platform/linux-generic/odp_traffic_mngr.c          |  7 +-
 5 files changed, 123 insertions(+), 44 deletions(-)

diff --git a/platform/linux-generic/include/odp_queue_internal.h 
b/platform/linux-generic/include/odp_queue_internal.h
index 560f826e..977546eb 100644
--- a/platform/linux-generic/include/odp_queue_internal.h
+++ b/platform/linux-generic/include/odp_queue_internal.h
@@ -37,6 +37,7 @@ extern "C" {
 #define QUEUE_STATUS_NOTSCHED     3
 #define QUEUE_STATUS_SCHED        4
 
+#define BUFFER_HDR_INVALID NULL
 
 /* forward declaration */
 union queue_entry_u;
@@ -94,6 +95,12 @@ int queue_deq_multi(queue_entry_t *queue, odp_buffer_hdr_t 
*buf_hdr[], int num);
 void queue_lock(queue_entry_t *queue);
 void queue_unlock(queue_entry_t *queue);
 
+int queue_pktout_enq(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr);
+int queue_pktout_enq_multi(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr[],
+                          int num);
+
+int queue_tm_reorder(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr);
+
 static inline uint32_t queue_to_id(odp_queue_t handle)
 {
        return _odp_typeval(handle) - 1;
@@ -107,6 +114,64 @@ static inline queue_entry_t *queue_to_qentry(odp_queue_t 
handle)
        return get_qentry(queue_id);
 }
 
+static inline odp_queue_t queue_get_handle(queue_entry_t *queue)
+{
+       return queue->s.handle;
+}
+
+static inline odp_pktout_queue_t queue_get_pktout(queue_entry_t *queue)
+{
+       return queue->s.pktout;
+}
+
+static inline void queue_set_pktout(queue_entry_t *queue,
+                                   odp_pktio_t pktio,
+                                   int index)
+{
+       queue->s.pktout.pktio = pktio;
+       queue->s.pktout.index = index;
+}
+
+static inline odp_pktin_queue_t queue_get_pktin(queue_entry_t *queue)
+{
+       return queue->s.pktin;
+}
+
+static inline void queue_set_pktin(queue_entry_t *queue,
+                                  odp_pktio_t pktio,
+                                  int index)
+{
+       queue->s.pktin.pktio = pktio;
+       queue->s.pktin.index = index;
+}
+
+static inline void queue_set_enq_func(queue_entry_t *queue, enq_func_t func)
+{
+       queue->s.enqueue = func;
+}
+
+static inline void queue_set_enq_multi_func(queue_entry_t *queue,
+                                           enq_multi_func_t func)
+{
+       queue->s.enqueue_multi = func;
+}
+
+static inline void queue_set_deq_func(queue_entry_t *queue, deq_func_t func)
+{
+       queue->s.dequeue = func;
+}
+
+static inline void queue_set_deq_multi_func(queue_entry_t *queue,
+                                           deq_multi_func_t func)
+{
+       queue->s.dequeue_multi = func;
+}
+
+static inline void queue_set_type(queue_entry_t *queue, odp_queue_type_t type)
+{
+       queue->s.type = type;
+}
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/platform/linux-generic/odp_classification.c 
b/platform/linux-generic/odp_classification.c
index 7ebc47d7..1ba5c41c 100644
--- a/platform/linux-generic/odp_classification.c
+++ b/platform/linux-generic/odp_classification.c
@@ -282,7 +282,7 @@ odp_queue_t odp_cos_queue(odp_cos_t cos_id)
        if (!cos->s.queue)
                return ODP_QUEUE_INVALID;
 
-       return cos->s.queue->s.handle;
+       return queue_get_handle(cos->s.queue);
 }
 
 int odp_cos_drop_set(odp_cos_t cos_id, odp_cls_drop_t drop_policy)
@@ -846,7 +846,7 @@ int cls_classify_packet(pktio_entry_t *entry, const uint8_t 
*base,
 
        *pool = cos->s.pool;
        pkt_hdr->p.input_flags.dst_queue = 1;
-       pkt_hdr->dst_queue = cos->s.queue->s.handle;
+       pkt_hdr->dst_queue = queue_get_handle(cos->s.queue);
 
        return 0;
 }
diff --git a/platform/linux-generic/odp_packet_io.c 
b/platform/linux-generic/odp_packet_io.c
index d8cae15c..3e0d6ebf 100644
--- a/platform/linux-generic/odp_packet_io.c
+++ b/platform/linux-generic/odp_packet_io.c
@@ -5,23 +5,25 @@
  */
 #include <odp_posix_extensions.h>
 
-#include <odp/api/packet_io.h>
-#include <odp_packet_io_internal.h>
-#include <odp_packet_io_queue.h>
 #include <odp/api/packet.h>
-#include <odp_packet_internal.h>
-#include <odp_internal.h>
+#include <odp/api/packet_io.h>
 #include <odp/api/spinlock.h>
 #include <odp/api/ticketlock.h>
 #include <odp/api/shared_memory.h>
-#include <odp_packet_socket.h>
+#include <odp/api/time.h>
+
+#include <odp_internal.h>
 #include <odp_config_internal.h>
-#include <odp_queue_internal.h>
-#include <odp_schedule_if.h>
-#include <odp_classification_internal.h>
 #include <odp_debug_internal.h>
+
+#include <odp_classification_internal.h>
+#include <odp_queue_internal.h>
 #include <odp_packet_io_ipc_internal.h>
-#include <odp/api/time.h>
+#include <odp_packet_io_internal.h>
+#include <odp_packet_io_queue.h>
+#include <odp_packet_internal.h>
+#include <odp_packet_socket.h>
+#include <odp_schedule_if.h>
 
 #include <string.h>
 #include <inttypes.h>
@@ -472,7 +474,6 @@ int odp_pktio_start(odp_pktio_t hdl)
                                return -1;
                        }
                }
-
                sched_fn->pktio_start(pktio_to_id(hdl), num, index);
        }
 
@@ -554,7 +555,6 @@ static inline int pktin_recv_buf(odp_pktin_queue_t queue,
        odp_packet_t packets[num];
        odp_packet_hdr_t *pkt_hdr;
        odp_buffer_hdr_t *buf_hdr;
-       odp_buffer_t buf;
        int i;
        int pkts;
        int num_rx = 0;
@@ -564,9 +564,12 @@ static inline int pktin_recv_buf(odp_pktin_queue_t queue,
        for (i = 0; i < pkts; i++) {
                pkt = packets[i];
                pkt_hdr = odp_packet_hdr(pkt);
-               buf = _odp_packet_to_buffer(pkt);
-               buf_hdr = buf_hdl_to_hdr(buf);
-
+#ifdef ODP_SCHEDULE_SCALABLE
+               buf_hdr = (odp_buffer_hdr_t *)(uintptr_t)
+                       _odp_packet_to_buffer(pkt);
+#else
+               buf_hdr = buf_hdl_to_hdr(_odp_packet_to_buffer(pkt));
+#endif
                if (pkt_hdr->p.input_flags.dst_queue) {
                        queue_entry_t *dst_queue;
                        int ret;
@@ -584,11 +587,17 @@ static inline int pktin_recv_buf(odp_pktin_queue_t queue,
 
 int pktout_enqueue(queue_entry_t *qentry, odp_buffer_hdr_t *buf_hdr)
 {
-       odp_packet_t pkt = _odp_packet_from_buffer(buf_hdr->handle.handle);
+       odp_packet_t pkt;
+
+#ifdef ODP_SCHEDULE_SCALABLE
+       pkt = _odp_packet_from_buffer((odp_buffer_t)buf_hdr);
+#else
+       pkt = _odp_packet_from_buffer(buf_hdr->handle.handle);
+#endif
        int len = 1;
        int nbr;
 
-       nbr = odp_pktout_send(qentry->s.pktout, &pkt, len);
+       nbr = odp_pktout_send(queue_get_pktout(qentry), &pkt, len);
        return (nbr == len ? 0 : -1);
 }
 
@@ -606,9 +615,13 @@ int pktout_enq_multi(queue_entry_t *qentry, 
odp_buffer_hdr_t *buf_hdr[],
        int i;
 
        for (i = 0; i < num; ++i)
+#ifdef ODP_SCHEDULE_SCALABLE
+               pkt_tbl[i] = _odp_packet_from_buffer((odp_buffer_t)buf_hdr[i]);
+#else
                pkt_tbl[i] = _odp_packet_from_buffer(buf_hdr[i]->handle.handle);
+#endif
 
-       nbr = odp_pktout_send(qentry->s.pktout, pkt_tbl, num);
+       nbr = odp_pktout_send(queue_get_pktout(qentry), pkt_tbl, num);
        return nbr;
 }
 
@@ -634,13 +647,14 @@ odp_buffer_hdr_t *pktin_dequeue(queue_entry_t *qentry)
        int pkts;
 
        buf_hdr = queue_deq(qentry);
-       if (buf_hdr != NULL)
+       if (buf_hdr != BUFFER_HDR_INVALID)
                return buf_hdr;
 
-       pkts = pktin_recv_buf(qentry->s.pktin, hdr_tbl, QUEUE_MULTI_MAX);
+       pkts = pktin_recv_buf(queue_get_pktin(qentry),
+                             hdr_tbl, QUEUE_MULTI_MAX);
 
        if (pkts <= 0)
-               return NULL;
+               return BUFFER_HDR_INVALID;
 
        if (pkts > 1)
                queue_enq_multi(qentry, &hdr_tbl[1], pkts - 1);
@@ -671,7 +685,8 @@ int pktin_deq_multi(queue_entry_t *qentry, odp_buffer_hdr_t 
*buf_hdr[], int num)
        if (nbr == num)
                return nbr;
 
-       pkts = pktin_recv_buf(qentry->s.pktin, hdr_tbl, QUEUE_MULTI_MAX);
+       pkts = pktin_recv_buf(queue_get_pktin(qentry),
+                             hdr_tbl, QUEUE_MULTI_MAX);
        if (pkts <= 0)
                return nbr;
 
@@ -686,7 +701,6 @@ int pktin_deq_multi(queue_entry_t *qentry, odp_buffer_hdr_t 
*buf_hdr[], int num)
                queue_enq_multi(qentry, hdr_tbl, j);
        return nbr;
 }
-
 int sched_cb_pktin_poll(int pktio_index, int num_queue, int index[])
 {
        odp_buffer_hdr_t *hdr_tbl[QUEUE_MULTI_MAX];
@@ -1268,13 +1282,14 @@ int odp_pktin_queue_config(odp_pktio_t pktio,
                                queue_entry_t *qentry;
 
                                qentry = queue_to_qentry(queue);
-                               qentry->s.pktin.index  = i;
-                               qentry->s.pktin.pktio  = pktio;
-
-                               qentry->s.enqueue = pktin_enqueue;
-                               qentry->s.dequeue = pktin_dequeue;
-                               qentry->s.enqueue_multi = pktin_enq_multi;
-                               qentry->s.dequeue_multi = pktin_deq_multi;
+                               queue_set_pktin(qentry, pktio, i);
+
+                               queue_set_enq_func(qentry, pktin_enqueue);
+                               queue_set_deq_func(qentry, pktin_dequeue);
+                               queue_set_enq_multi_func(qentry,
+                                                        pktin_enq_multi);
+                               queue_set_deq_multi_func(qentry,
+                                                        pktin_deq_multi);
                        }
 
                        entry->s.in_queue[i].queue = queue;
@@ -1392,14 +1407,12 @@ int odp_pktout_queue_config(odp_pktio_t pktio,
                        }
 
                        qentry = queue_to_qentry(queue);
-                       qentry->s.pktout.index  = i;
-                       qentry->s.pktout.pktio  = pktio;
-
-                       /* Override default enqueue / dequeue functions */
-                       qentry->s.enqueue       = pktout_enqueue;
-                       qentry->s.dequeue       = pktout_dequeue;
-                       qentry->s.enqueue_multi = pktout_enq_multi;
-                       qentry->s.dequeue_multi = pktout_deq_multi;
+                       queue_set_pktout(qentry, pktio, i);
+
+                       queue_set_enq_func(qentry, pktout_enqueue);
+                       queue_set_deq_func(qentry, pktout_dequeue);
+                       queue_set_enq_multi_func(qentry, pktout_enq_multi);
+                       queue_set_deq_multi_func(qentry, pktout_deq_multi);
 
                        entry->s.out_queue[i].queue = queue;
                }
diff --git a/platform/linux-generic/odp_queue.c 
b/platform/linux-generic/odp_queue.c
index 1114c95c..75847aca 100644
--- a/platform/linux-generic/odp_queue.c
+++ b/platform/linux-generic/odp_queue.c
@@ -293,11 +293,11 @@ void sched_cb_queue_destroy_finalize(uint32_t queue_index)
 int odp_queue_destroy(odp_queue_t handle)
 {
        queue_entry_t *queue;
-       queue = queue_to_qentry(handle);
 
        if (handle == ODP_QUEUE_INVALID)
                return -1;
 
+       queue = queue_to_qentry(handle);
        LOCK(&queue->s.lock);
        if (queue->s.status == QUEUE_STATUS_FREE) {
                UNLOCK(&queue->s.lock);
diff --git a/platform/linux-generic/odp_traffic_mngr.c 
b/platform/linux-generic/odp_traffic_mngr.c
index 4e9358b9..3244dfe3 100644
--- a/platform/linux-generic/odp_traffic_mngr.c
+++ b/platform/linux-generic/odp_traffic_mngr.c
@@ -3918,9 +3918,10 @@ odp_tm_queue_t odp_tm_queue_create(odp_tm_t odp_tm,
        tm_queue_obj->pkt = ODP_PACKET_INVALID;
        odp_ticketlock_init(&tm_wred_node->tm_wred_node_lock);
 
-       tm_queue_obj->tm_qentry.s.type = QUEUE_TYPE_TM;
-       tm_queue_obj->tm_qentry.s.enqueue = queue_tm_reenq;
-       tm_queue_obj->tm_qentry.s.enqueue_multi = queue_tm_reenq_multi;
+       queue_set_type(&tm_queue_obj->tm_qentry, QUEUE_TYPE_TM);
+       queue_set_enq_func(&tm_queue_obj->tm_qentry, queue_tm_reenq);
+       queue_set_enq_multi_func(&tm_queue_obj->tm_qentry,
+                                queue_tm_reenq_multi);
 
        tm_system->queue_num_tbl[tm_queue_obj->queue_num - 1] = tm_queue_obj;
        odp_ticketlock_lock(&tm_system->tm_system_lock);
-- 
2.12.2

Reply via email to