diff --git a/doc/developer-guides/hld/hv-cpu-virt.rst b/doc/developer-guides/hld/hv-cpu-virt.rst index 396434e14..56d8a6b2a 100644 --- a/doc/developer-guides/hld/hv-cpu-virt.rst +++ b/doc/developer-guides/hld/hv-cpu-virt.rst @@ -159,10 +159,7 @@ lifecycle: .. doxygenfunction:: create_vcpu :project: Project ACRN -.. doxygenfunction:: pause_vcpu - :project: Project ACRN - -.. doxygenfunction:: resume_vcpu +.. doxygenfunction:: zombie_vcpu :project: Project ACRN .. doxygenfunction:: reset_vcpu diff --git a/hypervisor/arch/x86/guest/vcpu.c b/hypervisor/arch/x86/guest/vcpu.c index f35453d21..0056bbe83 100644 --- a/hypervisor/arch/x86/guest/vcpu.c +++ b/hypervisor/arch/x86/guest/vcpu.c @@ -719,17 +719,18 @@ void reset_vcpu(struct acrn_vcpu *vcpu, enum reset_mode mode) vcpu_set_state(vcpu, VCPU_INIT); } -void pause_vcpu(struct acrn_vcpu *vcpu, enum vcpu_state new_state) +void zombie_vcpu(struct acrn_vcpu *vcpu, enum vcpu_state new_state) { + enum vcpu_state prev_state; uint16_t pcpu_id = pcpuid_from_vcpu(vcpu); pr_dbg("vcpu%hu paused, new state: %d", vcpu->vcpu_id, new_state); if (((vcpu->state == VCPU_RUNNING) || (vcpu->state == VCPU_INIT)) && (new_state == VCPU_ZOMBIE)) { - vcpu->prev_state = vcpu->state; + prev_state = vcpu->state; vcpu_set_state(vcpu, new_state); - if (vcpu->prev_state == VCPU_RUNNING) { + if (prev_state == VCPU_RUNNING) { sleep_thread(&vcpu->thread_obj); } if (pcpu_id != get_pcpu_id()) { @@ -740,22 +741,6 @@ void pause_vcpu(struct acrn_vcpu *vcpu, enum vcpu_state new_state) } } -int32_t resume_vcpu(struct acrn_vcpu *vcpu) -{ - int32_t ret = -1; - - pr_dbg("vcpu%hu resumed", vcpu->vcpu_id); - - if (vcpu->state == VCPU_PAUSED) { - vcpu_set_state(vcpu, vcpu->prev_state); - if (vcpu->state == VCPU_RUNNING) { - wake_thread(&vcpu->thread_obj); - } - ret = 0; - } - return ret; -} - void save_xsave_area(struct ext_context *ectx) { ectx->xcr0 = read_xcr(0); diff --git a/hypervisor/arch/x86/guest/vlapic.c b/hypervisor/arch/x86/guest/vlapic.c index 8c89d3546..c3ea3285a 100644 --- a/hypervisor/arch/x86/guest/vlapic.c +++ b/hypervisor/arch/x86/guest/vlapic.c @@ -1110,7 +1110,7 @@ vlapic_process_init_sipi(struct acrn_vcpu* target_vcpu, uint32_t mode, uint32_t if (target_vcpu->state != VCPU_INIT) { /* put target vcpu to INIT state and wait for SIPI */ - pause_vcpu(target_vcpu, VCPU_ZOMBIE); + zombie_vcpu(target_vcpu, VCPU_ZOMBIE); reset_vcpu(target_vcpu, INIT_RESET); } /* new cpu model only need one SIPI to kick AP run, diff --git a/hypervisor/arch/x86/guest/vm.c b/hypervisor/arch/x86/guest/vm.c index 655f95740..8b3bfc50f 100644 --- a/hypervisor/arch/x86/guest/vm.c +++ b/hypervisor/arch/x86/guest/vm.c @@ -698,7 +698,7 @@ void pause_vm(struct acrn_vm *vm) ((is_rt_vm(vm)) && (vm->state == VM_READY_TO_POWEROFF)) || (vm->state == VM_CREATED)) { foreach_vcpu(i, vm, vcpu) { - pause_vcpu(vcpu, VCPU_ZOMBIE); + zombie_vcpu(vcpu, VCPU_ZOMBIE); } vm->state = VM_PAUSED; } diff --git a/hypervisor/common/hv_main.c b/hypervisor/common/hv_main.c index caab25e22..1fab9b8c1 100644 --- a/hypervisor/common/hv_main.c +++ b/hypervisor/common/hv_main.c @@ -35,7 +35,7 @@ void vcpu_thread(struct thread_object *obj) ret = acrn_handle_pending_request(vcpu); if (ret < 0) { pr_fatal("vcpu handling pending request fail"); - pause_vcpu(vcpu, VCPU_ZOMBIE); + zombie_vcpu(vcpu, VCPU_ZOMBIE); /* Fatal error happened (triple fault). Stop the vcpu running. */ continue; } @@ -47,7 +47,7 @@ void vcpu_thread(struct thread_object *obj) ret = run_vcpu(vcpu); if (ret != 0) { pr_fatal("vcpu resume failed"); - pause_vcpu(vcpu, VCPU_ZOMBIE); + zombie_vcpu(vcpu, VCPU_ZOMBIE); /* Fatal error happened (resume vcpu failed). Stop the vcpu running. */ continue; } diff --git a/hypervisor/common/hypercall.c b/hypervisor/common/hypercall.c index 2ad316d95..74f3c8a77 100644 --- a/hypervisor/common/hypercall.c +++ b/hypervisor/common/hypercall.c @@ -64,7 +64,7 @@ int32_t hcall_sos_offline_cpu(struct acrn_vm *vm, uint64_t lapicid) ret = -1; break; } - pause_vcpu(vcpu, VCPU_ZOMBIE); + zombie_vcpu(vcpu, VCPU_ZOMBIE); offline_vcpu(vcpu); } } diff --git a/hypervisor/debug/shell.c b/hypervisor/debug/shell.c index c698bf37f..f441343ee 100644 --- a/hypervisor/debug/shell.c +++ b/hypervisor/debug/shell.c @@ -655,9 +655,6 @@ static int32_t shell_list_vcpu(__unused int32_t argc, __unused char **argv) case VCPU_INIT: (void)strncpy_s(vcpu_state_str, 32U, "Init", 32U); break; - case VCPU_PAUSED: - (void)strncpy_s(vcpu_state_str, 32U, "Paused", 32U); - break; case VCPU_RUNNING: (void)strncpy_s(vcpu_state_str, 32U, "Running", 32U); break; diff --git a/hypervisor/include/arch/x86/guest/vcpu.h b/hypervisor/include/arch/x86/guest/vcpu.h index d51b1c25e..ffd301adc 100644 --- a/hypervisor/include/arch/x86/guest/vcpu.h +++ b/hypervisor/include/arch/x86/guest/vcpu.h @@ -136,7 +136,6 @@ enum vcpu_state { VCPU_OFFLINE = 0U, VCPU_INIT, VCPU_RUNNING, - VCPU_PAUSED, VCPU_ZOMBIE, }; @@ -256,8 +255,6 @@ struct acrn_vcpu { uint16_t vcpu_id; /* virtual identifier for VCPU */ struct acrn_vm *vm; /* Reference to the VM this VCPU belongs to */ - /* State of this VCPU before suspend */ - volatile enum vcpu_state prev_state; volatile enum vcpu_state state; /* State of this VCPU */ struct thread_object thread_obj; @@ -634,25 +631,14 @@ void reset_vcpu(struct acrn_vcpu *vcpu, enum reset_mode mode); /** * @brief pause the vcpu and set new state * - * Change a vCPU state to VCPU_PAUSED or VCPU_ZOMBIE, and make a reschedule request for it. + * Change a vCPU state to VCPU_ZOMBIE, and make a reschedule request for it. * * @param[inout] vcpu pointer to vcpu data structure * @param[in] new_state the state to set vcpu * * @return None */ -void pause_vcpu(struct acrn_vcpu *vcpu, enum vcpu_state new_state); - -/** - * @brief resume the vcpu - * - * Change a vCPU state to VCPU_RUNNING, and make a reschedule request for it. - * - * @param[inout] vcpu pointer to vcpu data structure - * - * @return 0 on success, -1 on failure. - */ -int32_t resume_vcpu(struct acrn_vcpu *vcpu); +void zombie_vcpu(struct acrn_vcpu *vcpu, enum vcpu_state new_state); /** * @brief set the vcpu to running state, then it will be scheculed.