• Isaku Yamahata's avatar
    KVM: Drop kvm_count_lock and instead protect kvm_usage_count with kvm_lock · 0bf50497
    Isaku Yamahata authored
    Drop kvm_count_lock and instead protect kvm_usage_count with kvm_lock now
    that KVM hooks CPU hotplug during the ONLINE phase, which can sleep.
    Previously, KVM hooked the STARTING phase, which is not allowed to sleep
    and thus could not take kvm_lock (a mutex).  This effectively allows the
    task that's initiating hardware enabling/disabling to preempted and/or
    migrated.
    
    Note, the Documentation/virt/kvm/locking.rst statement that kvm_count_lock
    is "raw" because hardware enabling/disabling needs to be atomic with
    respect to migration is wrong on multiple fronts.  First, while regular
    spinlocks can be preempted, the task holding the lock cannot be migrated.
    Second, preventing migration is not required.  on_each_cpu() disables
    preemption, which ensures that cpus_hardware_enabled correctly reflects
    hardware state.  The task may be preempted/migrated between bumping
    kvm_usage_count and invoking on_each_cpu(), but that's perfectly ok as
    kvm_usage_count is still protected, e.g. other tasks that call
    hardware_enable_all() will be blocked until the preempted/migrated owner
    exits its critical section.
    
    KVM does have lockless accesses to kvm_usage_count in the suspend/resume
    flows, but those are safe because all tasks must be frozen prior to
    suspending CPUs, and a task cannot be frozen while it holds one or more
    locks (userspace tasks are frozen via a fake signal).
    
    Preemption doesn't need to be explicitly disabled in the hotplug path.
    The hotplug thread is pinned to the CPU that's being hotplugged, and KVM
    only cares about having a stable CPU, i.e. to ensure hardware is enabled
    on the correct CPU.  Lockep, i.e. check_preemption_disabled(), plays nice
    with this state too, as is_percpu_thread() is true for the hotplug thread.
    Signed-off-by: default avatarIsaku Yamahata <isaku.yamahata@intel.com>
    Co-developed-by: default avatarSean Christopherson <seanjc@google.com>
    Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
    Message-Id: <20221130230934.1014142-45-seanjc@google.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    0bf50497
locking.rst 13.5 KB