On 06.09.21 02:45, Yao Yuan wrote: > 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 >> --- >> 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? Correct. Juergen