On 10/3/19 10:02 AM, Zhenzhong Duan wrote: > void __init kvm_spinlock_init(void) > { > - /* Does host kernel support KVM_FEATURE_PV_UNHALT? */ > - if (!kvm_para_has_feature(KVM_FEATURE_PV_UNHALT)) > - return; > - > - if (kvm_para_has_hint(KVM_HINTS_REALTIME)) > + /* > + * Don't use the pvqspinlock code if no KVM_FEATURE_PV_UNHALT feature > + * support, or there is REALTIME hints or only 1 vCPU. > + */ > + if (!kvm_para_has_feature(KVM_FEATURE_PV_UNHALT) || > + kvm_para_has_hint(KVM_HINTS_REALTIME) || > + num_possible_cpus() == 1) { > + pr_info("PV spinlocks disabled\n"); > return; > + } > > - /* Don't use the pvqspinlock code if there is only 1 vCPU. */ > - if (num_possible_cpus() == 1) > + if (nopvspin) { > + pr_info("PV spinlocks disabled forced by \"nopvspin\" parameter.\n"); > + static_branch_disable(&virt_spin_lock_key); Would it make sense to bring here the other site where the key is disabled (in kvm_smp_prepare_cpus())? (and, in fact, shouldn't all of the checks that result in early return above disable the key?) -boris > return; > + } > + pr_info("PV spinlocks enabled\n"); > > __pv_init_lock_hash(); > pv_ops.lock.queued_spin_lock_slowpath = __pv_queued_spin_lock_slowpath; >