linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [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).