mirror of https://github.com/xqemu/xqemu.git
kvm: warn if num cpus is greater than num recommended
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 <drjones@redhat.com> Acked-by: Marcelo Tosatti <mtosatti@redhat.com> Signed-off-by: Gleb Natapov <gleb@redhat.com>
This commit is contained in:
parent
97577fd4c3
commit
670436ced0
57
kvm-all.c
57
kvm-all.c
|
@ -1322,24 +1322,20 @@ static int kvm_irqchip_create(KVMState *s)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int kvm_max_vcpus(KVMState *s)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
/* Find number of supported CPUs using the recommended
|
/* Find number of supported CPUs using the recommended
|
||||||
* procedure from the kernel API documentation to cope with
|
* procedure from the kernel API documentation to cope with
|
||||||
* older kernels that may be missing capabilities.
|
* older kernels that may be missing capabilities.
|
||||||
*/
|
*/
|
||||||
ret = kvm_check_extension(s, KVM_CAP_MAX_VCPUS);
|
static int kvm_recommended_vcpus(KVMState *s)
|
||||||
if (ret) {
|
{
|
||||||
return ret;
|
int ret = kvm_check_extension(s, KVM_CAP_NR_VCPUS);
|
||||||
}
|
return (ret) ? ret : 4;
|
||||||
ret = kvm_check_extension(s, KVM_CAP_NR_VCPUS);
|
|
||||||
if (ret) {
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
int kvm_init(void)
|
||||||
|
@ -1347,11 +1343,19 @@ int kvm_init(void)
|
||||||
static const char upgrade_note[] =
|
static const char upgrade_note[] =
|
||||||
"Please upgrade to at least kernel 2.6.29 or recent kvm-kmod\n"
|
"Please upgrade to at least kernel 2.6.29 or recent kvm-kmod\n"
|
||||||
"(see http://sourceforge.net/projects/kvm).\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;
|
KVMState *s;
|
||||||
const KVMCapabilityInfo *missing_cap;
|
const KVMCapabilityInfo *missing_cap;
|
||||||
int ret;
|
int ret;
|
||||||
int i;
|
int i;
|
||||||
int max_vcpus;
|
|
||||||
|
|
||||||
s = g_malloc0(sizeof(KVMState));
|
s = g_malloc0(sizeof(KVMState));
|
||||||
|
|
||||||
|
@ -1392,19 +1396,26 @@ int kvm_init(void)
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
max_vcpus = kvm_max_vcpus(s);
|
/* check the vcpu limits */
|
||||||
if (smp_cpus > max_vcpus) {
|
soft_vcpus_limit = kvm_recommended_vcpus(s);
|
||||||
|
hard_vcpus_limit = kvm_max_vcpus(s);
|
||||||
|
|
||||||
|
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;
|
ret = -EINVAL;
|
||||||
fprintf(stderr, "Number of SMP cpus requested (%d) exceeds max cpus "
|
fprintf(stderr, "Number of %s cpus requested (%d) exceeds "
|
||||||
"supported by KVM (%d)\n", smp_cpus, max_vcpus);
|
"the maximum cpus supported by KVM (%d)\n",
|
||||||
|
nc->name, nc->num, hard_vcpus_limit);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (max_cpus > max_vcpus) {
|
nc++;
|
||||||
ret = -EINVAL;
|
|
||||||
fprintf(stderr, "Number of hotpluggable cpus requested (%d) exceeds max cpus "
|
|
||||||
"supported by KVM (%d)\n", max_cpus, max_vcpus);
|
|
||||||
goto err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
s->vmfd = kvm_ioctl(s, KVM_CREATE_VM, 0);
|
s->vmfd = kvm_ioctl(s, KVM_CREATE_VM, 0);
|
||||||
|
|
Loading…
Reference in New Issue