From: Brian Brooks <[email protected]>
Signed-off-by: Brian Brooks <[email protected]>
Reviewed-by: Honnappa Nagarahalli <[email protected]>
Reviewed-by: Kevin Wang <[email protected]>
---
/** Email created from pull request 166 (brbrooks:cloud-dev)
** https://github.com/Linaro/odp/pull/166
** Patch: https://github.com/Linaro/odp/pull/166.patch
** Base sha: d3fe76f2af39af17a3661b866a442878abc31ddc
** Merge commit sha: 306bdb45117f6891f18ad9c540f94fa9aa54123c
**/
platform/linux-dpdk/Makefile.am | 18 +-
platform/linux-dpdk/odp_init.c | 8 +-
platform/linux-generic/Makefile.am | 21 +-
platform/linux-generic/include/odp_internal.h | 5 +
platform/linux-generic/include/odp_schedule_if.h | 39 +---
platform/linux-generic/odp_init.c | 8 +-
platform/linux-generic/odp_schedule_if.c | 121 +---------
.../{odp_schedule.c => schedule/generic.c} | 28 ++-
.../{odp_schedule_iquery.c => schedule/iquery.c} | 22 +-
.../scalable.c} | 22 +-
.../scalable_ordered.c} | 0
.../{odp_schedule_sp.c => schedule/sp.c} | 22 +-
platform/linux-generic/schedule/subsystem.c | 253 +++++++++++++++++++++
13 files changed, 374 insertions(+), 193 deletions(-)
rename platform/linux-generic/{odp_schedule.c => schedule/generic.c} (98%)
rename platform/linux-generic/{odp_schedule_iquery.c => schedule/iquery.c}
(98%)
rename platform/linux-generic/{odp_schedule_scalable.c => schedule/scalable.c}
(99%)
rename platform/linux-generic/{odp_schedule_scalable_ordered.c =>
schedule/scalable_ordered.c} (100%)
rename platform/linux-generic/{odp_schedule_sp.c => schedule/sp.c} (97%)
diff --git a/platform/linux-dpdk/Makefile.am b/platform/linux-dpdk/Makefile.am
index 8b94b7d2..eb5c7c38 100644
--- a/platform/linux-dpdk/Makefile.am
+++ b/platform/linux-dpdk/Makefile.am
@@ -252,9 +252,12 @@ __LIB__libodp_dpdk_la_SOURCES = \
../linux-generic/odp_rwlock.c \
../linux-generic/odp_rwlock_recursive.c \
../linux-generic/pool/subsystem.c \
- ../linux-generic/odp_schedule.c \
../linux-generic/odp_schedule_if.c \
- ../linux-generic/odp_schedule_iquery.c \
+ ../linux-generic/schedule/generic.c \
+ ../linux-generic/schedule/iquery.c \
+ ../linux-generic/schedule/scalable.c \
+ ../linux-generic/schedule/scalable_ordered.c \
+ ../linux-generic/schedule/sp.c \
../linux-generic/schedule/subsystem.c \
../linux-generic/odp_shared_memory.c \
../linux-generic/odp_sorted_list.c \
@@ -297,6 +300,17 @@ __LIB__libodp_dpdk_la_SOURCES += arch/x86/cpu_flags.c \
endif
pool/dpdk.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE
+if ODP_SCHEDULE_SCALABLE
+schedule/scalable.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE
+else
+schedule/generic.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE
+endif
+if ODP_SCHEDULE_SP
+schedule/sp.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE
+endif
+if ODP_SCHEDULE_IQUERY
+schedule/iquery.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE
+endif
# Build modular framework into odp-linux library
modularframeworkdir = $(top_srcdir)/frameworks/modular
diff --git a/platform/linux-dpdk/odp_init.c b/platform/linux-dpdk/odp_init.c
index 96c535ba..cd7abce6 100644
--- a/platform/linux-dpdk/odp_init.c
+++ b/platform/linux-dpdk/odp_init.c
@@ -358,7 +358,7 @@ int odp_init_global(odp_instance_t *instance,
}
stage = QUEUE_INIT;
- if (sched_fn->init_global()) {
+ if (odp_schedule_init_global()) {
ODP_ERR("ODP schedule init failed.\n");
goto init_failed;
}
@@ -488,7 +488,7 @@ int _odp_term_global(enum init_stage stage)
/* Fall through */
case SCHED_INIT:
- if (sched_fn->term_global()) {
+ if (odp_schedule_term_global()) {
ODP_ERR("ODP schedule term failed.\n");
rc = -1;
}
@@ -590,7 +590,7 @@ int odp_init_local(odp_instance_t instance,
odp_thread_type_t thr_type)
}
stage = POOL_INIT;
- if (sched_fn->init_local()) {
+ if (odp_schedule_init_local()) {
ODP_ERR("ODP schedule local init failed.\n");
goto init_fail;
}
@@ -617,7 +617,7 @@ int _odp_term_local(enum init_stage stage)
case ALL_INIT:
case SCHED_INIT:
- if (sched_fn->term_local()) {
+ if (odp_schedule_term_local()) {
ODP_ERR("ODP schedule local term failed.\n");
rc = -1;
}
diff --git a/platform/linux-generic/Makefile.am
b/platform/linux-generic/Makefile.am
index 78e95760..cbbefa4e 100644
--- a/platform/linux-generic/Makefile.am
+++ b/platform/linux-generic/Makefile.am
@@ -281,12 +281,12 @@ __LIB__libodp_linux_la_SOURCES = \
odp_queue_scalable.c \
odp_rwlock.c \
odp_rwlock_recursive.c \
- odp_schedule.c \
odp_schedule_if.c \
- odp_schedule_sp.c \
- odp_schedule_iquery.c \
- odp_schedule_scalable.c \
- odp_schedule_scalable_ordered.c \
+ schedule/generic.c \
+ schedule/iquery.c \
+ schedule/scalable.c \
+ schedule/scalable_ordered.c \
+ schedule/sp.c \
schedule/subsystem.c \
odp_shared_memory.c \
odp_sorted_list.c \
@@ -334,6 +334,17 @@ endif
pool/generic.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE
buffer/generic.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE
+if ODP_SCHEDULE_SCALABLE
+schedule/scalable.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE
+else
+schedule/generic.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE
+endif
+if ODP_SCHEDULE_SP
+schedule/sp.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE
+endif
+if ODP_SCHEDULE_IQUERY
+schedule/iquery.lo: AM_CFLAGS += -DIM_ACTIVE_MODULE
+endif
# Build modular framework into odp-linux library
modularframeworkdir = $(top_srcdir)/frameworks/modular
diff --git a/platform/linux-generic/include/odp_internal.h
b/platform/linux-generic/include/odp_internal.h
index bb70bd72..2c935a9f 100644
--- a/platform/linux-generic/include/odp_internal.h
+++ b/platform/linux-generic/include/odp_internal.h
@@ -113,6 +113,11 @@ int odp_queue_term_global(void);
int odp_crypto_init_global(void);
int odp_crypto_term_global(void);
+int odp_schedule_init_global(void);
+int odp_schedule_term_global(void);
+int odp_schedule_init_local(void);
+int odp_schedule_term_local(void);
+
int odp_timer_init_global(const odp_init_t *params);
int odp_timer_term_global(void);
int odp_timer_disarm_all(void);
diff --git a/platform/linux-generic/include/odp_schedule_if.h
b/platform/linux-generic/include/odp_schedule_if.h
index 657993b1..2bcf23f2 100644
--- a/platform/linux-generic/include/odp_schedule_if.h
+++ b/platform/linux-generic/include/odp_schedule_if.h
@@ -20,18 +20,13 @@ typedef void (*schedule_pktio_start_fn_t)(int pktio_index,
int num_in_queue,
typedef int (*schedule_thr_add_fn_t)(odp_schedule_group_t group, int thr);
typedef int (*schedule_thr_rem_fn_t)(odp_schedule_group_t group, int thr);
typedef int (*schedule_num_grps_fn_t)(void);
-typedef int (*schedule_init_queue_fn_t)(uint32_t queue_index,
- const odp_schedule_param_t *sched_param
- );
+typedef int (*schedule_init_queue_fn_t)(
+ uint32_t queue_index, const odp_schedule_param_t *sched_param);
typedef void (*schedule_destroy_queue_fn_t)(uint32_t queue_index);
typedef int (*schedule_sched_queue_fn_t)(uint32_t queue_index);
typedef int (*schedule_unsched_queue_fn_t)(uint32_t queue_index);
typedef int (*schedule_ord_enq_multi_fn_t)(queue_t q_int,
void *buf_hdr[], int num, int *ret);
-typedef int (*schedule_init_global_fn_t)(void);
-typedef int (*schedule_term_global_fn_t)(void);
-typedef int (*schedule_init_local_fn_t)(void);
-typedef int (*schedule_term_local_fn_t)(void);
typedef void (*schedule_order_lock_fn_t)(void);
typedef void (*schedule_order_unlock_fn_t)(void);
typedef unsigned (*schedule_max_ordered_locks_fn_t)(void);
@@ -47,10 +42,6 @@ typedef struct schedule_fn_t {
schedule_destroy_queue_fn_t destroy_queue;
schedule_sched_queue_fn_t sched_queue;
schedule_ord_enq_multi_fn_t ord_enq_multi;
- schedule_init_global_fn_t init_global;
- schedule_term_global_fn_t term_global;
- schedule_init_local_fn_t init_local;
- schedule_term_local_fn_t term_local;
schedule_order_lock_fn_t order_lock;
schedule_order_unlock_fn_t order_unlock;
schedule_max_ordered_locks_fn_t max_ordered_locks;
@@ -72,32 +63,6 @@ void sched_cb_queue_destroy_finalize(uint32_t queue_index);
int sched_cb_queue_deq_multi(uint32_t queue_index, odp_event_t ev[], int num);
int sched_cb_queue_empty(uint32_t queue_index);
-/* API functions */
-typedef struct {
- uint64_t (*schedule_wait_time)(uint64_t);
- odp_event_t (*schedule)(odp_queue_t *, uint64_t);
- int (*schedule_multi)(odp_queue_t *, uint64_t, odp_event_t [], int);
- void (*schedule_pause)(void);
- void (*schedule_resume)(void);
- void (*schedule_release_atomic)(void);
- void (*schedule_release_ordered)(void);
- void (*schedule_prefetch)(int);
- int (*schedule_num_prio)(void);
- odp_schedule_group_t (*schedule_group_create)(const char *,
- const odp_thrmask_t *);
- int (*schedule_group_destroy)(odp_schedule_group_t);
- odp_schedule_group_t (*schedule_group_lookup)(const char *);
- int (*schedule_group_join)(odp_schedule_group_t, const odp_thrmask_t *);
- int (*schedule_group_leave)(odp_schedule_group_t,
- const odp_thrmask_t *);
- int (*schedule_group_thrmask)(odp_schedule_group_t, odp_thrmask_t *);
- int (*schedule_group_info)(odp_schedule_group_t,
- odp_schedule_group_info_t *);
- void (*schedule_order_lock)(unsigned);
- void (*schedule_order_unlock)(unsigned);
-
-} schedule_api_t;
-
#ifdef __cplusplus
}
#endif
diff --git a/platform/linux-generic/odp_init.c
b/platform/linux-generic/odp_init.c
index 0d5ee710..340171a5 100644
--- a/platform/linux-generic/odp_init.c
+++ b/platform/linux-generic/odp_init.c
@@ -178,7 +178,7 @@ int odp_init_global(odp_instance_t *instance,
}
stage = QUEUE_INIT;
- if (sched_fn->init_global()) {
+ if (odp_schedule_init_global()) {
ODP_ERR("ODP schedule init failed.\n");
goto init_failed;
}
@@ -306,7 +306,7 @@ int _odp_term_global(enum init_stage stage)
/* Fall through */
case SCHED_INIT:
- if (sched_fn->term_global()) {
+ if (odp_schedule_term_global()) {
ODP_ERR("ODP schedule term failed.\n");
rc = -1;
}
@@ -414,7 +414,7 @@ int odp_init_local(odp_instance_t instance,
odp_thread_type_t thr_type)
}
stage = QUEUE_INIT;
- if (sched_fn->init_local()) {
+ if (odp_schedule_init_local()) {
ODP_ERR("ODP schedule local init failed.\n");
goto init_fail;
}
@@ -447,7 +447,7 @@ int _odp_term_local(enum init_stage stage)
case ALL_INIT:
case SCHED_INIT:
- if (sched_fn->term_local()) {
+ if (odp_schedule_term_local()) {
ODP_ERR("ODP schedule local term failed.\n");
rc = -1;
}
diff --git a/platform/linux-generic/odp_schedule_if.c
b/platform/linux-generic/odp_schedule_if.c
index 2f07aafe..b06ab130 100644
--- a/platform/linux-generic/odp_schedule_if.c
+++ b/platform/linux-generic/odp_schedule_if.c
@@ -7,123 +7,16 @@
#include <odp_schedule_if.h>
extern const schedule_fn_t schedule_sp_fn;
-extern const schedule_api_t schedule_sp_api;
-
-extern const schedule_fn_t schedule_default_fn;
-extern const schedule_api_t schedule_default_api;
-
extern const schedule_fn_t schedule_iquery_fn;
-extern const schedule_api_t schedule_iquery_api;
-
-extern const schedule_fn_t schedule_scalable_fn;
-extern const schedule_api_t schedule_scalable_api;
+extern const schedule_fn_t schedule_scalable_fn;
+extern const schedule_fn_t schedule_default_fn;
-#ifdef ODP_SCHEDULE_SP
-const schedule_fn_t *sched_fn = &schedule_sp_fn;
-const schedule_api_t *sched_api = &schedule_sp_api;
+#if defined(ODP_SCHEDULE_SP)
+const schedule_fn_t *sched_fn = &schedule_sp_fn;
#elif defined(ODP_SCHEDULE_IQUERY)
-const schedule_fn_t *sched_fn = &schedule_iquery_fn;
-const schedule_api_t *sched_api = &schedule_iquery_api;
+const schedule_fn_t *sched_fn = &schedule_iquery_fn;
#elif defined(ODP_SCHEDULE_SCALABLE)
-const schedule_fn_t *sched_fn = &schedule_scalable_fn;
-const schedule_api_t *sched_api = &schedule_scalable_api;
+const schedule_fn_t *sched_fn = &schedule_scalable_fn;
#else
-const schedule_fn_t *sched_fn = &schedule_default_fn;
-const schedule_api_t *sched_api = &schedule_default_api;
+const schedule_fn_t *sched_fn = &schedule_default_fn;
#endif
-
-uint64_t odp_schedule_wait_time(uint64_t ns)
-{
- return sched_api->schedule_wait_time(ns);
-}
-
-odp_event_t odp_schedule(odp_queue_t *from, uint64_t wait)
-{
- return sched_api->schedule(from, wait);
-}
-
-int odp_schedule_multi(odp_queue_t *from, uint64_t wait, odp_event_t events[],
- int num)
-{
- return sched_api->schedule_multi(from, wait, events, num);
-}
-
-void odp_schedule_pause(void)
-{
- return sched_api->schedule_pause();
-}
-
-void odp_schedule_resume(void)
-{
- return sched_api->schedule_resume();
-}
-
-void odp_schedule_release_atomic(void)
-{
- return sched_api->schedule_release_atomic();
-}
-
-void odp_schedule_release_ordered(void)
-{
- return sched_api->schedule_release_ordered();
-}
-
-void odp_schedule_prefetch(int num)
-{
- return sched_api->schedule_prefetch(num);
-}
-
-int odp_schedule_num_prio(void)
-{
- return sched_api->schedule_num_prio();
-}
-
-odp_schedule_group_t odp_schedule_group_create(const char *name,
- const odp_thrmask_t *mask)
-{
- return sched_api->schedule_group_create(name, mask);
-}
-
-int odp_schedule_group_destroy(odp_schedule_group_t group)
-{
- return sched_api->schedule_group_destroy(group);
-}
-
-odp_schedule_group_t odp_schedule_group_lookup(const char *name)
-{
- return sched_api->schedule_group_lookup(name);
-}
-
-int odp_schedule_group_join(odp_schedule_group_t group,
- const odp_thrmask_t *mask)
-{
- return sched_api->schedule_group_join(group, mask);
-}
-
-int odp_schedule_group_leave(odp_schedule_group_t group,
- const odp_thrmask_t *mask)
-{
- return sched_api->schedule_group_leave(group, mask);
-}
-
-int odp_schedule_group_thrmask(odp_schedule_group_t group,
- odp_thrmask_t *thrmask)
-{
- return sched_api->schedule_group_thrmask(group, thrmask);
-}
-
-int odp_schedule_group_info(odp_schedule_group_t group,
- odp_schedule_group_info_t *info)
-{
- return sched_api->schedule_group_info(group, info);
-}
-
-void odp_schedule_order_lock(unsigned lock_index)
-{
- return sched_api->schedule_order_lock(lock_index);
-}
-
-void odp_schedule_order_unlock(unsigned lock_index)
-{
- return sched_api->schedule_order_unlock(lock_index);
-}
diff --git a/platform/linux-generic/odp_schedule.c
b/platform/linux-generic/schedule/generic.c
similarity index 98%
rename from platform/linux-generic/odp_schedule.c
rename to platform/linux-generic/schedule/generic.c
index a696d251..24ab8e06 100644
--- a/platform/linux-generic/odp_schedule.c
+++ b/platform/linux-generic/schedule/generic.c
@@ -23,6 +23,7 @@
#include <odp/api/packet_io.h>
#include <odp_ring_internal.h>
#include <odp_timer_internal.h>
+#include <odp_schedule_subsystem.h>
/* Should remove this dependency */
#include <odp_queue_internal.h>
@@ -389,9 +390,9 @@ static int schedule_term_global(void)
odp_event_t events[1];
int num;
- num = sched_cb_queue_deq_multi(qi,
- events,
- 1);
+ num = queue_idx_deq_multi(qi,
+ events,
+ 1);
if (num < 0)
queue_destroy_finalize(qi);
@@ -1397,10 +1398,6 @@ const schedule_fn_t schedule_default_fn = {
.destroy_queue = schedule_destroy_queue,
.sched_queue = schedule_sched_queue,
.ord_enq_multi = schedule_ord_enq_multi,
- .init_global = schedule_init_global,
- .term_global = schedule_term_global,
- .init_local = schedule_init_local,
- .term_local = schedule_term_local,
.order_lock = order_lock,
.order_unlock = order_unlock,
.max_ordered_locks = schedule_max_ordered_locks,
@@ -1409,8 +1406,15 @@ const schedule_fn_t schedule_default_fn = {
};
/* Fill in scheduler API calls */
-const schedule_api_t schedule_default_api = {
- .schedule_wait_time = schedule_wait_time,
+odp_schedule_module_t schedule_generic = {
+ .base = {
+ .name = "schedule_generic",
+ .init_global = schedule_init_global,
+ .term_global = schedule_term_global,
+ .init_local = schedule_init_local,
+ .term_local = schedule_term_local,
+ },
+ .wait_time = schedule_wait_time,
.schedule = schedule,
.schedule_multi = schedule_multi,
.schedule_pause = schedule_pause,
@@ -1429,3 +1433,9 @@ const schedule_api_t schedule_default_api = {
.schedule_order_lock = schedule_order_lock,
.schedule_order_unlock = schedule_order_unlock
};
+
+ODP_MODULE_CONSTRUCTOR(schedule_generic)
+{
+ odp_module_constructor(&schedule_generic);
+ odp_subsystem_register_module(schedule, &schedule_generic);
+}
diff --git a/platform/linux-generic/odp_schedule_iquery.c
b/platform/linux-generic/schedule/iquery.c
similarity index 98%
rename from platform/linux-generic/odp_schedule_iquery.c
rename to platform/linux-generic/schedule/iquery.c
index 86f5d53e..f03014b8 100644
--- a/platform/linux-generic/odp_schedule_iquery.c
+++ b/platform/linux-generic/schedule/iquery.c
@@ -23,6 +23,7 @@
#include <odp/api/packet_io.h>
#include <odp_config_internal.h>
#include <odp_timer_internal.h>
+#include <odp_schedule_subsystem.h>
/* Should remove this dependency */
#include <odp_queue_internal.h>
@@ -1336,10 +1337,6 @@ const schedule_fn_t schedule_iquery_fn = {
.destroy_queue = destroy_sched_queue,
.sched_queue = schedule_sched_queue,
.ord_enq_multi = schedule_ord_enq_multi,
- .init_global = schedule_init_global,
- .term_global = schedule_term_global,
- .init_local = schedule_init_local,
- .term_local = schedule_term_local,
.order_lock = order_lock,
.order_unlock = order_unlock,
.max_ordered_locks = schedule_max_ordered_locks,
@@ -1348,8 +1345,15 @@ const schedule_fn_t schedule_iquery_fn = {
};
/* Fill in scheduler API calls */
-const schedule_api_t schedule_iquery_api = {
- .schedule_wait_time = schedule_wait_time,
+odp_schedule_module_t schedule_iquery = {
+ .base = {
+ .name = "schedule_iquery",
+ .init_global = schedule_init_global,
+ .term_global = schedule_term_global,
+ .init_local = schedule_init_local,
+ .term_local = schedule_term_local,
+ },
+ .wait_time = schedule_wait_time,
.schedule = schedule,
.schedule_multi = schedule_multi,
.schedule_pause = schedule_pause,
@@ -1369,6 +1373,12 @@ const schedule_api_t schedule_iquery_api = {
.schedule_order_unlock = schedule_order_unlock
};
+ODP_MODULE_CONSTRUCTOR(schedule_iquery)
+{
+ odp_module_constructor(&schedule_iquery);
+ odp_subsystem_register_module(schedule, &schedule_iquery);
+}
+
static void thread_set_interest(sched_thread_local_t *thread,
unsigned int queue_index, int prio)
{
diff --git a/platform/linux-generic/odp_schedule_scalable.c
b/platform/linux-generic/schedule/scalable.c
similarity index 99%
rename from platform/linux-generic/odp_schedule_scalable.c
rename to platform/linux-generic/schedule/scalable.c
index 78159b53..a4d78788 100644
--- a/platform/linux-generic/odp_schedule_scalable.c
+++ b/platform/linux-generic/schedule/scalable.c
@@ -28,6 +28,7 @@
#include <odp_llqueue.h>
#include <odp_queue_scalable_internal.h>
#include <odp_schedule_if.h>
+#include <odp_schedule_subsystem.h>
#include <odp_bitset.h>
#include <odp_packet_io_internal.h>
@@ -1949,17 +1950,20 @@ const schedule_fn_t schedule_scalable_fn = {
.destroy_queue = destroy_queue,
.sched_queue = sched_queue,
.ord_enq_multi = ord_enq_multi,
- .init_global = schedule_init_global,
- .term_global = schedule_term_global,
- .init_local = schedule_init_local,
- .term_local = schedule_term_local,
.order_lock = order_lock,
.order_unlock = order_unlock,
.max_ordered_locks = schedule_max_ordered_locks,
};
-const schedule_api_t schedule_scalable_api = {
- .schedule_wait_time = schedule_wait_time,
+odp_schedule_module_t schedule_scalable = {
+ .base = {
+ .name = "schedule_scalable",
+ .init_global = schedule_init_global,
+ .term_global = schedule_term_global,
+ .init_local = schedule_init_local,
+ .term_local = schedule_term_local,
+ },
+ .wait_time = schedule_wait_time,
.schedule = schedule,
.schedule_multi = schedule_multi,
.schedule_pause = schedule_pause,
@@ -1978,3 +1982,9 @@ const schedule_api_t schedule_scalable_api = {
.schedule_order_lock = schedule_order_lock,
.schedule_order_unlock = schedule_order_unlock,
};
+
+ODP_MODULE_CONSTRUCTOR(schedule_scalable)
+{
+ odp_module_constructor(&schedule_scalable);
+ odp_subsystem_register_module(schedule, &schedule_scalable);
+}
diff --git a/platform/linux-generic/odp_schedule_scalable_ordered.c
b/platform/linux-generic/schedule/scalable_ordered.c
similarity index 100%
rename from platform/linux-generic/odp_schedule_scalable_ordered.c
rename to platform/linux-generic/schedule/scalable_ordered.c
diff --git a/platform/linux-generic/odp_schedule_sp.c
b/platform/linux-generic/schedule/sp.c
similarity index 97%
rename from platform/linux-generic/odp_schedule_sp.c
rename to platform/linux-generic/schedule/sp.c
index 9829acc5..19700f90 100644
--- a/platform/linux-generic/odp_schedule_sp.c
+++ b/platform/linux-generic/schedule/sp.c
@@ -16,6 +16,7 @@
#include <odp_config_internal.h>
#include <odp_ring_internal.h>
#include <odp_timer_internal.h>
+#include <odp_schedule_subsystem.h>
#define NUM_THREAD ODP_THREAD_COUNT_MAX
#define NUM_QUEUE ODP_CONFIG_QUEUES
@@ -836,10 +837,6 @@ const schedule_fn_t schedule_sp_fn = {
.destroy_queue = destroy_queue,
.sched_queue = sched_queue,
.ord_enq_multi = ord_enq_multi,
- .init_global = init_global,
- .term_global = term_global,
- .init_local = init_local,
- .term_local = term_local,
.order_lock = order_lock,
.order_unlock = order_unlock,
.max_ordered_locks = max_ordered_locks,
@@ -848,8 +845,15 @@ const schedule_fn_t schedule_sp_fn = {
};
/* Fill in scheduler API calls */
-const schedule_api_t schedule_sp_api = {
- .schedule_wait_time = schedule_wait_time,
+odp_schedule_module_t schedule_sp = {
+ .base = {
+ .name = "schedule_sp",
+ .init_global = init_global,
+ .term_global = term_global,
+ .init_local = init_local,
+ .term_local = term_local,
+ },
+ .wait_time = schedule_wait_time,
.schedule = schedule,
.schedule_multi = schedule_multi,
.schedule_pause = schedule_pause,
@@ -868,3 +872,9 @@ const schedule_api_t schedule_sp_api = {
.schedule_order_lock = schedule_order_lock,
.schedule_order_unlock = schedule_order_unlock
};
+
+ODP_MODULE_CONSTRUCTOR(schedule_sp)
+{
+ odp_module_constructor(&schedule_sp);
+ odp_subsystem_register_module(schedule, &schedule_sp);
+}
diff --git a/platform/linux-generic/schedule/subsystem.c
b/platform/linux-generic/schedule/subsystem.c
index ae2bf3fd..6ca6459e 100644
--- a/platform/linux-generic/schedule/subsystem.c
+++ b/platform/linux-generic/schedule/subsystem.c
@@ -6,7 +6,12 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
+/* API header files */
+#include <odp.h>
+
/* Internal header files */
+#include <odp_debug_internal.h>
+#include <odp_internal.h>
#include <odp_module.h>
#include <odp_schedule_subsystem.h>
@@ -17,3 +22,251 @@ ODP_SUBSYSTEM_CONSTRUCTOR(schedule)
{
odp_subsystem_constructor(schedule);
}
+
+int odp_schedule_init_global(void)
+{
+ odp_schedule_module_t *module =
+ odp_subsystem_active_module(schedule, module);
+
+ ODP_ASSERT(module);
+ ODP_ASSERT(module->base.init_global);
+
+ return module->base.init_global();
+}
+
+int odp_schedule_term_global(void)
+{
+ odp_schedule_module_t *module =
+ odp_subsystem_active_module(schedule, module);
+
+ ODP_ASSERT(module);
+ ODP_ASSERT(module->base.term_global);
+
+ return module->base.term_global();
+}
+
+int odp_schedule_init_local(void)
+{
+ odp_schedule_module_t *module =
+ odp_subsystem_active_module(schedule, module);
+
+ ODP_ASSERT(module);
+ ODP_ASSERT(module->base.init_local);
+
+ return module->base.init_local();
+}
+
+int odp_schedule_term_local(void)
+{
+ odp_schedule_module_t *module =
+ odp_subsystem_active_module(schedule, module);
+
+ ODP_ASSERT(module);
+ ODP_ASSERT(module->base.term_local);
+
+ return module->base.term_local();
+}
+
+uint64_t odp_schedule_wait_time(uint64_t ns)
+{
+ odp_schedule_module_t *module =
+ odp_subsystem_active_module(schedule, module);
+
+ ODP_ASSERT(module);
+ ODP_ASSERT(module->wait_time);
+
+ return module->wait_time(ns);
+}
+
+odp_event_t odp_schedule(odp_queue_t *from, uint64_t wait)
+{
+ odp_schedule_module_t *module =
+ odp_subsystem_active_module(schedule, module);
+
+ ODP_ASSERT(module);
+ ODP_ASSERT(module->schedule);
+
+ return module->schedule(from, wait);
+}
+
+int odp_schedule_multi(odp_queue_t *from, uint64_t wait, odp_event_t events[],
+ int num)
+{
+ odp_schedule_module_t *module =
+ odp_subsystem_active_module(schedule, module);
+
+ ODP_ASSERT(module);
+ ODP_ASSERT(module->schedule_multi);
+
+ return module->schedule_multi(from, wait, events, num);
+}
+
+void odp_schedule_pause(void)
+{
+ odp_schedule_module_t *module =
+ odp_subsystem_active_module(schedule, module);
+
+ ODP_ASSERT(module);
+ ODP_ASSERT(module->schedule_pause);
+
+ return module->schedule_pause();
+}
+
+void odp_schedule_resume(void)
+{
+ odp_schedule_module_t *module =
+ odp_subsystem_active_module(schedule, module);
+
+ ODP_ASSERT(module);
+ ODP_ASSERT(module->schedule_resume);
+
+ return module->schedule_resume();
+}
+
+void odp_schedule_release_atomic(void)
+{
+ odp_schedule_module_t *module =
+ odp_subsystem_active_module(schedule, module);
+
+ ODP_ASSERT(module);
+ ODP_ASSERT(module->schedule_release_atomic);
+
+ return module->schedule_release_atomic();
+}
+
+void odp_schedule_release_ordered(void)
+{
+ odp_schedule_module_t *module =
+ odp_subsystem_active_module(schedule, module);
+
+ ODP_ASSERT(module);
+ ODP_ASSERT(module->schedule_release_ordered);
+
+ return module->schedule_release_ordered();
+}
+
+void odp_schedule_prefetch(int num)
+{
+ odp_schedule_module_t *module =
+ odp_subsystem_active_module(schedule, module);
+
+ ODP_ASSERT(module);
+ ODP_ASSERT(module->schedule_prefetch);
+
+ return module->schedule_prefetch(num);
+}
+
+int odp_schedule_num_prio(void)
+{
+ odp_schedule_module_t *module =
+ odp_subsystem_active_module(schedule, module);
+
+ ODP_ASSERT(module);
+ ODP_ASSERT(module->schedule_num_prio);
+
+ return module->schedule_num_prio();
+}
+
+odp_schedule_group_t odp_schedule_group_create(const char *name,
+ const odp_thrmask_t *mask)
+{
+ odp_schedule_module_t *module =
+ odp_subsystem_active_module(schedule, module);
+
+ ODP_ASSERT(module);
+ ODP_ASSERT(module->schedule_group_create);
+
+ return module->schedule_group_create(name, mask);
+}
+
+int odp_schedule_group_destroy(odp_schedule_group_t group)
+{
+ odp_schedule_module_t *module =
+ odp_subsystem_active_module(schedule, module);
+
+ ODP_ASSERT(module);
+ ODP_ASSERT(module->schedule_group_destroy);
+
+ return module->schedule_group_destroy(group);
+}
+
+odp_schedule_group_t odp_schedule_group_lookup(const char *name)
+{
+ odp_schedule_module_t *module =
+ odp_subsystem_active_module(schedule, module);
+
+ ODP_ASSERT(module);
+ ODP_ASSERT(module->schedule_group_lookup);
+
+ return module->schedule_group_lookup(name);
+}
+
+int odp_schedule_group_join(odp_schedule_group_t group,
+ const odp_thrmask_t *mask)
+{
+ odp_schedule_module_t *module =
+ odp_subsystem_active_module(schedule, module);
+
+ ODP_ASSERT(module);
+ ODP_ASSERT(module->schedule_group_join);
+
+ return module->schedule_group_join(group, mask);
+}
+
+int odp_schedule_group_leave(odp_schedule_group_t group,
+ const odp_thrmask_t *mask)
+{
+ odp_schedule_module_t *module =
+ odp_subsystem_active_module(schedule, module);
+
+ ODP_ASSERT(module);
+ ODP_ASSERT(module->schedule_group_leave);
+
+ return module->schedule_group_leave(group, mask);
+}
+
+int odp_schedule_group_thrmask(odp_schedule_group_t group,
+ odp_thrmask_t *thrmask)
+{
+ odp_schedule_module_t *module =
+ odp_subsystem_active_module(schedule, module);
+
+ ODP_ASSERT(module);
+ ODP_ASSERT(module->schedule_group_thrmask);
+
+ return module->schedule_group_thrmask(group, thrmask);
+}
+
+int odp_schedule_group_info(odp_schedule_group_t group,
+ odp_schedule_group_info_t *info)
+{
+ odp_schedule_module_t *module =
+ odp_subsystem_active_module(schedule, module);
+
+ ODP_ASSERT(module);
+ ODP_ASSERT(module->schedule_group_info);
+
+ return module->schedule_group_info(group, info);
+}
+
+void odp_schedule_order_lock(unsigned lock_index)
+{
+ odp_schedule_module_t *module =
+ odp_subsystem_active_module(schedule, module);
+
+ ODP_ASSERT(module);
+ ODP_ASSERT(module->schedule_order_lock);
+
+ return module->schedule_order_lock(lock_index);
+}
+
+void odp_schedule_order_unlock(unsigned lock_index)
+{
+ odp_schedule_module_t *module =
+ odp_subsystem_active_module(schedule, module);
+
+ ODP_ASSERT(module);
+ ODP_ASSERT(module->schedule_order_unlock);
+
+ return module->schedule_order_unlock(lock_index);
+}