mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-22 13:37:10 +00:00
hv: remove 'running' from vcpu structure
vcpu->running is duplicated with THREAD_STS_RUNNING status of thread object. Introduce an API sleep_thread_sync(), which can utilize the inner status of thread object, to do the sync sleep for zombie_vcpu(). Tracked-On: #5057 Signed-off-by: Conghui Chen <conghui.chen@intel.com> Reviewed-by: Shuo A Liu <shuo.a.liu@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
parent
2abbb99f6a
commit
b6422f8985
@ -200,7 +200,6 @@ static void vcpu_reset_internal(struct acrn_vcpu *vcpu, enum reset_mode mode)
|
||||
struct acrn_vlapic *vlapic;
|
||||
|
||||
vcpu->launched = false;
|
||||
vcpu->running = false;
|
||||
vcpu->arch.nr_sipi = 0U;
|
||||
|
||||
vcpu->arch.exception_info.exception = VECTOR_INVALID;
|
||||
@ -731,11 +730,10 @@ void zombie_vcpu(struct acrn_vcpu *vcpu, enum vcpu_state new_state)
|
||||
vcpu_set_state(vcpu, new_state);
|
||||
|
||||
if (prev_state == VCPU_RUNNING) {
|
||||
sleep_thread(&vcpu->thread_obj);
|
||||
}
|
||||
if (pcpu_id != get_pcpu_id()) {
|
||||
while (vcpu->running) {
|
||||
asm_pause();
|
||||
if (pcpu_id == get_pcpu_id()) {
|
||||
sleep_thread(&vcpu->thread_obj);
|
||||
} else {
|
||||
sleep_thread_sync(&vcpu->thread_obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -772,8 +770,6 @@ static void context_switch_out(struct thread_object *prev)
|
||||
ectx->ia32_kernel_gs_base = msr_read(MSR_IA32_KERNEL_GS_BASE);
|
||||
|
||||
save_xsave_area(ectx);
|
||||
|
||||
vcpu->running = false;
|
||||
}
|
||||
|
||||
static void context_switch_in(struct thread_object *next)
|
||||
@ -789,8 +785,6 @@ static void context_switch_in(struct thread_object *next)
|
||||
msr_write(MSR_IA32_KERNEL_GS_BASE, ectx->ia32_kernel_gs_base);
|
||||
|
||||
rstore_xsave_area(ectx);
|
||||
|
||||
vcpu->running = true;
|
||||
}
|
||||
|
||||
|
||||
|
@ -213,6 +213,14 @@ void sleep_thread(struct thread_object *obj)
|
||||
release_schedule_lock(pcpu_id, rflag);
|
||||
}
|
||||
|
||||
void sleep_thread_sync(struct thread_object *obj)
|
||||
{
|
||||
sleep_thread(obj);
|
||||
while (!is_blocked(obj)) {
|
||||
asm_pause();
|
||||
}
|
||||
}
|
||||
|
||||
void wake_thread(struct thread_object *obj)
|
||||
{
|
||||
uint16_t pcpu_id = obj->pcpu_id;
|
||||
|
@ -265,7 +265,6 @@ struct acrn_vcpu {
|
||||
|
||||
struct thread_object thread_obj;
|
||||
bool launched; /* Whether the vcpu is launched on target pcpu */
|
||||
volatile bool running; /* vcpu is picked up and run? */
|
||||
|
||||
struct instr_emul_ctxt inst_ctxt;
|
||||
struct io_request req; /* used by io/ept emulation */
|
||||
|
@ -114,6 +114,7 @@ bool need_reschedule(uint16_t pcpu_id);
|
||||
|
||||
void run_thread(struct thread_object *obj);
|
||||
void sleep_thread(struct thread_object *obj);
|
||||
void sleep_thread_sync(struct thread_object *obj);
|
||||
void wake_thread(struct thread_object *obj);
|
||||
void kick_thread(const struct thread_object *obj);
|
||||
void yield_current(void);
|
||||
|
Loading…
Reference in New Issue
Block a user