• Marcelo Tosatti's avatar
    KVM: Fix kvm_vcpu_block() task state race · e5c239cf
    Marcelo Tosatti authored
    There's still a race in kvm_vcpu_block(), if a wake_up_interruptible()
    call happens before the task state is set to TASK_INTERRUPTIBLE:
    
    CPU0                            CPU1
    
    kvm_vcpu_block
    
    add_wait_queue
    
    kvm_cpu_has_interrupt = 0
                                    set interrupt
                                    if (waitqueue_active())
                                            wake_up_interruptible()
    
    kvm_cpu_has_pending_timer
    kvm_arch_vcpu_runnable
    signal_pending
    
    set_current_state(TASK_INTERRUPTIBLE)
    schedule()
    
    Can be fixed by using prepare_to_wait() which sets the task state before
    testing for the wait condition.
    Signed-off-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
    Signed-off-by: default avatarAvi Kivity <avi@qumranet.com>
    e5c239cf
kvm_main.c 31.7 KB