* [PATCH v6 1/2] KVM: remove NULL return path for vcpu ids >= KVM_MAX_VCPUS
@ 2016-05-09 16:11 Greg Kurz
2016-05-09 16:13 ` [PATCH v6 2/2] kvm: introduce KVM_MAX_VCPU_ID Greg Kurz
0 siblings, 1 reply; 4+ messages in thread
From: Greg Kurz @ 2016-05-09 16:11 UTC (permalink / raw)
To: Paolo Bonzini, james.hogan, mingo
Cc: linux-mips, kvm, rkrcmar, linux-kernel, David Hildenbrand,
qemu-ppc, Cornelia Huck, Paul Mackerras, David Gibson
Commit c896939f7cff ("KVM: use heuristic for fast VCPU lookup by id") added
a return path that prevents vcpu ids to exceed KVM_MAX_VCPUS. This is a
problem for powerpc where vcpu ids can grow up to 8*KVM_MAX_VCPUS.
This patch simply reverses the logic so that we only try fast path if the
vcpu id can be tried as an index in kvm->vcpus[]. The slow path is not
affected by the change.
Reviewed-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
---
include/linux/kvm_host.h | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 5276fe0916fc..23bfe1bd159c 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -447,12 +447,13 @@ static inline struct kvm_vcpu *kvm_get_vcpu(struct kvm *kvm, int i)
static inline struct kvm_vcpu *kvm_get_vcpu_by_id(struct kvm *kvm, int id)
{
- struct kvm_vcpu *vcpu;
+ struct kvm_vcpu *vcpu = NULL;
int i;
- if (id < 0 || id >= KVM_MAX_VCPUS)
+ if (id < 0)
return NULL;
- vcpu = kvm_get_vcpu(kvm, id);
+ if (id < KVM_MAX_VCPUS)
+ vcpu = kvm_get_vcpu(kvm, id);
if (vcpu && vcpu->vcpu_id == id)
return vcpu;
kvm_for_each_vcpu(i, vcpu, kvm)
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v6 2/2] kvm: introduce KVM_MAX_VCPU_ID
2016-05-09 16:11 [PATCH v6 1/2] KVM: remove NULL return path for vcpu ids >= KVM_MAX_VCPUS Greg Kurz
@ 2016-05-09 16:13 ` Greg Kurz
2016-05-09 16:23 ` Cornelia Huck
0 siblings, 1 reply; 4+ messages in thread
From: Greg Kurz @ 2016-05-09 16:13 UTC (permalink / raw)
To: Paolo Bonzini, james.hogan, mingo
Cc: linux-mips, kvm, rkrcmar, linux-kernel, David Hildenbrand,
qemu-ppc, Cornelia Huck, Paul Mackerras, David Gibson
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>
---
v6: - provide cap in generic code (Cornelia)
- change PowerPC limit to threads_per_subcore * KVM_MAX_VCORES (Radim)
---
Documentation/virtual/kvm/api.txt | 10 ++++++++--
arch/powerpc/include/asm/kvm_host.h | 3 +++
include/linux/kvm_host.h | 4 ++++
include/uapi/linux/kvm.h | 1 +
virt/kvm/kvm_main.c | 4 +++-
5 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt
index 4d0542c5206b..2da127f21ffc 100644
--- a/Documentation/virtual/kvm/api.txt
+++ b/Documentation/virtual/kvm/api.txt
@@ -199,8 +199,8 @@ Type: vm ioctl
Parameters: vcpu id (apic id on x86)
Returns: vcpu fd on success, -1 on error
-This API adds a vcpu to a virtual machine. The vcpu id is a small integer
-in the range [0, max_vcpus).
+This API adds a vcpu to a virtual machine. No more than max_vcpus may be added.
+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 KVM_CHECK_EXTENSION ioctl() at run-time.
@@ -212,6 +212,12 @@ cpus max.
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.
+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
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
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 @@
#define KVM_MAX_VCORES NR_CPUS
#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
#define KVM_COALESCED_MMIO_PAGE_OFFSET 1
#endif
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 23bfe1bd159c..3b4efa1c088c 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -35,6 +35,10 @@
#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
* 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 {
#define KVM_CAP_SPAPR_TCE_64 125
#define KVM_CAP_ARM_PMU_V3 126
#define KVM_CAP_VCPU_ATTRIBUTES 127
+#define KVM_CAP_MAX_VCPU_ID 128
#ifdef KVM_CAP_IRQ_ROUTING
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)
int r;
struct kvm_vcpu *vcpu;
- if (id >= KVM_MAX_VCPUS)
+ if (id >= KVM_MAX_VCPU_ID)
return -EINVAL;
vcpu = kvm_arch_vcpu_create(kvm, id);
@@ -2746,6 +2746,8 @@ static long kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg)
case KVM_CAP_MULTI_ADDRESS_SPACE:
return KVM_ADDRESS_SPACE_NUM;
#endif
+ case KVM_CAP_MAX_VCPU_ID:
+ return KVM_MAX_VCPU_ID;
default:
break;
}
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v6 2/2] kvm: introduce KVM_MAX_VCPU_ID
2016-05-09 16:13 ` [PATCH v6 2/2] kvm: introduce KVM_MAX_VCPU_ID Greg Kurz
@ 2016-05-09 16:23 ` Cornelia Huck
2016-05-10 17:17 ` Paolo Bonzini
0 siblings, 1 reply; 4+ messages in thread
From: Cornelia Huck @ 2016-05-09 16:23 UTC (permalink / raw)
To: Greg Kurz
Cc: Paolo Bonzini, james.hogan, mingo, linux-mips, kvm, rkrcmar,
linux-kernel, David Hildenbrand, qemu-ppc, Paul Mackerras,
David Gibson
On Mon, 09 May 2016 18:13:37 +0200
Greg Kurz <gkurz@linux.vnet.ibm.com> wrote:
> 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>
> ---
> v6: - provide cap in generic code (Cornelia)
> - change PowerPC limit to threads_per_subcore * KVM_MAX_VCORES (Radim)
> ---
> Documentation/virtual/kvm/api.txt | 10 ++++++++--
> arch/powerpc/include/asm/kvm_host.h | 3 +++
> include/linux/kvm_host.h | 4 ++++
> include/uapi/linux/kvm.h | 1 +
> virt/kvm/kvm_main.c | 4 +++-
> 5 files changed, 19 insertions(+), 3 deletions(-)
Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v6 2/2] kvm: introduce KVM_MAX_VCPU_ID
2016-05-09 16:23 ` Cornelia Huck
@ 2016-05-10 17:17 ` Paolo Bonzini
0 siblings, 0 replies; 4+ messages in thread
From: Paolo Bonzini @ 2016-05-10 17:17 UTC (permalink / raw)
To: Cornelia Huck, Greg Kurz
Cc: james.hogan, mingo, linux-mips, kvm, rkrcmar, linux-kernel,
David Hildenbrand, qemu-ppc, Paul Mackerras, David Gibson
On 09/05/2016 18:23, Cornelia Huck wrote:
> On Mon, 09 May 2016 18:13:37 +0200
> Greg Kurz <gkurz@linux.vnet.ibm.com> wrote:
>
>> 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>
>> ---
>> v6: - provide cap in generic code (Cornelia)
>> - change PowerPC limit to threads_per_subcore * KVM_MAX_VCORES (Radim)
>> ---
>> Documentation/virtual/kvm/api.txt | 10 ++++++++--
>> arch/powerpc/include/asm/kvm_host.h | 3 +++
>> include/linux/kvm_host.h | 4 ++++
>> include/uapi/linux/kvm.h | 1 +
>> virt/kvm/kvm_main.c | 4 +++-
>> 5 files changed, 19 insertions(+), 3 deletions(-)
>
> Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
>
Series pushed to kvm/queue, thanks.
Paolo
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2016-05-10 17:17 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-05-09 16:11 [PATCH v6 1/2] KVM: remove NULL return path for vcpu ids >= KVM_MAX_VCPUS Greg Kurz
2016-05-09 16:13 ` [PATCH v6 2/2] kvm: introduce KVM_MAX_VCPU_ID Greg Kurz
2016-05-09 16:23 ` Cornelia Huck
2016-05-10 17:17 ` Paolo Bonzini
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).