@@ -29,4 +29,7 @@ void kvm_cpu__show_page_tables(struct kvm_cpu *vcpu);
void kvm_cpu__arch_nmi(struct kvm_cpu *cpu);
void kvm_cpu__run_on_all_cpus(struct kvm *kvm, struct kvm_cpu_task *task);
+void kvm_cpu__pause_vm(struct kvm_cpu *vcpu);
+void kvm_cpu__continue_vm(struct kvm_cpu *vcpu);
+
#endif /* KVM__KVM_CPU_H */
@@ -141,6 +141,22 @@ void kvm_cpu__run_on_all_cpus(struct kvm *kvm, struct kvm_cpu_task *task)
mutex_unlock(&task_lock);
}
+void kvm_cpu__pause_vm(struct kvm_cpu *vcpu)
+{
+ /*
+ * Mark the calling vCPU as paused to avoid waiting indefinitely for a
+ * signal exit.
+ */
+ vcpu->paused = true;
+ kvm__pause(vcpu->kvm);
+}
+
+void kvm_cpu__continue_vm(struct kvm_cpu *vcpu)
+{
+ vcpu->paused = false;
+ kvm__continue(vcpu->kvm);
+}
+
int kvm_cpu__start(struct kvm_cpu *cpu)
{
sigset_t sigset;
Pausing the VM from a vCPU thread is perilous with the current helpers, as it waits indefinitely for a signal that never comes when invoked from a vCPU thread. Instead, add a helper for pausing the VM from a vCPU, working around the issue by explicitly marking the caller as paused before proceeding. Signed-off-by: Oliver Upton <oliver.upton@linux.dev> --- include/kvm/kvm-cpu.h | 3 +++ kvm-cpu.c | 16 ++++++++++++++++ 2 files changed, 19 insertions(+)