WHPX: Use proper synchronization primitives while processing

WHPX wasn't using the proper synchronization primitives while
processing async events, which can cause issues with SMP.

Signed-off-by: Sunil Muthuswamy <sunilmut@microsoft.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Sunil Muthuswamy 2020-02-24 19:27:38 +00:00 committed by Paolo Bonzini
parent acb9f95a7c
commit 4df28c9352

View File

@ -905,9 +905,8 @@ static void whpx_vcpu_process_async_events(CPUState *cpu)
if ((cpu->interrupt_request & CPU_INTERRUPT_INIT) && if ((cpu->interrupt_request & CPU_INTERRUPT_INIT) &&
!(env->hflags & HF_SMM_MASK)) { !(env->hflags & HF_SMM_MASK)) {
whpx_cpu_synchronize_state(cpu);
do_cpu_init(x86_cpu); do_cpu_init(x86_cpu);
cpu->vcpu_dirty = true;
vcpu->interruptable = true; vcpu->interruptable = true;
} }
@ -923,17 +922,13 @@ static void whpx_vcpu_process_async_events(CPUState *cpu)
} }
if (cpu->interrupt_request & CPU_INTERRUPT_SIPI) { if (cpu->interrupt_request & CPU_INTERRUPT_SIPI) {
if (!cpu->vcpu_dirty) { whpx_cpu_synchronize_state(cpu);
whpx_get_registers(cpu);
}
do_cpu_sipi(x86_cpu); do_cpu_sipi(x86_cpu);
} }
if (cpu->interrupt_request & CPU_INTERRUPT_TPR) { if (cpu->interrupt_request & CPU_INTERRUPT_TPR) {
cpu->interrupt_request &= ~CPU_INTERRUPT_TPR; cpu->interrupt_request &= ~CPU_INTERRUPT_TPR;
if (!cpu->vcpu_dirty) { whpx_cpu_synchronize_state(cpu);
whpx_get_registers(cpu);
}
apic_handle_tpr_access_report(x86_cpu->apic_state, env->eip, apic_handle_tpr_access_report(x86_cpu->apic_state, env->eip,
env->tpr_access_type); env->tpr_access_type);
} }
@ -1125,9 +1120,11 @@ static int whpx_vcpu_run(CPUState *cpu)
static void do_whpx_cpu_synchronize_state(CPUState *cpu, run_on_cpu_data arg) static void do_whpx_cpu_synchronize_state(CPUState *cpu, run_on_cpu_data arg)
{ {
if (!cpu->vcpu_dirty) {
whpx_get_registers(cpu); whpx_get_registers(cpu);
cpu->vcpu_dirty = true; cpu->vcpu_dirty = true;
} }
}
static void do_whpx_cpu_synchronize_post_reset(CPUState *cpu, static void do_whpx_cpu_synchronize_post_reset(CPUState *cpu,
run_on_cpu_data arg) run_on_cpu_data arg)