Commit 0b1b1dfd authored by Greg Kurz's avatar Greg Kurz Committed by Paolo Bonzini

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: default avatarRadim Krcmar <rkrcmar@redhat.com>
Signed-off-by: default avatarGreg Kurz <gkurz@linux.vnet.ibm.com>
Reviewed-by: default avatarCornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 9b9e3fc4
...@@ -199,8 +199,8 @@ Type: vm ioctl ...@@ -199,8 +199,8 @@ Type: vm ioctl
Parameters: vcpu id (apic id on x86) Parameters: vcpu id (apic id on x86)
Returns: vcpu fd on success, -1 on error Returns: vcpu fd on success, -1 on error
This API adds a vcpu to a virtual machine. The vcpu id is a small integer This API adds a vcpu to a virtual machine. No more than max_vcpus may be added.
in the range [0, max_vcpus). The vcpu id is an integer in the range [0, max_vcpu_id).
The recommended max_vcpus value can be retrieved using the KVM_CAP_NR_VCPUS of The recommended max_vcpus value can be retrieved using the KVM_CAP_NR_VCPUS of
the KVM_CHECK_EXTENSION ioctl() at run-time. the KVM_CHECK_EXTENSION ioctl() at run-time.
...@@ -212,6 +212,12 @@ cpus max. ...@@ -212,6 +212,12 @@ cpus max.
If the KVM_CAP_MAX_VCPUS does not exist, you should assume that max_vcpus is If the KVM_CAP_MAX_VCPUS does not exist, you should assume that max_vcpus is
same as the value returned from KVM_CAP_NR_VCPUS. same as the value returned from KVM_CAP_NR_VCPUS.
The maximum possible value for max_vcpu_id can be retrieved using the
KVM_CAP_MAX_VCPU_ID of the KVM_CHECK_EXTENSION ioctl() at run-time.
If the KVM_CAP_MAX_VCPU_ID does not exist, you should assume that max_vcpu_id
is the same as the value returned from KVM_CAP_MAX_VCPUS.
On powerpc using book3s_hv mode, the vcpus are mapped onto virtual On powerpc using book3s_hv mode, the vcpus are mapped onto virtual
threads in one or more virtual CPU cores. (This is because the threads in one or more virtual CPU cores. (This is because the
hardware requires all the hardware threads in a CPU core to be in the hardware requires all the hardware threads in a CPU core to be in the
......
...@@ -40,6 +40,9 @@ ...@@ -40,6 +40,9 @@
#define KVM_MAX_VCORES NR_CPUS #define KVM_MAX_VCORES NR_CPUS
#define KVM_USER_MEM_SLOTS 512 #define KVM_USER_MEM_SLOTS 512
#include <asm/cputhreads.h>
#define KVM_MAX_VCPU_ID (threads_per_subcore * KVM_MAX_VCORES)
#ifdef CONFIG_KVM_MMIO #ifdef CONFIG_KVM_MMIO
#define KVM_COALESCED_MMIO_PAGE_OFFSET 1 #define KVM_COALESCED_MMIO_PAGE_OFFSET 1
#endif #endif
......
...@@ -35,6 +35,10 @@ ...@@ -35,6 +35,10 @@
#include <asm/kvm_host.h> #include <asm/kvm_host.h>
#ifndef KVM_MAX_VCPU_ID
#define KVM_MAX_VCPU_ID KVM_MAX_VCPUS
#endif
/* /*
* The bit 16 ~ bit 31 of kvm_memory_region::flags are internally used * The bit 16 ~ bit 31 of kvm_memory_region::flags are internally used
* in kvm, other bits are visible for userspace which are defined in * in kvm, other bits are visible for userspace which are defined in
......
...@@ -865,6 +865,7 @@ struct kvm_ppc_smmu_info { ...@@ -865,6 +865,7 @@ struct kvm_ppc_smmu_info {
#define KVM_CAP_SPAPR_TCE_64 125 #define KVM_CAP_SPAPR_TCE_64 125
#define KVM_CAP_ARM_PMU_V3 126 #define KVM_CAP_ARM_PMU_V3 126
#define KVM_CAP_VCPU_ATTRIBUTES 127 #define KVM_CAP_VCPU_ATTRIBUTES 127
#define KVM_CAP_MAX_VCPU_ID 128
#ifdef KVM_CAP_IRQ_ROUTING #ifdef KVM_CAP_IRQ_ROUTING
......
...@@ -2272,7 +2272,7 @@ static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, u32 id) ...@@ -2272,7 +2272,7 @@ static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, u32 id)
int r; int r;
struct kvm_vcpu *vcpu; struct kvm_vcpu *vcpu;
if (id >= KVM_MAX_VCPUS) if (id >= KVM_MAX_VCPU_ID)
return -EINVAL; return -EINVAL;
vcpu = kvm_arch_vcpu_create(kvm, id); 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,6 +2746,8 @@ static long kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg)
case KVM_CAP_MULTI_ADDRESS_SPACE: case KVM_CAP_MULTI_ADDRESS_SPACE:
return KVM_ADDRESS_SPACE_NUM; return KVM_ADDRESS_SPACE_NUM;
#endif #endif
case KVM_CAP_MAX_VCPU_ID:
return KVM_MAX_VCPU_ID;
default: default:
break; break;
} }
......
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