From: Gleb Natapov <gleb@redhat.com>
To: Andrew Jones <drjones@redhat.com>
Cc: qemu-devel@nongnu.org, kvm@vger.kernel.org, pbonzini@redhat.com,
mtosatti@redhat.com, ehabkost@redhat.com, afaerber@suse.de,
libvir-list@redhat.com
Subject: Re: [PATCH v2] kvm: warn if num cpus is greater than num recommended
Date: Tue, 3 Sep 2013 11:54:07 +0300 [thread overview]
Message-ID: <20130903085406.GW22899@redhat.com> (raw)
In-Reply-To: <1377264277-23614-1-git-send-email-drjones@redhat.com>
On Fri, Aug 23, 2013 at 03:24:37PM +0200, Andrew Jones wrote:
> 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.
>
> v2:
> Incorporate tests for max_cpus, which specifies the maximum number
> of hotpluggable cpus. An additional note is that the message for
> the fail case was slightly changed, 'exceeds max cpus' to
> 'exceeds the maximum cpus'. If this is unacceptable change for
> users like libvirt, then I'll need to spin a v3.
>
> Signed-off-by: Andrew Jones <drjones@redhat.com>
Applied, thanks.
> ---
> kvm-all.c | 69 ++++++++++++++++++++++++++++++++++++---------------------------
> 1 file changed, 40 insertions(+), 29 deletions(-)
>
> diff --git a/kvm-all.c b/kvm-all.c
> index a2d49786365e3..021f5f47e53da 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.1.4
--
Gleb.
WARNING: multiple messages have this Message-ID (diff)
From: Gleb Natapov <gleb@redhat.com>
To: Andrew Jones <drjones@redhat.com>
Cc: ehabkost@redhat.com, kvm@vger.kernel.org, libvir-list@redhat.com,
mtosatti@redhat.com, qemu-devel@nongnu.org, pbonzini@redhat.com,
afaerber@suse.de
Subject: Re: [Qemu-devel] [PATCH v2] kvm: warn if num cpus is greater than num recommended
Date: Tue, 3 Sep 2013 11:54:07 +0300 [thread overview]
Message-ID: <20130903085406.GW22899@redhat.com> (raw)
In-Reply-To: <1377264277-23614-1-git-send-email-drjones@redhat.com>
On Fri, Aug 23, 2013 at 03:24:37PM +0200, Andrew Jones wrote:
> 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.
>
> v2:
> Incorporate tests for max_cpus, which specifies the maximum number
> of hotpluggable cpus. An additional note is that the message for
> the fail case was slightly changed, 'exceeds max cpus' to
> 'exceeds the maximum cpus'. If this is unacceptable change for
> users like libvirt, then I'll need to spin a v3.
>
> Signed-off-by: Andrew Jones <drjones@redhat.com>
Applied, thanks.
> ---
> kvm-all.c | 69 ++++++++++++++++++++++++++++++++++++---------------------------
> 1 file changed, 40 insertions(+), 29 deletions(-)
>
> diff --git a/kvm-all.c b/kvm-all.c
> index a2d49786365e3..021f5f47e53da 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.1.4
--
Gleb.
next prev parent reply other threads:[~2013-09-03 8:56 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-23 13:24 [PATCH v2] kvm: warn if num cpus is greater than num recommended Andrew Jones
2013-08-23 13:24 ` [Qemu-devel] " Andrew Jones
2013-08-28 1:30 ` [libvirt] " Eric Blake
2013-08-28 1:30 ` [Qemu-devel] " Eric Blake
2013-08-28 7:45 ` Andrew Jones
2013-08-28 7:45 ` [Qemu-devel] " Andrew Jones
2013-08-28 12:33 ` Eric Blake
2013-08-28 12:33 ` [Qemu-devel] " Eric Blake
2013-09-01 9:46 ` Gleb Natapov
2013-09-01 9:46 ` [Qemu-devel] " Gleb Natapov
2013-09-01 22:46 ` Marcelo Tosatti
2013-09-01 22:46 ` [Qemu-devel] " Marcelo Tosatti
2013-09-03 8:54 ` Gleb Natapov [this message]
2013-09-03 8:54 ` Gleb Natapov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20130903085406.GW22899@redhat.com \
--to=gleb@redhat.com \
--cc=afaerber@suse.de \
--cc=drjones@redhat.com \
--cc=ehabkost@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=libvir-list@redhat.com \
--cc=mtosatti@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.