Commit 4fc096a9 authored by Vitaly Kuznetsov's avatar Vitaly Kuznetsov Committed by Paolo Bonzini

KVM: Raise the maximum number of user memslots

Current KVM_USER_MEM_SLOTS limits are arch specific (512 on Power, 509 on x86,
32 on s390, 16 on MIPS) but they don't really need to be. Memory slots are
allocated dynamically in KVM when added so the only real limitation is
'id_to_index' array which is 'short'. We don't have any other
KVM_MEM_SLOTS_NUM/KVM_USER_MEM_SLOTS-sized statically defined structures.

Low KVM_USER_MEM_SLOTS can be a limiting factor for some configurations.
In particular, when QEMU tries to start a Windows guest with Hyper-V SynIC
enabled and e.g. 256 vCPUs the limit is hit as SynIC requires two pages per
vCPU and the guest is free to pick any GFN for each of them, this fragments
memslots as QEMU wants to have a separate memslot for each of these pages
(which are supposed to act as 'overlay' pages).
Signed-off-by: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
Message-Id: <20210127175731.2020089-3-vkuznets@redhat.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 281d9cd9
...@@ -30,7 +30,6 @@ ...@@ -30,7 +30,6 @@
#define __KVM_HAVE_ARCH_INTC_INITIALIZED #define __KVM_HAVE_ARCH_INTC_INITIALIZED
#define KVM_USER_MEM_SLOTS 512
#define KVM_HALT_POLL_NS_DEFAULT 500000 #define KVM_HALT_POLL_NS_DEFAULT 500000
#include <kvm/arm_vgic.h> #include <kvm/arm_vgic.h>
......
...@@ -83,7 +83,6 @@ ...@@ -83,7 +83,6 @@
#define KVM_MAX_VCPUS 16 #define KVM_MAX_VCPUS 16
#define KVM_USER_MEM_SLOTS 16
/* memory slots that does not exposed to userspace */ /* memory slots that does not exposed to userspace */
#define KVM_PRIVATE_MEM_SLOTS 0 #define KVM_PRIVATE_MEM_SLOTS 0
......
...@@ -28,7 +28,6 @@ ...@@ -28,7 +28,6 @@
#define KVM_MAX_VCPUS NR_CPUS #define KVM_MAX_VCPUS NR_CPUS
#define KVM_MAX_VCORES NR_CPUS #define KVM_MAX_VCORES NR_CPUS
#define KVM_USER_MEM_SLOTS 512
#include <asm/cputhreads.h> #include <asm/cputhreads.h>
......
...@@ -28,7 +28,6 @@ ...@@ -28,7 +28,6 @@
#define KVM_S390_BSCA_CPU_SLOTS 64 #define KVM_S390_BSCA_CPU_SLOTS 64
#define KVM_S390_ESCA_CPU_SLOTS 248 #define KVM_S390_ESCA_CPU_SLOTS 248
#define KVM_MAX_VCPUS 255 #define KVM_MAX_VCPUS 255
#define KVM_USER_MEM_SLOTS 32
/* /*
* These seem to be used for allocating ->chip in the routing table, which we * These seem to be used for allocating ->chip in the routing table, which we
......
...@@ -40,10 +40,8 @@ ...@@ -40,10 +40,8 @@
#define KVM_MAX_VCPUS 288 #define KVM_MAX_VCPUS 288
#define KVM_SOFT_MAX_VCPUS 240 #define KVM_SOFT_MAX_VCPUS 240
#define KVM_MAX_VCPU_ID 1023 #define KVM_MAX_VCPU_ID 1023
#define KVM_USER_MEM_SLOTS 509
/* memory slots that are not exposed to userspace */ /* memory slots that are not exposed to userspace */
#define KVM_PRIVATE_MEM_SLOTS 3 #define KVM_PRIVATE_MEM_SLOTS 3
#define KVM_MEM_SLOTS_NUM (KVM_USER_MEM_SLOTS + KVM_PRIVATE_MEM_SLOTS)
#define KVM_HALT_POLL_NS_DEFAULT 200000 #define KVM_HALT_POLL_NS_DEFAULT 200000
......
...@@ -425,9 +425,8 @@ struct kvm_irq_routing_table { ...@@ -425,9 +425,8 @@ struct kvm_irq_routing_table {
#define KVM_PRIVATE_MEM_SLOTS 0 #define KVM_PRIVATE_MEM_SLOTS 0
#endif #endif
#ifndef KVM_MEM_SLOTS_NUM #define KVM_MEM_SLOTS_NUM SHRT_MAX
#define KVM_MEM_SLOTS_NUM (KVM_USER_MEM_SLOTS + KVM_PRIVATE_MEM_SLOTS) #define KVM_USER_MEM_SLOTS (KVM_MEM_SLOTS_NUM - KVM_PRIVATE_MEM_SLOTS)
#endif
#ifndef __KVM_VCPU_MULTIPLE_ADDRESS_SPACE #ifndef __KVM_VCPU_MULTIPLE_ADDRESS_SPACE
static inline int kvm_arch_vcpu_memslots_id(struct kvm_vcpu *vcpu) static inline int kvm_arch_vcpu_memslots_id(struct kvm_vcpu *vcpu)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment