History

kvm: introduce KVM_MAX_VCPU_ID

The KVM_MAX_VCPUS define provides the maximum number of vCPUs per guest, and also the upper limit for vCPU ids. This is okay for all archs except PowerPC which can have higher ids, depending on the cpu/core/thread topology. In the worst case (single threaded guest, host with 8 threads per core), it limits the maximum number of vCPUS to KVM_MAX_VCPUS / 8. This patch separates the vCPU numbering from the total number of vCPUs, with the introduction of KVM_MAX_VCPU_ID, as the maximal valid value for vCPU ids plus one. The corresponding KVM_CAP_MAX_VCPU_ID allows userspace to validate vCPU ids before passing them to KVM_CREATE_VCPU. This patch only implements KVM_MAX_VCPU_ID with a specific value for PowerPC. Other archs continue to return KVM_MAX_VCPUS instead.

Greg Kurz committed 10 years ago

Commit 0b1b1df1 parent 9b9e3fc5 files · +19 −3Browse files

Unified · Split

5 files
  1. Documentation/virtual/kvm/api.txt +8 −2
  2. arch/powerpc/include/asm/kvm_host.h +3 −0
  3. include/linux/kvm_host.h +4 −0
  4. include/uapi/linux/kvm.h +1 −0
  5. virt/kvm/kvm_main.c +3 −1
Documentation/virtual/kvm/api.txt+8−2
@@ -199,8 +199,8 @@ Type: vm ioctl · 198 unmodified lines
199199 Parameters: vcpu id (apic id on x86)
200200 Returns: vcpu fd on success, -1 on error
201201
202−This API adds a vcpu to a virtual machine. The vcpu id is a small integer
203−in the range [0, max_vcpus).
202+This API adds a vcpu to a virtual machine. No more than max_vcpus may be added.
203+The vcpu id is an integer in the range [0, max_vcpu_id).
204204
205205 The recommended max_vcpus value can be retrieved using the KVM_CAP_NR_VCPUS of
206206 the KVM_CHECK_EXTENSION ioctl() at run-time.
@@ -212,6 +212,12 @@ cpus max. · 5 unmodified lines
212212 If the KVM_CAP_MAX_VCPUS does not exist, you should assume that max_vcpus is
213213 same as the value returned from KVM_CAP_NR_VCPUS.
214214
215+The maximum possible value for max_vcpu_id can be retrieved using the
216+KVM_CAP_MAX_VCPU_ID of the KVM_CHECK_EXTENSION ioctl() at run-time.
217+
218+If the KVM_CAP_MAX_VCPU_ID does not exist, you should assume that max_vcpu_id
219+is the same as the value returned from KVM_CAP_MAX_VCPUS.
220+
215221 On powerpc using book3s_hv mode, the vcpus are mapped onto virtual
216222 threads in one or more virtual CPU cores. (This is because the
217223 hardware requires all the hardware threads in a CPU core to be in the
arch/powerpc/include/asm/kvm_host.h+3−0
@@ -40,6 +40,9 @@ · 39 unmodified lines
4040 #define KVM_MAX_VCORES NR_CPUS
4141 #define KVM_USER_MEM_SLOTS 512
4242
43+#include <asm/cputhreads.h>
44+#define KVM_MAX_VCPU_ID (threads_per_subcore * KVM_MAX_VCORES)
45+
4346 #ifdef CONFIG_KVM_MMIO
4447 #define KVM_COALESCED_MMIO_PAGE_OFFSET 1
4548 #endif
include/linux/kvm_host.h+4−0
@@ -35,6 +35,10 @@ · 34 unmodified lines
3535
3636 #include <asm/kvm_host.h>
3737
38+#ifndef KVM_MAX_VCPU_ID
39+#define KVM_MAX_VCPU_ID KVM_MAX_VCPUS
40+#endif
41+
3842 /*
3943 * The bit 16 ~ bit 31 of kvm_memory_region::flags are internally used
4044 * in kvm, other bits are visible for userspace which are defined in
include/uapi/linux/kvm.h+1−0
@@ -865,6 +865,7 @@ struct kvm_ppc_smmu_info { · 864 unmodified lines
865865 #define KVM_CAP_SPAPR_TCE_64 125
866866 #define KVM_CAP_ARM_PMU_V3 126
867867 #define KVM_CAP_VCPU_ATTRIBUTES 127
868+#define KVM_CAP_MAX_VCPU_ID 128
868869
869870 #ifdef KVM_CAP_IRQ_ROUTING
870871
virt/kvm/kvm_main.c+3−1
@@ -2272,7 +2272,7 @@ static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, u32 id) · 2271 unmodified lines
22722272 int r;
22732273 struct kvm_vcpu *vcpu;
22742274
2275− if (id >= KVM_MAX_VCPUS)
2275+ if (id >= KVM_MAX_VCPU_ID)
22762276 return -EINVAL;
22772277
22782278 vcpu = kvm_arch_vcpu_create(kvm, id);
@@ -2746,6 +2746,8 @@ static long kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg) · 467 unmodified lines
27462746 case KVM_CAP_MULTI_ADDRESS_SPACE:
27472747 return KVM_ADDRESS_SPACE_NUM;
27482748 #endif
2749+ case KVM_CAP_MAX_VCPU_ID:
2750+ return KVM_MAX_VCPU_ID;
27492751 default:
27502752 break;
27512753 }