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);
+}