From: Joyce Kong <[email protected]>

Signed-off-by: Joyce Kong <[email protected]>
Reviewed-by: Yi He <[email protected]>
Reviewed-by: Kevin Wang <[email protected]>
Reviewed-by: Honnappa Nagarahalli <[email protected]>
Reviewed-by: Brian Brooks <[email protected]>
---
/** Email created from pull request 168 (JoyceKong-arm:cloud-dev-queue)
 ** https://github.com/Linaro/odp/pull/168
 ** Patch: https://github.com/Linaro/odp/pull/168.patch
 ** Base sha: d3fe76f2af39af17a3661b866a442878abc31ddc
 ** Merge commit sha: 4e6dfadf1ad71a08717776a3508763055a2443f2
 **/
 platform/linux-generic/Makefile.am                 |  10 +-
 platform/linux-generic/include/odp_internal.h      |   2 +
 platform/linux-generic/include/odp_queue_if.h      |  34 ---
 .../linux-generic/include/odp_queue_subsystem.h    |   1 +
 platform/linux-generic/odp_init.c                  |   8 +-
 platform/linux-generic/odp_queue_if.c              |  98 +-------
 .../linux-generic/{odp_queue.c => queue/generic.c} | 112 +++++----
 .../{odp_queue_scalable.c => queue/scalable.c}     | 113 +++++-----
 platform/linux-generic/queue/subsystem.c           | 250 ++++++++++++++++++++-
 9 files changed, 391 insertions(+), 237 deletions(-)
 rename platform/linux-generic/{odp_queue.c => queue/generic.c} (85%)
 rename platform/linux-generic/{odp_queue_scalable.c => queue/scalable.c} (89%)

diff --git a/platform/linux-generic/Makefile.am 
b/platform/linux-generic/Makefile.am
index 2057d64c..e022c65b 100644
--- a/platform/linux-generic/Makefile.am
+++ b/platform/linux-generic/Makefile.am
@@ -276,10 +276,10 @@ __LIB__libodp_linux_la_SOURCES = \
                           pool/generic.c \
                           pool/subsystem.c \
                           odp_pkt_queue.c \
-                          odp_queue.c \
                           odp_queue_if.c \
                           queue/subsystem.c \
-                          odp_queue_scalable.c \
+                          queue/generic.c \
+                          queue/scalable.c \
                           odp_rwlock.c \
                           odp_rwlock_recursive.c \
                           odp_schedule.c \
@@ -335,6 +335,12 @@ endif
 pool/generic.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE
 buffer/generic.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE
 
+if ODP_SCHEDULE_SCALABLE
+queue/scalable.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE
+else
+queue/generic.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE
+endif
+
 # Build modular framework into odp-linux library
 modularframeworkdir = $(top_srcdir)/frameworks/modular
 noinst_HEADERS += $(modularframeworkdir)/list.h \
diff --git a/platform/linux-generic/include/odp_internal.h 
b/platform/linux-generic/include/odp_internal.h
index bb70bd72..d4e9ad1b 100644
--- a/platform/linux-generic/include/odp_internal.h
+++ b/platform/linux-generic/include/odp_internal.h
@@ -109,6 +109,8 @@ int odp_classification_term_global(void);
 
 int odp_queue_init_global(void);
 int odp_queue_term_global(void);
+int odp_queue_init_local(void);
+int odp_queue_term_local(void);
 
 int odp_crypto_init_global(void);
 int odp_crypto_term_global(void);
diff --git a/platform/linux-generic/include/odp_queue_if.h 
b/platform/linux-generic/include/odp_queue_if.h
index 410c6b79..a5f01af7 100644
--- a/platform/linux-generic/include/odp_queue_if.h
+++ b/platform/linux-generic/include/odp_queue_if.h
@@ -18,42 +18,12 @@ extern "C" {
 
 #define QUEUE_MULTI_MAX CONFIG_BURST_SIZE
 
-/* Queue API functions */
-typedef struct {
-       odp_queue_t (*queue_create)(const char *name,
-                                   const odp_queue_param_t *param);
-       int (*queue_destroy)(odp_queue_t queue);
-       odp_queue_t (*queue_lookup)(const char *name);
-       int (*queue_capability)(odp_queue_capability_t *capa);
-       int (*queue_context_set)(odp_queue_t queue, void *context,
-                                uint32_t len);
-       void *(*queue_context)(odp_queue_t queue);
-       int (*queue_enq)(odp_queue_t queue, odp_event_t ev);
-       int (*queue_enq_multi)(odp_queue_t queue, const odp_event_t events[],
-                              int num);
-       odp_event_t (*queue_deq)(odp_queue_t queue);
-       int (*queue_deq_multi)(odp_queue_t queue, odp_event_t events[],
-                              int num);
-       odp_queue_type_t (*queue_type)(odp_queue_t queue);
-       odp_schedule_sync_t (*queue_sched_type)(odp_queue_t queue);
-       odp_schedule_prio_t (*queue_sched_prio)(odp_queue_t queue);
-       odp_schedule_group_t (*queue_sched_group)(odp_queue_t queue);
-       int (*queue_lock_count)(odp_queue_t queue);
-       uint64_t (*queue_to_u64)(odp_queue_t hdl);
-       void (*queue_param_init)(odp_queue_param_t *param);
-       int (*queue_info)(odp_queue_t queue, odp_queue_info_t *info);
-} queue_api_t;
-
 /* Internal abstract queue handle */
 typedef struct { char dummy; } _queue_t;
 typedef _queue_t *queue_t;
 
 #define QUEUE_NULL ((queue_t)NULL)
 
-typedef int (*queue_init_global_fn_t)(void);
-typedef int (*queue_term_global_fn_t)(void);
-typedef int (*queue_init_local_fn_t)(void);
-typedef int (*queue_term_local_fn_t)(void);
 typedef queue_t (*queue_from_ext_fn_t)(odp_queue_t handle);
 typedef odp_queue_t (*queue_to_ext_fn_t)(queue_t q_int);
 typedef int (*queue_enq_fn_t)(queue_t q_int, odp_buffer_hdr_t *);
@@ -74,10 +44,6 @@ typedef void (*queue_set_enq_deq_fn_t)(queue_t q_int,
 
 /* Queue functions towards other internal components */
 typedef struct {
-       queue_init_global_fn_t init_global;
-       queue_term_global_fn_t term_global;
-       queue_init_local_fn_t init_local;
-       queue_term_local_fn_t term_local;
        queue_from_ext_fn_t from_ext;
        queue_to_ext_fn_t to_ext;
        queue_enq_fn_t enq;
diff --git a/platform/linux-generic/include/odp_queue_subsystem.h 
b/platform/linux-generic/include/odp_queue_subsystem.h
index c63309fa..2c62af37 100644
--- a/platform/linux-generic/include/odp_queue_subsystem.h
+++ b/platform/linux-generic/include/odp_queue_subsystem.h
@@ -5,6 +5,7 @@
  *
  * SPDX-License-Identifier:    BSD-3-Clause
  */
+
 #ifndef ODP_QUEUE_SUBSYSTEM_H
 #define ODP_QUEUE_SUBSYSTEM_H
 
diff --git a/platform/linux-generic/odp_init.c 
b/platform/linux-generic/odp_init.c
index 0d5ee710..854bc340 100644
--- a/platform/linux-generic/odp_init.c
+++ b/platform/linux-generic/odp_init.c
@@ -172,7 +172,7 @@ int odp_init_global(odp_instance_t *instance,
        }
        stage = POOL_INIT;
 
-       if (queue_fn->init_global()) {
+       if (odp_queue_init_global()) {
                ODP_ERR("ODP queue init failed.\n");
                goto init_failed;
        }
@@ -313,7 +313,7 @@ int _odp_term_global(enum init_stage stage)
                /* Fall through */
 
        case QUEUE_INIT:
-               if (queue_fn->term_global()) {
+               if (odp_queue_term_global()) {
                        ODP_ERR("ODP queue term failed.\n");
                        rc = -1;
                }
@@ -408,7 +408,7 @@ int odp_init_local(odp_instance_t instance, 
odp_thread_type_t thr_type)
        }
        stage = POOL_INIT;
 
-       if (queue_fn->init_local()) {
+       if (odp_queue_init_local()) {
                ODP_ERR("ODP queue local init failed.\n");
                goto init_fail;
        }
@@ -454,7 +454,7 @@ int _odp_term_local(enum init_stage stage)
                /* Fall through */
 
        case QUEUE_INIT:
-               if (queue_fn->term_local()) {
+               if (odp_queue_term_local()) {
                        ODP_ERR("ODP queue local term failed.\n");
                        rc = -1;
                }
diff --git a/platform/linux-generic/odp_queue_if.c 
b/platform/linux-generic/odp_queue_if.c
index d7471dfc..f77405a9 100644
--- a/platform/linux-generic/odp_queue_if.c
+++ b/platform/linux-generic/odp_queue_if.c
@@ -1,111 +1,15 @@
 /* Copyright (c) 2017, ARM Limited
  * All rights reserved.
  *
- * SPDX-License-Identifier:     BSD-3-Clause
+ * SPDX-License-Identifier:    BSD-3-Clause
  */
-
 #include <odp_queue_if.h>
 
-extern const queue_api_t queue_scalable_api;
 extern const queue_fn_t queue_scalable_fn;
-
-extern const queue_api_t queue_default_api;
 extern const queue_fn_t queue_default_fn;
 
 #ifdef ODP_SCHEDULE_SCALABLE
-const queue_api_t *queue_api = &queue_scalable_api;
 const queue_fn_t *queue_fn = &queue_scalable_fn;
 #else
-const queue_api_t *queue_api = &queue_default_api;
 const queue_fn_t *queue_fn = &queue_default_fn;
 #endif
-
-odp_queue_t odp_queue_create(const char *name, const odp_queue_param_t *param)
-{
-       return queue_api->queue_create(name, param);
-}
-
-int odp_queue_destroy(odp_queue_t queue)
-{
-       return queue_api->queue_destroy(queue);
-}
-
-odp_queue_t odp_queue_lookup(const char *name)
-{
-       return queue_api->queue_lookup(name);
-}
-
-int odp_queue_capability(odp_queue_capability_t *capa)
-{
-       return queue_api->queue_capability(capa);
-}
-
-int odp_queue_context_set(odp_queue_t queue, void *context, uint32_t len)
-{
-       return queue_api->queue_context_set(queue, context, len);
-}
-
-void *odp_queue_context(odp_queue_t queue)
-{
-       return queue_api->queue_context(queue);
-}
-
-int odp_queue_enq(odp_queue_t queue, odp_event_t ev)
-{
-       return queue_api->queue_enq(queue, ev);
-}
-
-int odp_queue_enq_multi(odp_queue_t queue, const odp_event_t events[], int num)
-{
-       return queue_api->queue_enq_multi(queue, events, num);
-}
-
-odp_event_t odp_queue_deq(odp_queue_t queue)
-{
-       return queue_api->queue_deq(queue);
-}
-
-int odp_queue_deq_multi(odp_queue_t queue, odp_event_t events[], int num)
-{
-       return queue_api->queue_deq_multi(queue, events, num);
-}
-
-odp_queue_type_t odp_queue_type(odp_queue_t queue)
-{
-       return queue_api->queue_type(queue);
-}
-
-odp_schedule_sync_t odp_queue_sched_type(odp_queue_t queue)
-{
-       return queue_api->queue_sched_type(queue);
-}
-
-odp_schedule_prio_t odp_queue_sched_prio(odp_queue_t queue)
-{
-       return queue_api->queue_sched_prio(queue);
-}
-
-odp_schedule_group_t odp_queue_sched_group(odp_queue_t queue)
-{
-       return queue_api->queue_sched_group(queue);
-}
-
-int odp_queue_lock_count(odp_queue_t queue)
-{
-       return queue_api->queue_lock_count(queue);
-}
-
-uint64_t odp_queue_to_u64(odp_queue_t hdl)
-{
-       return queue_api->queue_to_u64(hdl);
-}
-
-void odp_queue_param_init(odp_queue_param_t *param)
-{
-       return queue_api->queue_param_init(param);
-}
-
-int odp_queue_info(odp_queue_t queue, odp_queue_info_t *info)
-{
-       return queue_api->queue_info(queue, info);
-}
diff --git a/platform/linux-generic/odp_queue.c 
b/platform/linux-generic/queue/generic.c
similarity index 85%
rename from platform/linux-generic/odp_queue.c
rename to platform/linux-generic/queue/generic.c
index 7ad346ad..3fd35ba7 100644
--- a/platform/linux-generic/odp_queue.c
+++ b/platform/linux-generic/queue/generic.c
@@ -1,12 +1,13 @@
 /* Copyright (c) 2013, Linaro Limited
  * All rights reserved.
  *
- * SPDX-License-Identifier:     BSD-3-Clause
+ * SPDX-License-Identifier:    BSD-3-Clause
  */
 
 #include <odp/api/queue.h>
 #include <odp_queue_internal.h>
 #include <odp_queue_if.h>
+#include <odp_queue_subsystem.h>
 #include <odp/api/std_types.h>
 #include <odp/api/align.h>
 #include <odp/api/buffer.h>
@@ -65,7 +66,7 @@ queue_entry_t *get_qentry(uint32_t queue_id)
        return &queue_tbl->queue[queue_id];
 }
 
-static int queue_init_global(void)
+static int generic_queue_init_global(void)
 {
        uint32_t i;
        odp_shm_t shm;
@@ -86,6 +87,7 @@ static int queue_init_global(void)
        for (i = 0; i < ODP_CONFIG_QUEUES; i++) {
                /* init locks */
                queue_entry_t *queue = get_qentry(i);
+
                LOCK_INIT(&queue->s.lock);
                queue->s.index  = i;
                queue->s.handle = queue_from_id(i);
@@ -102,17 +104,17 @@ static int queue_init_global(void)
        return 0;
 }
 
-static int queue_init_local(void)
+static int generic_queue_init_local(void)
 {
        return 0;
 }
 
-static int queue_term_local(void)
+static int generic_queue_term_local(void)
 {
        return 0;
 }
 
-static int queue_term_global(void)
+static int generic_queue_term_global(void)
 {
        int ret = 0;
        int rc = 0;
@@ -138,7 +140,7 @@ static int queue_term_global(void)
        return rc;
 }
 
-static int queue_capability(odp_queue_capability_t *capa)
+static int generic_queue_capability(odp_queue_capability_t *capa)
 {
        memset(capa, 0, sizeof(odp_queue_capability_t));
 
@@ -153,27 +155,27 @@ static int queue_capability(odp_queue_capability_t *capa)
        return 0;
 }
 
-static odp_queue_type_t queue_type(odp_queue_t handle)
+static odp_queue_type_t generic_queue_type(odp_queue_t handle)
 {
        return handle_to_qentry(handle)->s.type;
 }
 
-static odp_schedule_sync_t queue_sched_type(odp_queue_t handle)
+static odp_schedule_sync_t generic_queue_sched_type(odp_queue_t handle)
 {
        return handle_to_qentry(handle)->s.param.sched.sync;
 }
 
-static odp_schedule_prio_t queue_sched_prio(odp_queue_t handle)
+static odp_schedule_prio_t generic_queue_sched_prio(odp_queue_t handle)
 {
        return handle_to_qentry(handle)->s.param.sched.prio;
 }
 
-static odp_schedule_group_t queue_sched_group(odp_queue_t handle)
+static odp_schedule_group_t generic_queue_sched_group(odp_queue_t handle)
 {
        return handle_to_qentry(handle)->s.param.sched.group;
 }
 
-static int queue_lock_count(odp_queue_t handle)
+static int generic_queue_lock_count(odp_queue_t handle)
 {
        queue_entry_t *queue = handle_to_qentry(handle);
 
@@ -181,8 +183,8 @@ static int queue_lock_count(odp_queue_t handle)
                (int)queue->s.param.sched.lock_count : -1;
 }
 
-static odp_queue_t queue_create(const char *name,
-                               const odp_queue_param_t *param)
+static odp_queue_t generic_queue_create(const char *name,
+                                       const odp_queue_param_t *param)
 {
        uint32_t i;
        queue_entry_t *queue;
@@ -247,9 +249,10 @@ void sched_cb_queue_destroy_finalize(uint32_t queue_index)
        UNLOCK(&queue->s.lock);
 }
 
-static int queue_destroy(odp_queue_t handle)
+static int generic_queue_destroy(odp_queue_t handle)
 {
        queue_entry_t *queue;
+
        queue = handle_to_qentry(handle);
 
        if (handle == ODP_QUEUE_INVALID)
@@ -292,8 +295,8 @@ static int queue_destroy(odp_queue_t handle)
        return 0;
 }
 
-static int queue_context_set(odp_queue_t handle, void *context,
-                            uint32_t len ODP_UNUSED)
+static int generic_queue_context_set(odp_queue_t handle, void *context,
+                                    uint32_t len ODP_UNUSED)
 {
        odp_mb_full();
        handle_to_qentry(handle)->s.param.context = context;
@@ -301,12 +304,12 @@ static int queue_context_set(odp_queue_t handle, void 
*context,
        return 0;
 }
 
-static void *queue_context(odp_queue_t handle)
+static void *generic_queue_context(odp_queue_t handle)
 {
        return handle_to_qentry(handle)->s.param.context;
 }
 
-static odp_queue_t queue_lookup(const char *name)
+static odp_queue_t generic_queue_lookup(const char *name)
 {
        uint32_t i;
 
@@ -424,7 +427,8 @@ static int queue_int_enq(queue_t q_int, odp_buffer_hdr_t 
*buf_hdr)
                return -1;
 }
 
-static int queue_enq_multi(odp_queue_t handle, const odp_event_t ev[], int num)
+static int generic_queue_enq_multi(odp_queue_t handle,
+                                  const odp_event_t ev[], int num)
 {
        queue_entry_t *queue = handle_to_qentry(handle);
 
@@ -438,7 +442,7 @@ static int queue_enq_multi(odp_queue_t handle, const 
odp_event_t ev[], int num)
                                      (odp_buffer_hdr_t **)(uintptr_t)ev, num);
 }
 
-static int queue_enq(odp_queue_t handle, odp_event_t ev)
+static int generic_queue_enq(odp_queue_t handle, odp_event_t ev)
 {
        queue_entry_t *queue = handle_to_qentry(handle);
 
@@ -543,7 +547,8 @@ static odp_buffer_hdr_t *queue_int_deq(queue_t q_int)
                return NULL;
 }
 
-static int queue_deq_multi(odp_queue_t handle, odp_event_t ev[], int num)
+static int generic_queue_deq_multi(odp_queue_t handle, odp_event_t ev[],
+                                  int num)
 {
        queue_entry_t *queue = handle_to_qentry(handle);
 
@@ -554,7 +559,7 @@ static int queue_deq_multi(odp_queue_t handle, odp_event_t 
ev[], int num)
                                      (odp_buffer_hdr_t **)ev, num);
 }
 
-static odp_event_t queue_deq(odp_queue_t handle)
+static odp_event_t generic_queue_deq(odp_queue_t handle)
 {
        queue_entry_t *queue = handle_to_qentry(handle);
 
@@ -593,7 +598,7 @@ static int queue_init(queue_entry_t *queue, const char 
*name,
        return 0;
 }
 
-static void queue_param_init(odp_queue_param_t *params)
+static void generic_queue_param_init(odp_queue_param_t *params)
 {
        memset(params, 0, sizeof(odp_queue_param_t));
        params->type = ODP_QUEUE_TYPE_PLAIN;
@@ -604,7 +609,7 @@ static void queue_param_init(odp_queue_param_t *params)
        params->sched.group = ODP_SCHED_GROUP_ALL;
 }
 
-static int queue_info(odp_queue_t handle, odp_queue_info_t *info)
+static int generic_queue_info(odp_queue_t handle, odp_queue_info_t *info)
 {
        uint32_t queue_id;
        queue_entry_t *queue;
@@ -681,7 +686,7 @@ int sched_cb_queue_empty(uint32_t queue_index)
        return ret;
 }
 
-static uint64_t queue_to_u64(odp_queue_t hdl)
+static uint64_t generic_queue_to_u64(odp_queue_t hdl)
 {
        return _odp_pri(hdl);
 }
@@ -744,33 +749,42 @@ static odp_queue_t queue_to_ext(queue_t q_int)
 }
 
 /* API functions */
-queue_api_t queue_default_api = {
-       .queue_create = queue_create,
-       .queue_destroy = queue_destroy,
-       .queue_lookup = queue_lookup,
-       .queue_capability = queue_capability,
-       .queue_context_set = queue_context_set,
-       .queue_context = queue_context,
-       .queue_enq = queue_enq,
-       .queue_enq_multi = queue_enq_multi,
-       .queue_deq = queue_deq,
-       .queue_deq_multi = queue_deq_multi,
-       .queue_type = queue_type,
-       .queue_sched_type = queue_sched_type,
-       .queue_sched_prio = queue_sched_prio,
-       .queue_sched_group = queue_sched_group,
-       .queue_lock_count = queue_lock_count,
-       .queue_to_u64 = queue_to_u64,
-       .queue_param_init = queue_param_init,
-       .queue_info = queue_info
+odp_queue_module_t generic_queue = {
+       .base = {
+               .name = "generic_queue",
+               .init_global = generic_queue_init_global,
+               .term_global = generic_queue_term_global,
+               .init_local = generic_queue_init_local,
+               .term_local = generic_queue_term_local,
+       },
+       .create = generic_queue_create,
+       .destroy = generic_queue_destroy,
+       .lookup = generic_queue_lookup,
+       .capability = generic_queue_capability,
+       .context_set = generic_queue_context_set,
+       .context = generic_queue_context,
+       .enq = generic_queue_enq,
+       .enq_multi = generic_queue_enq_multi,
+       .deq = generic_queue_deq,
+       .deq_multi = generic_queue_deq_multi,
+       .type = generic_queue_type,
+       .sched_type = generic_queue_sched_type,
+       .sched_prio = generic_queue_sched_prio,
+       .sched_group = generic_queue_sched_group,
+       .lock_count = generic_queue_lock_count,
+       .to_u64 = generic_queue_to_u64,
+       .param_init = generic_queue_param_init,
+       .info = generic_queue_info,
 };
 
+ODP_MODULE_CONSTRUCTOR(generic_queue)
+{
+       odp_module_constructor(&generic_queue);
+       odp_subsystem_register_module(queue, &generic_queue);
+}
+
 /* Functions towards internal components */
 queue_fn_t queue_default_fn = {
-       .init_global = queue_init_global,
-       .term_global = queue_term_global,
-       .init_local = queue_init_local,
-       .term_local = queue_term_local,
        .from_ext = queue_from_ext,
        .to_ext = queue_to_ext,
        .enq = queue_int_enq,
@@ -781,5 +795,5 @@ queue_fn_t queue_default_fn = {
        .set_pktout = queue_set_pktout,
        .get_pktin = queue_get_pktin,
        .set_pktin = queue_set_pktin,
-       .set_enq_deq_fn = queue_set_enq_deq_func
+       .set_enq_deq_fn = queue_set_enq_deq_func,
 };
diff --git a/platform/linux-generic/odp_queue_scalable.c 
b/platform/linux-generic/queue/scalable.c
similarity index 89%
rename from platform/linux-generic/odp_queue_scalable.c
rename to platform/linux-generic/queue/scalable.c
index 503b40f5..020b790d 100644
--- a/platform/linux-generic/odp_queue_scalable.c
+++ b/platform/linux-generic/queue/scalable.c
@@ -3,7 +3,7 @@
  * Copyright (c) 2017, Linaro Limited
  * All rights reserved.
  *
- * SPDX-License-Identifier: BSD-3-Clause
+ * SPDX-License-Identifier:    BSD-3-Clause
  */
 
 #include <odp/api/hints.h>
@@ -22,6 +22,7 @@
 #include <odp_packet_io_internal.h>
 #include <odp_pool_internal.h>
 #include <odp_queue_scalable_internal.h>
+#include <odp_queue_subsystem.h>
 #include <odp_schedule_if.h>
 #include <_ishm_internal.h>
 #include <_ishmpool_internal.h>
@@ -182,7 +183,7 @@ static int queue_init(queue_entry_t *queue, const char 
*name,
        return -1;
 }
 
-static int queue_init_global(void)
+static int scalable_queue_init_global(void)
 {
        uint32_t i;
        uint64_t pool_size;
@@ -258,7 +259,7 @@ static int queue_init_global(void)
        return -1;
 }
 
-static int queue_term_global(void)
+static int scalable_queue_term_global(void)
 {
        int ret = 0;
        int rc = 0;
@@ -285,17 +286,17 @@ static int queue_term_global(void)
        return rc;
 }
 
-static int queue_init_local(void)
+static int scalable_queue_init_local(void)
 {
        return 0;
 }
 
-static int queue_term_local(void)
+static int scalable_queue_term_local(void)
 {
        return 0;
 }
 
-static int queue_capability(odp_queue_capability_t *capa)
+static int scalable_queue_capability(odp_queue_capability_t *capa)
 {
        memset(capa, 0, sizeof(odp_queue_capability_t));
 
@@ -312,27 +313,27 @@ static int queue_capability(odp_queue_capability_t *capa)
        return 0;
 }
 
-static odp_queue_type_t queue_type(odp_queue_t handle)
+static odp_queue_type_t scalable_queue_type(odp_queue_t handle)
 {
        return qentry_from_int(queue_from_ext(handle))->s.type;
 }
 
-static odp_schedule_sync_t queue_sched_type(odp_queue_t handle)
+static odp_schedule_sync_t scalable_queue_sched_type(odp_queue_t handle)
 {
        return qentry_from_int(queue_from_ext(handle))->s.param.sched.sync;
 }
 
-static odp_schedule_prio_t queue_sched_prio(odp_queue_t handle)
+static odp_schedule_prio_t scalable_queue_sched_prio(odp_queue_t handle)
 {
        return qentry_from_int(queue_from_ext(handle))->s.param.sched.prio;
 }
 
-static odp_schedule_group_t queue_sched_group(odp_queue_t handle)
+static odp_schedule_group_t scalable_queue_sched_group(odp_queue_t handle)
 {
        return qentry_from_int(queue_from_ext(handle))->s.param.sched.group;
 }
 
-static int queue_lock_count(odp_queue_t handle)
+static int scalable_queue_lock_count(odp_queue_t handle)
 {
        queue_entry_t *queue = qentry_from_int(queue_from_ext(handle));
 
@@ -340,8 +341,8 @@ static int queue_lock_count(odp_queue_t handle)
                (int)queue->s.param.sched.lock_count : -1;
 }
 
-static odp_queue_t queue_create(const char *name,
-                               const odp_queue_param_t *param)
+static odp_queue_t scalable_queue_create(const char *name,
+                                        const odp_queue_param_t *param)
 {
        int queue_idx;
        odp_queue_t handle = ODP_QUEUE_INVALID;
@@ -375,7 +376,7 @@ static odp_queue_t queue_create(const char *name,
        return handle;
 }
 
-static int queue_destroy(odp_queue_t handle)
+static int scalable_queue_destroy(odp_queue_t handle)
 {
        queue_entry_t *queue;
        sched_elem_t *q;
@@ -451,8 +452,8 @@ static int queue_destroy(odp_queue_t handle)
        return 0;
 }
 
-static int queue_context_set(odp_queue_t handle, void *context,
-                            uint32_t len ODP_UNUSED)
+static int scalable_queue_context_set(odp_queue_t handle, void *context,
+                                     uint32_t len ODP_UNUSED)
 {
        odp_mb_full();
        qentry_from_int(queue_from_ext(handle))->s.param.context = context;
@@ -460,12 +461,12 @@ static int queue_context_set(odp_queue_t handle, void 
*context,
        return 0;
 }
 
-static void *queue_context(odp_queue_t handle)
+static void *scalable_queue_context(odp_queue_t handle)
 {
        return qentry_from_int(queue_from_ext(handle))->s.param.context;
 }
 
-static odp_queue_t queue_lookup(const char *name)
+static odp_queue_t scalable_queue_lookup(const char *name)
 {
        uint32_t i;
 
@@ -645,7 +646,8 @@ static int _queue_enq(queue_t handle, odp_buffer_hdr_t 
*buf_hdr)
                _queue_enq_multi(handle, &buf_hdr, 1) == 1) ? 0 : -1;
 }
 
-static int queue_enq_multi(odp_queue_t handle, const odp_event_t ev[], int num)
+static int scalable_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;
@@ -662,7 +664,7 @@ static int queue_enq_multi(odp_queue_t handle, const 
odp_event_t ev[], int num)
        return queue->s.enqueue_multi(qentry_to_int(queue), buf_hdr, num);
 }
 
-static int queue_enq(odp_queue_t handle, odp_event_t ev)
+static int scalable_queue_enq(odp_queue_t handle, odp_event_t ev)
 {
        odp_buffer_hdr_t *buf_hdr;
        queue_entry_t *queue;
@@ -827,7 +829,8 @@ static odp_buffer_hdr_t *_queue_deq(queue_t handle)
                return NULL;
 }
 
-static int queue_deq_multi(odp_queue_t handle, odp_event_t ev[], int num)
+static int scalable_queue_deq_multi(odp_queue_t handle, odp_event_t ev[],
+                                   int num)
 {
        queue_entry_t *queue;
 
@@ -835,10 +838,11 @@ static int queue_deq_multi(odp_queue_t handle, 
odp_event_t ev[], int num)
                num = QUEUE_MULTI_MAX;
 
        queue = qentry_from_int(queue_from_ext(handle));
-       return queue->s.dequeue_multi(qentry_to_int(queue), (odp_buffer_hdr_t 
**)ev, num);
+       return queue->s.dequeue_multi(qentry_to_int(queue),
+                                     (odp_buffer_hdr_t **)ev, num);
 }
 
-static odp_event_t queue_deq(odp_queue_t handle)
+static odp_event_t scalable_queue_deq(odp_queue_t handle)
 {
        queue_entry_t *queue;
 
@@ -846,7 +850,7 @@ static odp_event_t queue_deq(odp_queue_t handle)
        return (odp_event_t)queue->s.dequeue(qentry_to_int(queue));
 }
 
-static void queue_param_init(odp_queue_param_t *params)
+static void scalable_queue_param_init(odp_queue_param_t *params)
 {
        memset(params, 0, sizeof(odp_queue_param_t));
        params->type = ODP_QUEUE_TYPE_PLAIN;
@@ -857,7 +861,7 @@ static void queue_param_init(odp_queue_param_t *params)
        params->sched.group = ODP_SCHED_GROUP_ALL;
 }
 
-static int queue_info(odp_queue_t handle, odp_queue_info_t *info)
+static int scalable_queue_info(odp_queue_t handle, odp_queue_info_t *info)
 {
        uint32_t queue_id;
        queue_entry_t *queue;
@@ -896,7 +900,7 @@ static int queue_info(odp_queue_t handle, odp_queue_info_t 
*info)
        return 0;
 }
 
-static uint64_t queue_to_u64(odp_queue_t hdl)
+static uint64_t scalable_queue_to_u64(odp_queue_t hdl)
 {
        return _odp_pri(hdl);
 }
@@ -956,33 +960,42 @@ static odp_queue_t queue_to_ext(queue_t handle)
 }
 
 /* API functions */
-queue_api_t queue_scalable_api = {
-       .queue_create = queue_create,
-       .queue_destroy = queue_destroy,
-       .queue_lookup = queue_lookup,
-       .queue_capability = queue_capability,
-       .queue_context_set = queue_context_set,
-       .queue_context = queue_context,
-       .queue_enq = queue_enq,
-       .queue_enq_multi = queue_enq_multi,
-       .queue_deq = queue_deq,
-       .queue_deq_multi = queue_deq_multi,
-       .queue_type = queue_type,
-       .queue_sched_type = queue_sched_type,
-       .queue_sched_prio = queue_sched_prio,
-       .queue_sched_group = queue_sched_group,
-       .queue_lock_count = queue_lock_count,
-       .queue_to_u64 = queue_to_u64,
-       .queue_param_init = queue_param_init,
-       .queue_info = queue_info
+odp_queue_module_t scalable_queue = {
+       .base = {
+               .name = "scalable_queue",
+               .init_global = scalable_queue_init_global,
+               .term_global = scalable_queue_term_global,
+               .init_local = scalable_queue_init_local,
+               .term_local = scalable_queue_term_local,
+       },
+       .create = scalable_queue_create,
+       .destroy = scalable_queue_destroy,
+       .lookup = scalable_queue_lookup,
+       .capability = scalable_queue_capability,
+       .context_set = scalable_queue_context_set,
+       .context = scalable_queue_context,
+       .enq = scalable_queue_enq,
+       .enq_multi = scalable_queue_enq_multi,
+       .deq = scalable_queue_deq,
+       .deq_multi = scalable_queue_deq_multi,
+       .type = scalable_queue_type,
+       .sched_type = scalable_queue_sched_type,
+       .sched_prio = scalable_queue_sched_prio,
+       .sched_group = scalable_queue_sched_group,
+       .lock_count = scalable_queue_lock_count,
+       .to_u64 = scalable_queue_to_u64,
+       .param_init = scalable_queue_param_init,
+       .info = scalable_queue_info,
 };
 
+ODP_MODULE_CONSTRUCTOR(scalable_queue)
+{
+       odp_module_constructor(&scalable_queue);
+       odp_subsystem_register_module(queue, &scalable_queue);
+}
+
 /* Functions towards internal components */
 queue_fn_t queue_scalable_fn = {
-       .init_global = queue_init_global,
-       .term_global = queue_term_global,
-       .init_local = queue_init_local,
-       .term_local = queue_term_local,
        .from_ext = queue_from_ext,
        .to_ext = queue_to_ext,
        .enq = _queue_enq,
@@ -993,5 +1006,5 @@ queue_fn_t queue_scalable_fn = {
        .set_pktout = queue_set_pktout,
        .get_pktin = queue_get_pktin,
        .set_pktin = queue_set_pktin,
-       .set_enq_deq_fn = queue_set_enq_deq_func
+       .set_enq_deq_fn = queue_set_enq_deq_func,
 };
diff --git a/platform/linux-generic/queue/subsystem.c 
b/platform/linux-generic/queue/subsystem.c
index d4707f0f..e4c66a2b 100644
--- a/platform/linux-generic/queue/subsystem.c
+++ b/platform/linux-generic/queue/subsystem.c
@@ -5,8 +5,11 @@
  *
  * SPDX-License-Identifier:    BSD-3-Clause
  */
-#include <odp_module.h>
+#include <odp/api/queue.h>
+#include <odp_internal.h>
+#include <odp_debug_internal.h>
 #include <odp_queue_subsystem.h>
+#include <odp_module.h>
 
 ODP_SUBSYSTEM_DEFINE(queue, "queue public APIs", QUEUE_SUBSYSTEM_VERSION);
 
@@ -14,3 +17,248 @@ ODP_SUBSYSTEM_CONSTRUCTOR(queue)
 {
        odp_subsystem_constructor(queue);
 }
+
+int odp_queue_init_global(void)
+{
+       odp_queue_module_t *mod =
+               odp_subsystem_active_module(queue, mod);
+
+       ODP_ASSERT(mod);
+       ODP_ASSERT(mod->base.init_global);
+
+       return mod->base.init_global();
+}
+
+int odp_queue_term_global(void)
+{
+       odp_queue_module_t *mod =
+               odp_subsystem_active_module(queue, mod);
+
+       ODP_ASSERT(mod);
+       ODP_ASSERT(mod->base.term_global);
+
+       return mod->base.term_global();
+}
+
+int odp_queue_init_local(void)
+{
+       odp_queue_module_t *mod =
+               odp_subsystem_active_module(queue, mod);
+
+       ODP_ASSERT(mod);
+       ODP_ASSERT(mod->base.init_local);
+
+       return mod->base.init_local();
+}
+
+int odp_queue_term_local(void)
+{
+       odp_queue_module_t *mod =
+               odp_subsystem_active_module(queue, mod);
+
+       ODP_ASSERT(mod);
+       ODP_ASSERT(mod->base.term_local);
+
+       return mod->base.term_local();
+}
+
+odp_queue_t odp_queue_create(const char *name,
+                            const odp_queue_param_t *param)
+{
+       odp_queue_module_t *mod =
+               odp_subsystem_active_module(queue, mod);
+
+       ODP_ASSERT(mod);
+       ODP_ASSERT(mod->create);
+
+       return mod->create(name, param);
+}
+
+int odp_queue_destroy(odp_queue_t queue_hdl)
+{
+       odp_queue_module_t *mod =
+               odp_subsystem_active_module(queue, mod);
+
+       ODP_ASSERT(mod);
+       ODP_ASSERT(mod->destroy);
+
+       return mod->destroy(queue_hdl);
+}
+
+odp_queue_t odp_queue_lookup(const char *name)
+{
+       odp_queue_module_t *mod =
+               odp_subsystem_active_module(queue, mod);
+
+       ODP_ASSERT(mod);
+       ODP_ASSERT(mod->lookup);
+
+       return mod->lookup(name);
+}
+
+int odp_queue_capability(odp_queue_capability_t *capa)
+{
+       odp_queue_module_t *mod =
+               odp_subsystem_active_module(queue, mod);
+
+       ODP_ASSERT(mod);
+       ODP_ASSERT(mod->capability);
+
+       return mod->capability(capa);
+}
+
+int odp_queue_context_set(odp_queue_t queue_hdl, void *context,
+                         uint32_t len ODP_UNUSED)
+{
+       odp_queue_module_t *mod =
+               odp_subsystem_active_module(queue, mod);
+
+       ODP_ASSERT(mod);
+       ODP_ASSERT(mod->context_set);
+
+       return mod->context_set(queue_hdl, context, len);
+}
+
+void *odp_queue_context(odp_queue_t queue_hdl)
+{
+       odp_queue_module_t *mod =
+               odp_subsystem_active_module(queue, mod);
+
+       ODP_ASSERT(mod);
+       ODP_ASSERT(mod->context);
+
+       return mod->context(queue_hdl);
+}
+
+int odp_queue_enq(odp_queue_t queue_hdl, odp_event_t ev)
+{
+       odp_queue_module_t *mod =
+               odp_subsystem_active_module(queue, mod);
+
+       ODP_ASSERT(mod);
+       ODP_ASSERT(mod->enq);
+
+       return mod->enq(queue_hdl, ev);
+}
+
+int odp_queue_enq_multi(odp_queue_t queue_hdl,
+                       const odp_event_t events[], int num)
+{
+       odp_queue_module_t *mod =
+               odp_subsystem_active_module(queue, mod);
+
+       ODP_ASSERT(mod);
+       ODP_ASSERT(mod->enq_multi);
+
+       return mod->enq_multi(queue_hdl, events, num);
+}
+
+odp_event_t odp_queue_deq(odp_queue_t queue_hdl)
+{
+       odp_queue_module_t *mod =
+               odp_subsystem_active_module(queue, mod);
+
+       ODP_ASSERT(mod);
+       ODP_ASSERT(mod->deq);
+
+       return mod->deq(queue_hdl);
+}
+
+int odp_queue_deq_multi(odp_queue_t queue_hdl, odp_event_t events[], int num)
+{
+       odp_queue_module_t *mod =
+               odp_subsystem_active_module(queue, mod);
+
+       ODP_ASSERT(mod);
+       ODP_ASSERT(mod->deq_multi);
+
+       return mod->deq_multi(queue_hdl, events, num);
+}
+
+odp_queue_type_t odp_queue_type(odp_queue_t queue_hdl)
+{
+       odp_queue_module_t *mod =
+               odp_subsystem_active_module(queue, mod);
+
+       ODP_ASSERT(mod);
+       ODP_ASSERT(mod->type);
+
+       return mod->type(queue_hdl);
+}
+
+odp_schedule_sync_t odp_queue_sched_type(odp_queue_t queue_hdl)
+{
+       odp_queue_module_t *mod =
+               odp_subsystem_active_module(queue, mod);
+
+       ODP_ASSERT(mod);
+       ODP_ASSERT(mod->sched_type);
+
+       return mod->sched_type(queue_hdl);
+}
+
+odp_schedule_prio_t odp_queue_sched_prio(odp_queue_t queue_hdl)
+{
+       odp_queue_module_t *mod =
+               odp_subsystem_active_module(queue, mod);
+
+       ODP_ASSERT(mod);
+       ODP_ASSERT(mod->sched_prio);
+
+       return mod->sched_prio(queue_hdl);
+}
+
+odp_schedule_group_t odp_queue_sched_group(odp_queue_t queue_hdl)
+{
+       odp_queue_module_t *mod =
+               odp_subsystem_active_module(queue, mod);
+
+       ODP_ASSERT(mod);
+       ODP_ASSERT(mod->sched_group);
+
+       return mod->sched_group(queue_hdl);
+}
+
+int odp_queue_lock_count(odp_queue_t queue_hdl)
+{
+       odp_queue_module_t *mod =
+               odp_subsystem_active_module(queue, mod);
+
+       ODP_ASSERT(mod);
+       ODP_ASSERT(mod->lock_count);
+
+       return mod->lock_count(queue_hdl);
+}
+
+uint64_t odp_queue_to_u64(odp_queue_t queue_hdl)
+{
+       odp_queue_module_t *mod =
+               odp_subsystem_active_module(queue, mod);
+
+       ODP_ASSERT(mod);
+       ODP_ASSERT(mod->to_u64);
+
+       return mod->to_u64(queue_hdl);
+}
+
+void odp_queue_param_init(odp_queue_param_t *params)
+{
+       odp_queue_module_t *mod =
+               odp_subsystem_active_module(queue, mod);
+
+       ODP_ASSERT(mod);
+       ODP_ASSERT(mod->param_init);
+
+       return mod->param_init(params);
+}
+
+int odp_queue_info(odp_queue_t queue_hdl, odp_queue_info_t *info)
+{
+       odp_queue_module_t *mod =
+               odp_subsystem_active_module(queue, mod);
+
+       ODP_ASSERT(mod);
+       ODP_ASSERT(mod->info);
+
+       return mod->info(queue_hdl, info);
+}

Reply via email to