[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 03/13] kvm: warn if num cpus is greater than num reco
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PULL 03/13] kvm: warn if num cpus is greater than num recommended |
Date: |
Fri, 20 Sep 2013 18:24:42 +0200 |
From: Andrew Jones <address@hidden>
The comment in kvm_max_vcpus() states that it's using the recommended
procedure from the kernel API documentation to get the max number
of vcpus that kvm supports. It is, but by always returning the
maximum number supported. The maximum number should only be used
for development purposes. qemu should check KVM_CAP_NR_VCPUS for
the recommended number of vcpus. This patch adds a warning if a user
specifies a number of cpus between the recommended and max.
Signed-off-by: Andrew Jones <address@hidden>
Acked-by: Marcelo Tosatti <address@hidden>
Signed-off-by: Gleb Natapov <address@hidden>
---
kvm-all.c | 69 ++++++++++++++++++++++++++++++++++++---------------------------
1 file changed, 40 insertions(+), 29 deletions(-)
diff --git a/kvm-all.c b/kvm-all.c
index c29a015..d55c21f 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -1322,24 +1322,20 @@ static int kvm_irqchip_create(KVMState *s)
return 0;
}
-static int kvm_max_vcpus(KVMState *s)
+/* Find number of supported CPUs using the recommended
+ * procedure from the kernel API documentation to cope with
+ * older kernels that may be missing capabilities.
+ */
+static int kvm_recommended_vcpus(KVMState *s)
{
- int ret;
-
- /* Find number of supported CPUs using the recommended
- * procedure from the kernel API documentation to cope with
- * older kernels that may be missing capabilities.
- */
- ret = kvm_check_extension(s, KVM_CAP_MAX_VCPUS);
- if (ret) {
- return ret;
- }
- ret = kvm_check_extension(s, KVM_CAP_NR_VCPUS);
- if (ret) {
- return ret;
- }
+ int ret = kvm_check_extension(s, KVM_CAP_NR_VCPUS);
+ return (ret) ? ret : 4;
+}
- return 4;
+static int kvm_max_vcpus(KVMState *s)
+{
+ int ret = kvm_check_extension(s, KVM_CAP_MAX_VCPUS);
+ return (ret) ? ret : kvm_recommended_vcpus(s);
}
int kvm_init(void)
@@ -1347,11 +1343,19 @@ int kvm_init(void)
static const char upgrade_note[] =
"Please upgrade to at least kernel 2.6.29 or recent kvm-kmod\n"
"(see http://sourceforge.net/projects/kvm).\n";
+ struct {
+ const char *name;
+ int num;
+ } num_cpus[] = {
+ { "SMP", smp_cpus },
+ { "hotpluggable", max_cpus },
+ { NULL, }
+ }, *nc = num_cpus;
+ int soft_vcpus_limit, hard_vcpus_limit;
KVMState *s;
const KVMCapabilityInfo *missing_cap;
int ret;
int i;
- int max_vcpus;
s = g_malloc0(sizeof(KVMState));
@@ -1392,19 +1396,26 @@ int kvm_init(void)
goto err;
}
- max_vcpus = kvm_max_vcpus(s);
- if (smp_cpus > max_vcpus) {
- ret = -EINVAL;
- fprintf(stderr, "Number of SMP cpus requested (%d) exceeds max cpus "
- "supported by KVM (%d)\n", smp_cpus, max_vcpus);
- goto err;
- }
+ /* check the vcpu limits */
+ soft_vcpus_limit = kvm_recommended_vcpus(s);
+ hard_vcpus_limit = kvm_max_vcpus(s);
- if (max_cpus > max_vcpus) {
- ret = -EINVAL;
- fprintf(stderr, "Number of hotpluggable cpus requested (%d) exceeds
max cpus "
- "supported by KVM (%d)\n", max_cpus, max_vcpus);
- goto err;
+ while (nc->name) {
+ if (nc->num > soft_vcpus_limit) {
+ fprintf(stderr,
+ "Warning: Number of %s cpus requested (%d) exceeds "
+ "the recommended cpus supported by KVM (%d)\n",
+ nc->name, nc->num, soft_vcpus_limit);
+
+ if (nc->num > hard_vcpus_limit) {
+ ret = -EINVAL;
+ fprintf(stderr, "Number of %s cpus requested (%d) exceeds "
+ "the maximum cpus supported by KVM (%d)\n",
+ nc->name, nc->num, hard_vcpus_limit);
+ goto err;
+ }
+ }
+ nc++;
}
s->vmfd = kvm_ioctl(s, KVM_CREATE_VM, 0);
--
1.8.3.1
- [Qemu-devel] [PULL 00/13] KVM patches for 2013-09-20, Paolo Bonzini, 2013/09/20
- [Qemu-devel] [PULL 02/13] cpu: Move cpu state syncs up into cpu_dump_state(), Paolo Bonzini, 2013/09/20
- [Qemu-devel] [PULL 01/13] exec: always use MADV_DONTFORK, Paolo Bonzini, 2013/09/20
- [Qemu-devel] [PULL 06/13] kvmvapic: Catch invalid ROM size, Paolo Bonzini, 2013/09/20
- [Qemu-devel] [PULL 07/13] kvmvapic: Enter inactive state on hardware reset, Paolo Bonzini, 2013/09/20
- [Qemu-devel] [PULL 05/13] kvm irqfd: support direct msimessage to irq translation, Paolo Bonzini, 2013/09/20
- [Qemu-devel] [PULL 03/13] kvm: warn if num cpus is greater than num recommended,
Paolo Bonzini <=
- [Qemu-devel] [PULL 04/13] fix steal time MSR vmsd callback to proper opaque type, Paolo Bonzini, 2013/09/20
- [Qemu-devel] [PULL 08/13] kvmvapic: Clear also physical ROM address when entering INACTIVE state, Paolo Bonzini, 2013/09/20
- [Qemu-devel] [PULL 09/13] kvm: fix traces to use %x instead of %d, Paolo Bonzini, 2013/09/20
- [Qemu-devel] [PULL 10/13] linux-headers: update to 3.11, Paolo Bonzini, 2013/09/20
- [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used, Paolo Bonzini, 2013/09/20
- [Qemu-devel] [PULL 13/13] target-i386: add feature kvm_pv_unhalt, Paolo Bonzini, 2013/09/20
- [Qemu-devel] [PULL 12/13] linux-headers: update to 3.12-rc1, Paolo Bonzini, 2013/09/20