• Chao Gao's avatar
    KVM: Disable CPU hotplug during hardware enabling/disabling · e4aa7f88
    Chao Gao authored
    Disable CPU hotplug when enabling/disabling hardware to prevent the
    corner case where if the following sequence occurs:
    
      1. A hotplugged CPU marks itself online in cpu_online_mask
      2. The hotplugged CPU enables interrupt before invoking KVM's ONLINE
         callback
      3  hardware_{en,dis}able_all() is invoked on another CPU
    
    the hotplugged CPU will be included in on_each_cpu() and thus get sent
    through hardware_{en,dis}able_nolock() before kvm_online_cpu() is called.
    
            start_secondary { ...
                    set_cpu_online(smp_processor_id(), true); <- 1
                    ...
                    local_irq_enable();  <- 2
                    ...
                    cpu_startup_entry(CPUHP_AP_ONLINE_IDLE); <- 3
            }
    
    KVM currently fudges around this race by keeping track of which CPUs have
    done hardware enabling (see commit 1b6c0168 "KVM: Keep track of which
    cpus have virtualization enabled"), but that's an inefficient, convoluted,
    and hacky solution.
    Signed-off-by: default avatarChao Gao <chao.gao@intel.com>
    [sean: split to separate patch, write changelog]
    Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
    Message-Id: <20221130230934.1014142-43-seanjc@google.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    e4aa7f88
kvm_main.c 153 KB