From 068fbf2cb6c9211e90a989ae918eb69bc537c96f Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Sun, 6 Nov 2016 19:26:19 +0100 Subject: [PATCH] use mwait to check the readyqueue for new arriving tasks --- hermit/arch/x86/kernel/tasks.c | 15 +++++++++++++++ hermit/include/hermit/tasks.h | 11 +++++++++++ hermit/kernel/main.c | 12 ++---------- hermit/kernel/syscall.c | 3 --- hermit/kernel/tasks.c | 6 ++++++ 5 files changed, 34 insertions(+), 13 deletions(-) diff --git a/hermit/arch/x86/kernel/tasks.c b/hermit/arch/x86/kernel/tasks.c index 2c40cc343..759753ec5 100644 --- a/hermit/arch/x86/kernel/tasks.c +++ b/hermit/arch/x86/kernel/tasks.c @@ -136,3 +136,18 @@ int create_default_frame(task_t* task, entry_point_t ep, void* arg, uint32_t cor return 0; } + +void wait_for_task(void) +{ + if (!has_mwait()) { + PAUSE; + } else { + void* queue = get_readyqueue(); + + if (has_clflush()) + clflush(queue); + + monitor(queue, 0, 0); + mwait(0xF /* = c0 */, 1 /* break on interrupt flag */); + } +} diff --git a/hermit/include/hermit/tasks.h b/hermit/include/hermit/tasks.h index 05d3dcbac..553021618 100644 --- a/hermit/include/hermit/tasks.h +++ b/hermit/include/hermit/tasks.h @@ -187,6 +187,17 @@ int wakeup_task(tid_t); */ int block_current_task(void); +/** @brief Block task until a new arrived + * + */ +void wait_for_task(void); + +/** @brief Get readyqueue of the current core + * + * @return + * - address of the readyqueue + */ +void* get_readyqueue(void); /** @brief Get a process control block * diff --git a/hermit/kernel/main.c b/hermit/kernel/main.c index dfd494e4d..160cd2f20 100644 --- a/hermit/kernel/main.c +++ b/hermit/kernel/main.c @@ -95,8 +95,6 @@ extern int32_t possible_isles; extern uint32_t boot_processor; extern volatile int libc_sd; -uint32_t idle_poll = 1; - islelock_t* rcce_lock = NULL; rcce_mpb_t* rcce_mpb = NULL; @@ -307,10 +305,7 @@ int smp_main(void) while(1) { check_workqueues(); - if (idle_poll) - PAUSE; - else - HALT; + wait_for_task(); } return 0; @@ -615,10 +610,7 @@ int hermit_main(void) while(1) { check_workqueues(); - if (idle_poll) - PAUSE; - else - HALT; + wait_for_task(); } return 0; diff --git a/hermit/kernel/syscall.c b/hermit/kernel/syscall.c index 4f110f682..33e567081 100644 --- a/hermit/kernel/syscall.c +++ b/hermit/kernel/syscall.c @@ -50,7 +50,6 @@ extern spinlock_irqsave_t stdio_lock; extern int32_t isle; extern int32_t possible_isles; extern volatile int libc_sd; -extern uint32_t idle_poll; tid_t sys_getpid(void) { @@ -99,9 +98,7 @@ void NORETURN sys_exit(int arg) reschedule(); lwip_close(s); - idle_poll = 0; } else { - idle_poll = 0; spinlock_irqsave_unlock(&lwip_lock); } diff --git a/hermit/kernel/tasks.c b/hermit/kernel/tasks.c index 7f87c59aa..982d7e9c7 100644 --- a/hermit/kernel/tasks.c +++ b/hermit/kernel/tasks.c @@ -232,6 +232,12 @@ uint32_t get_highest_priority(void) } +void* get_readyqueue(void) +{ + return &readyqueues[CORE_ID]; +} + + int multitasking_init(void) { uint32_t core_id = CORE_ID;