diff options
author | Petri Savolainen <petri.savolainen@linaro.org> | 2018-10-25 17:38:24 +0300 |
---|---|---|
committer | Maxim Uvarov <maxim.uvarov@linaro.org> | 2018-10-31 23:15:53 +0300 |
commit | 48018032f54e6e50f509d073c8735f7a5c0bbcb1 (patch) | |
tree | 3a431246f3f8b0daefeda6eaa19b0873e6733dc7 /platform | |
parent | 380fa4598b4c58101a2f07ff179ae67fdcba70ab (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.c | 44 |
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); |