On Fri, Sep 03, 2021 at 03:08:07PM +0200, Juergen Gross wrote: > Today the maximum number of vcpus of a kvm guest is set via a #define > in a header file. > > In order to support higher vcpu numbers for guests without generally > increasing the memory consumption of guests on the host especially on > very large systems add a boot parameter for specifying the number of > allowed vcpus for guests. > > The default will still be the current setting of 288. The value 0 has > the special meaning to limit the number of possible vcpus to the > number of possible cpus of the host. > > Signed-off-by: Juergen Gross <jgross@xxxxxxxx> > --- > Documentation/admin-guide/kernel-parameters.txt | 7 +++++++ > arch/x86/include/asm/kvm_host.h | 5 ++++- > arch/x86/kvm/x86.c | 9 ++++++++- > 3 files changed, 19 insertions(+), 2 deletions(-) > > diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt > index 37e194299311..b9641c9989ef 100644 > --- a/Documentation/admin-guide/kernel-parameters.txt > +++ b/Documentation/admin-guide/kernel-parameters.txt > @@ -2435,6 +2435,13 @@ > feature (tagged TLBs) on capable Intel chips. > Default is 1 (enabled) > > + kvm.max_vcpus= [KVM,X86] Set the maximum allowed numbers of vcpus per > + guest. The special value 0 sets the limit to the number > + of physical cpus possible on the host (including not > + yet hotplugged cpus). Higher values will result in > + slightly higher memory consumption per guest. > + Default: 288 > + > kvm.vcpu_id_add_bits= > [KVM,X86] The vcpu-ids of guests are sparse, as they > are constructed by bit-wise concatenation of the ids of > diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h > index 6c28d0800208..a4ab387b0e1c 100644 > --- a/arch/x86/include/asm/kvm_host.h > +++ b/arch/x86/include/asm/kvm_host.h > @@ -38,7 +38,8 @@ > > #define __KVM_HAVE_ARCH_VCPU_DEBUGFS > > -#define KVM_MAX_VCPUS 288 > +#define KVM_DEFAULT_MAX_VCPUS 288 > +#define KVM_MAX_VCPUS max_vcpus > #define KVM_SOFT_MAX_VCPUS 240 > #define KVM_MAX_VCPU_ID kvm_max_vcpu_id() > /* memory slots that are not exposed to userspace */ > @@ -1588,6 +1589,8 @@ extern u64 kvm_max_tsc_scaling_ratio; > extern u64 kvm_default_tsc_scaling_ratio; > /* bus lock detection supported? */ > extern bool kvm_has_bus_lock_exit; > +/* maximum number of vcpus per guest */ > +extern unsigned int max_vcpus; > /* maximum vcpu-id */ > unsigned int kvm_max_vcpu_id(void); > > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index ff142b6dd00c..49c3d91c559e 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -188,9 +188,13 @@ module_param(pi_inject_timer, bint, S_IRUGO | S_IWUSR); > static int __read_mostly vcpu_id_add_bits = -1; > module_param(vcpu_id_add_bits, int, S_IRUGO); > > +unsigned int __read_mostly max_vcpus = KVM_DEFAULT_MAX_VCPUS; > +module_param(max_vcpus, uint, S_IRUGO); > +EXPORT_SYMBOL_GPL(max_vcpus); > + > unsigned int kvm_max_vcpu_id(void) > { > - int n_bits = fls(KVM_MAX_VCPUS - 1); > + int n_bits = fls(max_vcpus - 1); A quesintion here: the parameter "vcpu_id_add_bits" also depends on the "max_vcpus", we can't calculate the "vcpu_id_add_bits" from "max_vcpus" because KVM has no topologically knowledge to determine bits needed for each socket/core/thread level, right? > > if (vcpu_id_add_bits < -1 || vcpu_id_add_bits > (32 - n_bits)) { > pr_err("Invalid value of vcpu_id_add_bits=%d parameter!\n", > @@ -11033,6 +11037,9 @@ int kvm_arch_hardware_setup(void *opaque) > if (boot_cpu_has(X86_FEATURE_XSAVES)) > rdmsrl(MSR_IA32_XSS, host_xss); > > + if (max_vcpus == 0) > + max_vcpus = num_possible_cpus(); > + > kvm_pcpu_vcpu_mask = __alloc_percpu(KVM_VCPU_MASK_SZ, > sizeof(unsigned long)); > kvm_hv_vp_bitmap = __alloc_percpu(KVM_HV_VPMAP_SZ, sizeof(u64)); > -- > 2.26.2 >