hv: sched: decouple idle stuff from schedule module

Let init thread end with run_idle_thread(), then idle thread take over and
start to do scheduling.
Change enter_guest_mode() to init_guest_mode() as run_idle_thread() is removed
out of it. Also add run_thread() in schedule module to run
thread_object's thread loop directly.

rename: switch_to_idle -> run_idle_thread

Tracked-On: #3813
Signed-off-by: Shuo A Liu <shuo.a.liu@intel.com>
Acked-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
Shuo A Liu 2019-10-16 19:16:37 +08:00 committed by ACRN System Integration
parent 27163df9b1
commit 0f70a5ca3a
5 changed files with 36 additions and 32 deletions

View File

@ -611,7 +611,7 @@ static uint64_t build_stack_frame(struct acrn_vcpu *vcpu)
frame -= 1;
frame->magic = SP_BOTTOM_MAGIC;
frame->rip = (uint64_t)run_sched_thread; /*return address*/
frame->rip = (uint64_t)vcpu->thread_obj.thread_entry; /*return address*/
frame->rflag = 0UL;
frame->rbx = 0UL;
frame->rbp = 0UL;

View File

@ -49,16 +49,11 @@ static void init_debug_post(uint16_t pcpu_id)
}
/*TODO: move into guest-vcpu module */
static void enter_guest_mode(uint16_t pcpu_id)
static void init_guest_mode(uint16_t pcpu_id)
{
vmx_on();
launch_vms(pcpu_id);
switch_to_idle(default_idle);
/* Control should not come here */
cpu_dead();
}
static void init_primary_pcpu_post(void)
@ -71,7 +66,9 @@ static void init_primary_pcpu_post(void)
init_debug_post(BOOT_CPU_ID);
enter_guest_mode(BOOT_CPU_ID);
init_guest_mode(BOOT_CPU_ID);
run_idle_thread();
}
/* NOTE: this function is using temp stack, and after SWITCH_TO(runtime_sp, to)
@ -101,5 +98,7 @@ void init_secondary_pcpu(void)
init_debug_post(pcpu_id);
enter_guest_mode(pcpu_id);
init_guest_mode(pcpu_id);
run_idle_thread();
}

View File

@ -11,6 +11,7 @@
#include <irq.h>
#include <schedule.h>
#include <profiling.h>
#include <sprintf.h>
#include <trace.h>
#include <logmsg.h>
@ -90,3 +91,22 @@ void default_idle(__unused struct thread_object *obj)
}
}
}
void run_idle_thread(void)
{
uint16_t pcpu_id = get_pcpu_id();
struct thread_object *idle = &per_cpu(idle, pcpu_id);
char idle_name[16];
snprintf(idle_name, 16U, "idle%hu", pcpu_id);
(void)strncpy_s(idle->name, 16U, idle_name, 16U);
idle->pcpu_id = pcpu_id;
idle->thread_entry = default_idle;
idle->switch_out = NULL;
idle->switch_in = NULL;
run_thread(idle);
/* Control should not come here */
cpu_dead();
}

View File

@ -194,29 +194,14 @@ void wake_thread(struct thread_object *obj)
release_schedule_lock(pcpu_id);
}
void run_sched_thread(struct thread_object *obj)
void run_thread(struct thread_object *obj)
{
get_schedule_lock(obj->pcpu_id);
get_cpu_var(sched_ctl).curr_obj = obj;
set_thread_status(obj, THREAD_STS_RUNNING);
release_schedule_lock(obj->pcpu_id);
if (obj->thread_entry != NULL) {
obj->thread_entry(obj);
}
ASSERT(false, "Shouldn't go here, invalid thread entry!");
}
void switch_to_idle(thread_entry_t idle_thread)
{
uint16_t pcpu_id = get_pcpu_id();
struct thread_object *idle = &per_cpu(idle, pcpu_id);
char idle_name[16];
snprintf(idle_name, 16U, "idle%hu", pcpu_id);
(void)strncpy_s(idle->name, 16U, idle_name, 16U);
idle->pcpu_id = pcpu_id;
idle->thread_entry = idle_thread;
idle->switch_out = NULL;
idle->switch_in = NULL;
get_cpu_var(sched_ctl).curr_obj = idle;
set_thread_status(idle, THREAD_STS_RUNNING);
run_sched_thread(idle);
}

View File

@ -53,7 +53,6 @@ uint16_t sched_get_pcpuid(const struct thread_object *obj);
struct thread_object *sched_get_current(uint16_t pcpu_id);
void init_sched(uint16_t pcpu_id);
void switch_to_idle(thread_entry_t idle_thread);
void get_schedule_lock(uint16_t pcpu_id);
void release_schedule_lock(uint16_t pcpu_id);
@ -63,11 +62,12 @@ void remove_thread_obj(struct thread_object *obj, uint16_t pcpu_id);
void make_reschedule_request(uint16_t pcpu_id, uint16_t delmode);
bool need_reschedule(uint16_t pcpu_id);
void run_thread(struct thread_object *obj);
void sleep_thread(struct thread_object *obj);
void wake_thread(struct thread_object *obj);
void schedule(void);
void run_sched_thread(struct thread_object *obj);
void arch_switch_to(void *prev_sp, void *next_sp);
void run_idle_thread(void);
#endif /* SCHEDULE_H */