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:
parent
acb9f95a7c
commit
4df28c9352
@ -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,8 +1120,10 @@ 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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user