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
199Parameters: vcpu id (apic id on x86)199Parameters: vcpu id (apic id on x86)
200Returns: vcpu fd on success, -1 on error200Returns: vcpu fd on success, -1 on error
201 201
202This API adds a vcpu to a virtual machine. The vcpu id is a small integer202This API adds a vcpu to a virtual machine. No more than max_vcpus may be added.
203in the range [0, max_vcpus).203The vcpu id is an integer in the range [0, max_vcpu_id).
204 204
205The recommended max_vcpus value can be retrieved using the KVM_CAP_NR_VCPUS of205The recommended max_vcpus value can be retrieved using the KVM_CAP_NR_VCPUS of
206the KVM_CHECK_EXTENSION ioctl() at run-time.206the KVM_CHECK_EXTENSION ioctl() at run-time.
@@ -212,6 +212,12 @@ cpus max. · 5 unmodified lines
212If the KVM_CAP_MAX_VCPUS does not exist, you should assume that max_vcpus is212If the KVM_CAP_MAX_VCPUS does not exist, you should assume that max_vcpus is
213same as the value returned from KVM_CAP_NR_VCPUS.213same as the value returned from KVM_CAP_NR_VCPUS.
214 214
215The maximum possible value for max_vcpu_id can be retrieved using the
216KVM_CAP_MAX_VCPU_ID of the KVM_CHECK_EXTENSION ioctl() at run-time.
217
218If the KVM_CAP_MAX_VCPU_ID does not exist, you should assume that max_vcpu_id
219is the same as the value returned from KVM_CAP_MAX_VCPUS.
220
215On powerpc using book3s_hv mode, the vcpus are mapped onto virtual221On powerpc using book3s_hv mode, the vcpus are mapped onto virtual
216threads in one or more virtual CPU cores. (This is because the222threads in one or more virtual CPU cores. (This is because the
217hardware requires all the hardware threads in a CPU core to be in the223hardware 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
40#define KVM_MAX_VCORES NR_CPUS40#define KVM_MAX_VCORES NR_CPUS
41#define KVM_USER_MEM_SLOTS 51241#define KVM_USER_MEM_SLOTS 512
42 42
43#include <asm/cputhreads.h>
44#define KVM_MAX_VCPU_ID (threads_per_subcore * KVM_MAX_VCORES)
45
43#ifdef CONFIG_KVM_MMIO46#ifdef CONFIG_KVM_MMIO
44#define KVM_COALESCED_MMIO_PAGE_OFFSET 147#define KVM_COALESCED_MMIO_PAGE_OFFSET 1
45#endif48#endif
include/linux/kvm_host.h+4−0
@@ -35,6 +35,10 @@ · 34 unmodified lines
35 35
36#include <asm/kvm_host.h>36#include <asm/kvm_host.h>
37 37
38#ifndef KVM_MAX_VCPU_ID
39#define KVM_MAX_VCPU_ID KVM_MAX_VCPUS
40#endif
41
38/*42/*
39 * The bit 16 ~ bit 31 of kvm_memory_region::flags are internally used43 * The bit 16 ~ bit 31 of kvm_memory_region::flags are internally used
40 * in kvm, other bits are visible for userspace which are defined in44 * 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
865#define KVM_CAP_SPAPR_TCE_64 125865#define KVM_CAP_SPAPR_TCE_64 125
866#define KVM_CAP_ARM_PMU_V3 126866#define KVM_CAP_ARM_PMU_V3 126
867#define KVM_CAP_VCPU_ATTRIBUTES 127867#define KVM_CAP_VCPU_ATTRIBUTES 127
868#define KVM_CAP_MAX_VCPU_ID 128
868 869
869#ifdef KVM_CAP_IRQ_ROUTING870#ifdef KVM_CAP_IRQ_ROUTING
870 871
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
2272 int r;2272 int r;
2273 struct kvm_vcpu *vcpu;2273 struct kvm_vcpu *vcpu;
2274 2274
2275 if (id >= KVM_MAX_VCPUS)2275 if (id >= KVM_MAX_VCPU_ID)
2276 return -EINVAL;2276 return -EINVAL;
2277 2277
2278 vcpu = kvm_arch_vcpu_create(kvm, id);2278 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
2746 case KVM_CAP_MULTI_ADDRESS_SPACE:2746 case KVM_CAP_MULTI_ADDRESS_SPACE:
2747 return KVM_ADDRESS_SPACE_NUM;2747 return KVM_ADDRESS_SPACE_NUM;
2748#endif2748#endif
2749 case KVM_CAP_MAX_VCPU_ID:
2750 return KVM_MAX_VCPU_ID;
2749 default:2751 default:
2750 break;2752 break;
2751 }2753 }