aboutsummaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorPetri Savolainen <petri.savolainen@linaro.org>2018-10-25 17:38:24 +0300
committerMaxim Uvarov <maxim.uvarov@linaro.org>2018-10-31 23:15:53 +0300
commit48018032f54e6e50f509d073c8735f7a5c0bbcb1 (patch)
tree3a431246f3f8b0daefeda6eaa19b0873e6733dc7 /platform
parent380fa4598b4c58101a2f07ff179ae67fdcba70ab (diff)
linux-gen: thread: use automatic schedule group configuration
Read from scheduler configuration if an automatic schedule group is enabled or disabled. Signed-off-by: Petri Savolainen <petri.savolainen@linaro.org> Reviewed-by: Bill Fischofer <bill.fischofer@linaro.org> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
Diffstat (limited to 'platform')
-rw-r--r--platform/linux-generic/odp_thread.c44
1 files changed, 38 insertions, 6 deletions
diff --git a/platform/linux-generic/odp_thread.c b/platform/linux-generic/odp_thread.c
index 4fc6acc92..7728929bb 100644
--- a/platform/linux-generic/odp_thread.c
+++ b/platform/linux-generic/odp_thread.c
@@ -136,6 +136,20 @@ int odp_thread_init_local(odp_thread_type_t type)
{
int id;
int cpu;
+ int group_all, group_worker, group_control;
+
+ group_all = 1;
+ group_worker = 1;
+ group_control = 1;
+
+ if (sched_fn->config) {
+ schedule_config_t schedule_config;
+
+ sched_fn->config(&schedule_config);
+ group_all = schedule_config.group_enable.all;
+ group_worker = schedule_config.group_enable.worker;
+ group_control = schedule_config.group_enable.control;
+ }
odp_spinlock_lock(&thread_globals->lock);
id = alloc_id(type);
@@ -159,11 +173,13 @@ int odp_thread_init_local(odp_thread_type_t type)
_odp_this_thread = &thread_globals->thr[id];
- sched_fn->thr_add(ODP_SCHED_GROUP_ALL, id);
+ if (group_all)
+ sched_fn->thr_add(ODP_SCHED_GROUP_ALL, id);
- if (type == ODP_THREAD_WORKER)
+ if (type == ODP_THREAD_WORKER && group_worker)
sched_fn->thr_add(ODP_SCHED_GROUP_WORKER, id);
- else if (type == ODP_THREAD_CONTROL)
+
+ if (type == ODP_THREAD_CONTROL && group_control)
sched_fn->thr_add(ODP_SCHED_GROUP_CONTROL, id);
return 0;
@@ -172,14 +188,30 @@ int odp_thread_init_local(odp_thread_type_t type)
int odp_thread_term_local(void)
{
int num;
+ int group_all, group_worker, group_control;
int id = _odp_this_thread->thr;
odp_thread_type_t type = _odp_this_thread->type;
- sched_fn->thr_rem(ODP_SCHED_GROUP_ALL, id);
+ group_all = 1;
+ group_worker = 1;
+ group_control = 1;
- if (type == ODP_THREAD_WORKER)
+ if (sched_fn->config) {
+ schedule_config_t schedule_config;
+
+ sched_fn->config(&schedule_config);
+ group_all = schedule_config.group_enable.all;
+ group_worker = schedule_config.group_enable.worker;
+ group_control = schedule_config.group_enable.control;
+ }
+
+ if (group_all)
+ sched_fn->thr_rem(ODP_SCHED_GROUP_ALL, id);
+
+ if (type == ODP_THREAD_WORKER && group_worker)
sched_fn->thr_rem(ODP_SCHED_GROUP_WORKER, id);
- else if (type == ODP_THREAD_CONTROL)
+
+ if (type == ODP_THREAD_CONTROL && group_control)
sched_fn->thr_rem(ODP_SCHED_GROUP_CONTROL, id);
odp_spinlock_lock(&thread_globals->lock);