aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Kurz <gkurz@linux.vnet.ibm.com>2016-05-09 12:13:37 -0400
committerPaolo Bonzini <pbonzini@redhat.com>2016-05-11 16:37:54 -0400
commit0b1b1dfd52a67f4f09a18cb82337199bc90ad7fb (patch)
tree7d4ec00b96a96ef12fe3aeab042de758451e1bd4
parent9b9e3fc4d5a31f6050508f2404369beac4356867 (diff)
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. Suggested-by: Radim Krcmar <rkrcmar@redhat.com> Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com> Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r--Documentation/virtual/kvm/api.txt10
-rw-r--r--arch/powerpc/include/asm/kvm_host.h3
-rw-r--r--include/linux/kvm_host.h4
-rw-r--r--include/uapi/linux/kvm.h1
-rw-r--r--virt/kvm/kvm_main.c4
5 files changed, 19 insertions, 3 deletions
diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt
index 8cc857fffcc7..a4482cce4bae 100644
--- a/Documentation/virtual/kvm/api.txt
+++ b/Documentation/virtual/kvm/api.txt
@@ -199,8 +199,8 @@ Type: vm ioctl
199Parameters: vcpu id (apic id on x86) 199Parameters: vcpu id (apic id on x86)
200Returns: vcpu fd on success, -1 on error 200Returns: vcpu fd on success, -1 on error
201 201
202This API adds a vcpu to a virtual machine. The vcpu id is a small integer 202This 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 of 205The 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.
212If the KVM_CAP_MAX_VCPUS does not exist, you should assume that max_vcpus is 212If 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 virtual 221On powerpc using book3s_hv mode, the vcpus are mapped onto virtual
216threads in one or more virtual CPU cores. (This is because the 222threads in one or more virtual CPU cores. (This is because the
217hardware requires all the hardware threads in a CPU core to be in the 223hardware requires all the hardware threads in a CPU core to be in the
diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h
index d7b343170453..a07645c17818 100644
--- a/arch/powerpc/include/asm/kvm_host.h
+++ b/arch/powerpc/include/asm/kvm_host.h
@@ -40,6 +40,9 @@
40#define KVM_MAX_VCORES NR_CPUS 40#define KVM_MAX_VCORES NR_CPUS
41#define KVM_USER_MEM_SLOTS 512 41#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_MMIO 46#ifdef CONFIG_KVM_MMIO
44#define KVM_COALESCED_MMIO_PAGE_OFFSET 1 47#define KVM_COALESCED_MMIO_PAGE_OFFSET 1
45#endif 48#endif
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 0a0e00d9c5da..352889d6e322 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -35,6 +35,10 @@
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 used 43 * 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 in 44 * in kvm, other bits are visible for userspace which are defined in
diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h
index a7f1f8032ec1..05ebf475104c 100644
--- a/include/uapi/linux/kvm.h
+++ b/include/uapi/linux/kvm.h
@@ -865,6 +865,7 @@ struct kvm_ppc_smmu_info {
865#define KVM_CAP_SPAPR_TCE_64 125 865#define KVM_CAP_SPAPR_TCE_64 125
866#define KVM_CAP_ARM_PMU_V3 126 866#define KVM_CAP_ARM_PMU_V3 126
867#define KVM_CAP_VCPU_ATTRIBUTES 127 867#define KVM_CAP_VCPU_ATTRIBUTES 127
868#define KVM_CAP_MAX_VCPU_ID 128
868 869
869#ifdef KVM_CAP_IRQ_ROUTING 870#ifdef KVM_CAP_IRQ_ROUTING
870 871
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 4fd482fb9260..ed3d9bb18a56 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -2272,7 +2272,7 @@ static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, u32 id)
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)
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#endif 2748#endif
2749 case KVM_CAP_MAX_VCPU_ID:
2750 return KVM_MAX_VCPU_ID;
2749 default: 2751 default:
2750 break; 2752 break;
2751 } 2753 }