All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] vl: convert -smp to qemu_opts_parse()
@ 2013-06-19 19:29 Michael Tokarev
  2013-06-19 19:35 ` Anthony Liguori
  2013-07-01 13:14 ` Anthony Liguori
  0 siblings, 2 replies; 8+ messages in thread
From: Michael Tokarev @ 2013-06-19 19:29 UTC (permalink / raw)
  To: Anthony Liguori; +Cc: Michael Tokarev, qemu-devel

Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
---
 vl.c |  122 +++++++++++++++++++++++++++++++++++++-----------------------------
 1 file changed, 69 insertions(+), 53 deletions(-)

diff --git a/vl.c b/vl.c
index f94ec9c..530fa8f 100644
--- a/vl.c
+++ b/vl.c
@@ -1401,48 +1401,79 @@ static void numa_add(const char *optarg)
     }
 }
 
-static void smp_parse(const char *optarg)
+static QemuOptsList qemu_smp_opts = {
+    .name = "smp-opts",
+    .implied_opt_name = "cpus",
+    .merge_lists = true,
+    .head = QTAILQ_HEAD_INITIALIZER(qemu_smp_opts.head),
+    .desc = {
+        {
+            .name = "cpus",
+            .type = QEMU_OPT_NUMBER,
+        }, {
+            .name = "sockets",
+            .type = QEMU_OPT_NUMBER,
+        }, {
+            .name = "cores",
+            .type = QEMU_OPT_NUMBER,
+        }, {
+            .name = "threads",
+            .type = QEMU_OPT_NUMBER,
+        }, {
+            .name = "maxcpus",
+            .type = QEMU_OPT_NUMBER,
+        },
+        { /*End of list */ }
+    },
+};
+
+static void smp_parse(QemuOpts *opts)
 {
-    int smp, sockets = 0, threads = 0, cores = 0;
-    char *endptr;
-    char option[128];
+    if (opts) {
 
-    smp = strtoul(optarg, &endptr, 10);
-    if (endptr != optarg) {
-        if (*endptr == ',') {
-            endptr++;
-        }
-    }
-    if (get_param_value(option, 128, "sockets", endptr) != 0)
-        sockets = strtoull(option, NULL, 10);
-    if (get_param_value(option, 128, "cores", endptr) != 0)
-        cores = strtoull(option, NULL, 10);
-    if (get_param_value(option, 128, "threads", endptr) != 0)
-        threads = strtoull(option, NULL, 10);
-    if (get_param_value(option, 128, "maxcpus", endptr) != 0)
-        max_cpus = strtoull(option, NULL, 10);
-
-    /* compute missing values, prefer sockets over cores over threads */
-    if (smp == 0 || sockets == 0) {
-        sockets = sockets > 0 ? sockets : 1;
-        cores = cores > 0 ? cores : 1;
-        threads = threads > 0 ? threads : 1;
-        if (smp == 0) {
-            smp = cores * threads * sockets;
-        }
-    } else {
-        if (cores == 0) {
+        unsigned cpus    = qemu_opt_get_number(opts, "cpus", 0);
+        unsigned sockets = qemu_opt_get_number(opts, "sockets", 0);
+        unsigned cores   = qemu_opt_get_number(opts, "cores", 0);
+        unsigned threads = qemu_opt_get_number(opts, "threads", 0);
+
+        /* compute missing values, prefer sockets over cores over threads */
+        if (cpus == 0 || sockets == 0) {
+            sockets = sockets > 0 ? sockets : 1;
+            cores = cores > 0 ? cores : 1;
             threads = threads > 0 ? threads : 1;
-            cores = smp / (sockets * threads);
+            if (cpus == 0) {
+                cpus = cores * threads * sockets;
+            }
         } else {
-            threads = smp / (cores * sockets);
+            if (cores == 0) {
+                threads = threads > 0 ? threads : 1;
+                cores = cpus / (sockets * threads);
+            } else {
+                threads = cpus / (cores * sockets);
+            }
         }
+
+        max_cpus = qemu_opt_get_number(opts, "maxcpus", 0);
+
+        smp_cpus = cpus;
+        smp_cores = cores > 0 ? cores : 1;
+        smp_threads = threads > 0 ? threads : 1;
+
     }
-    smp_cpus = smp;
-    smp_cores = cores > 0 ? cores : 1;
-    smp_threads = threads > 0 ? threads : 1;
-    if (max_cpus == 0)
+
+    if (max_cpus == 0) {
         max_cpus = smp_cpus;
+    }
+
+    if (max_cpus > 255) {
+        fprintf(stderr, "Unsupported number of maxcpus\n");
+        exit(1);
+    }
+    if (max_cpus < smp_cpus) {
+        fprintf(stderr, "maxcpus must be equal to or greater than smp\n");
+        exit(1);
+    }
+
 }
 
 static void configure_realtime(QemuOpts *opts)
@@ -2895,6 +2926,7 @@ int main(int argc, char **argv, char **envp)
     qemu_add_opts(&qemu_trace_opts);
     qemu_add_opts(&qemu_option_rom_opts);
     qemu_add_opts(&qemu_machine_opts);
+    qemu_add_opts(&qemu_smp_opts);
     qemu_add_opts(&qemu_boot_opts);
     qemu_add_opts(&qemu_sandbox_opts);
     qemu_add_opts(&qemu_add_fd_opts);
@@ -3624,18 +3656,7 @@ int main(int argc, char **argv, char **envp)
                 }
                 break;
             case QEMU_OPTION_smp:
-                smp_parse(optarg);
-                if (smp_cpus < 1) {
-                    fprintf(stderr, "Invalid number of CPUs\n");
-                    exit(1);
-                }
-                if (max_cpus < smp_cpus) {
-                    fprintf(stderr, "maxcpus must be equal to or greater than "
-                            "smp\n");
-                    exit(1);
-                }
-                if (max_cpus > 255) {
-                    fprintf(stderr, "Unsupported number of maxcpus\n");
+                if (!qemu_opts_parse(qemu_find_opts("smp-opts"), optarg, 1)) {
                     exit(1);
                 }
                 break;
@@ -3959,12 +3980,7 @@ int main(int argc, char **argv, char **envp)
         data_dir[data_dir_idx++] = CONFIG_QEMU_DATADIR;
     }
 
-    /*
-     * Default to max_cpus = smp_cpus, in case the user doesn't
-     * specify a max_cpus value.
-     */
-    if (!max_cpus)
-        max_cpus = smp_cpus;
+    smp_parse(qemu_opts_find(qemu_find_opts("smp-opts"), NULL));
 
     machine->max_cpus = machine->max_cpus ?: 1; /* Default to UP */
     if (smp_cpus > machine->max_cpus) {
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH] vl: convert -smp to qemu_opts_parse()
  2013-06-19 19:29 [Qemu-devel] [PATCH] vl: convert -smp to qemu_opts_parse() Michael Tokarev
@ 2013-06-19 19:35 ` Anthony Liguori
  2013-06-28 10:39   ` Michael Tokarev
  2013-07-01 13:14 ` Anthony Liguori
  1 sibling, 1 reply; 8+ messages in thread
From: Anthony Liguori @ 2013-06-19 19:35 UTC (permalink / raw)
  To: Michael Tokarev; +Cc: qemu-devel

Michael Tokarev <mjt@tls.msk.ru> writes:

> Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>

Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>

Regards,

Anthony Liguori

> ---
>  vl.c |  122 +++++++++++++++++++++++++++++++++++++-----------------------------
>  1 file changed, 69 insertions(+), 53 deletions(-)
>
> diff --git a/vl.c b/vl.c
> index f94ec9c..530fa8f 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -1401,48 +1401,79 @@ static void numa_add(const char *optarg)
>      }
>  }
>  
> -static void smp_parse(const char *optarg)
> +static QemuOptsList qemu_smp_opts = {
> +    .name = "smp-opts",
> +    .implied_opt_name = "cpus",
> +    .merge_lists = true,
> +    .head = QTAILQ_HEAD_INITIALIZER(qemu_smp_opts.head),
> +    .desc = {
> +        {
> +            .name = "cpus",
> +            .type = QEMU_OPT_NUMBER,
> +        }, {
> +            .name = "sockets",
> +            .type = QEMU_OPT_NUMBER,
> +        }, {
> +            .name = "cores",
> +            .type = QEMU_OPT_NUMBER,
> +        }, {
> +            .name = "threads",
> +            .type = QEMU_OPT_NUMBER,
> +        }, {
> +            .name = "maxcpus",
> +            .type = QEMU_OPT_NUMBER,
> +        },
> +        { /*End of list */ }
> +    },
> +};
> +
> +static void smp_parse(QemuOpts *opts)
>  {
> -    int smp, sockets = 0, threads = 0, cores = 0;
> -    char *endptr;
> -    char option[128];
> +    if (opts) {
>  
> -    smp = strtoul(optarg, &endptr, 10);
> -    if (endptr != optarg) {
> -        if (*endptr == ',') {
> -            endptr++;
> -        }
> -    }
> -    if (get_param_value(option, 128, "sockets", endptr) != 0)
> -        sockets = strtoull(option, NULL, 10);
> -    if (get_param_value(option, 128, "cores", endptr) != 0)
> -        cores = strtoull(option, NULL, 10);
> -    if (get_param_value(option, 128, "threads", endptr) != 0)
> -        threads = strtoull(option, NULL, 10);
> -    if (get_param_value(option, 128, "maxcpus", endptr) != 0)
> -        max_cpus = strtoull(option, NULL, 10);
> -
> -    /* compute missing values, prefer sockets over cores over threads */
> -    if (smp == 0 || sockets == 0) {
> -        sockets = sockets > 0 ? sockets : 1;
> -        cores = cores > 0 ? cores : 1;
> -        threads = threads > 0 ? threads : 1;
> -        if (smp == 0) {
> -            smp = cores * threads * sockets;
> -        }
> -    } else {
> -        if (cores == 0) {
> +        unsigned cpus    = qemu_opt_get_number(opts, "cpus", 0);
> +        unsigned sockets = qemu_opt_get_number(opts, "sockets", 0);
> +        unsigned cores   = qemu_opt_get_number(opts, "cores", 0);
> +        unsigned threads = qemu_opt_get_number(opts, "threads", 0);
> +
> +        /* compute missing values, prefer sockets over cores over threads */
> +        if (cpus == 0 || sockets == 0) {
> +            sockets = sockets > 0 ? sockets : 1;
> +            cores = cores > 0 ? cores : 1;
>              threads = threads > 0 ? threads : 1;
> -            cores = smp / (sockets * threads);
> +            if (cpus == 0) {
> +                cpus = cores * threads * sockets;
> +            }
>          } else {
> -            threads = smp / (cores * sockets);
> +            if (cores == 0) {
> +                threads = threads > 0 ? threads : 1;
> +                cores = cpus / (sockets * threads);
> +            } else {
> +                threads = cpus / (cores * sockets);
> +            }
>          }
> +
> +        max_cpus = qemu_opt_get_number(opts, "maxcpus", 0);
> +
> +        smp_cpus = cpus;
> +        smp_cores = cores > 0 ? cores : 1;
> +        smp_threads = threads > 0 ? threads : 1;
> +
>      }
> -    smp_cpus = smp;
> -    smp_cores = cores > 0 ? cores : 1;
> -    smp_threads = threads > 0 ? threads : 1;
> -    if (max_cpus == 0)
> +
> +    if (max_cpus == 0) {
>          max_cpus = smp_cpus;
> +    }
> +
> +    if (max_cpus > 255) {
> +        fprintf(stderr, "Unsupported number of maxcpus\n");
> +        exit(1);
> +    }
> +    if (max_cpus < smp_cpus) {
> +        fprintf(stderr, "maxcpus must be equal to or greater than smp\n");
> +        exit(1);
> +    }
> +
>  }
>  
>  static void configure_realtime(QemuOpts *opts)
> @@ -2895,6 +2926,7 @@ int main(int argc, char **argv, char **envp)
>      qemu_add_opts(&qemu_trace_opts);
>      qemu_add_opts(&qemu_option_rom_opts);
>      qemu_add_opts(&qemu_machine_opts);
> +    qemu_add_opts(&qemu_smp_opts);
>      qemu_add_opts(&qemu_boot_opts);
>      qemu_add_opts(&qemu_sandbox_opts);
>      qemu_add_opts(&qemu_add_fd_opts);
> @@ -3624,18 +3656,7 @@ int main(int argc, char **argv, char **envp)
>                  }
>                  break;
>              case QEMU_OPTION_smp:
> -                smp_parse(optarg);
> -                if (smp_cpus < 1) {
> -                    fprintf(stderr, "Invalid number of CPUs\n");
> -                    exit(1);
> -                }
> -                if (max_cpus < smp_cpus) {
> -                    fprintf(stderr, "maxcpus must be equal to or greater than "
> -                            "smp\n");
> -                    exit(1);
> -                }
> -                if (max_cpus > 255) {
> -                    fprintf(stderr, "Unsupported number of maxcpus\n");
> +                if (!qemu_opts_parse(qemu_find_opts("smp-opts"), optarg, 1)) {
>                      exit(1);
>                  }
>                  break;
> @@ -3959,12 +3980,7 @@ int main(int argc, char **argv, char **envp)
>          data_dir[data_dir_idx++] = CONFIG_QEMU_DATADIR;
>      }
>  
> -    /*
> -     * Default to max_cpus = smp_cpus, in case the user doesn't
> -     * specify a max_cpus value.
> -     */
> -    if (!max_cpus)
> -        max_cpus = smp_cpus;
> +    smp_parse(qemu_opts_find(qemu_find_opts("smp-opts"), NULL));
>  
>      machine->max_cpus = machine->max_cpus ?: 1; /* Default to UP */
>      if (smp_cpus > machine->max_cpus) {
> -- 
> 1.7.10.4

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH] vl: convert -smp to qemu_opts_parse()
  2013-06-19 19:35 ` Anthony Liguori
@ 2013-06-28 10:39   ` Michael Tokarev
  2013-06-28 11:27     ` Peter Maydell
  0 siblings, 1 reply; 8+ messages in thread
From: Michael Tokarev @ 2013-06-28 10:39 UTC (permalink / raw)
  To: Anthony Liguori; +Cc: qemu-devel

19.06.2013 23:35, Anthony Liguori wrote:
> Michael Tokarev <mjt@tls.msk.ru> writes:
> 
>> Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
> 
> Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>

Thank you for the review.  Ok to apply it to the
trivial tree, since the change is quite simple?

Thanks,

/mjt

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH] vl: convert -smp to qemu_opts_parse()
  2013-06-28 10:39   ` Michael Tokarev
@ 2013-06-28 11:27     ` Peter Maydell
  2013-06-28 11:51       ` Andreas Färber
  0 siblings, 1 reply; 8+ messages in thread
From: Peter Maydell @ 2013-06-28 11:27 UTC (permalink / raw)
  To: Michael Tokarev; +Cc: Anthony Liguori, qemu-devel

On 28 June 2013 11:39, Michael Tokarev <mjt@tls.msk.ru> wrote:
> 19.06.2013 23:35, Anthony Liguori wrote:
>> Michael Tokarev <mjt@tls.msk.ru> writes:
>>
>>> Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
>>
>> Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>
>
> Thank you for the review.  Ok to apply it to the
> trivial tree, since the change is quite simple?

I don't think it's trivial, personally.

thanks
-- PMM

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH] vl: convert -smp to qemu_opts_parse()
  2013-06-28 11:27     ` Peter Maydell
@ 2013-06-28 11:51       ` Andreas Färber
  0 siblings, 0 replies; 8+ messages in thread
From: Andreas Färber @ 2013-06-28 11:51 UTC (permalink / raw)
  To: Peter Maydell, Michael Tokarev
  Cc: Igor Mammedov, Anthony Liguori, qemu-devel, Eduardo Habkost,
	Jason J. Herne

Am 28.06.2013 13:27, schrieb Peter Maydell:
> On 28 June 2013 11:39, Michael Tokarev <mjt@tls.msk.ru> wrote:
>> 19.06.2013 23:35, Anthony Liguori wrote:
>>> Michael Tokarev <mjt@tls.msk.ru> writes:
>>>
>>>> Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
>>>
>>> Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>
>>
>> Thank you for the review.  Ok to apply it to the
>> trivial tree, since the change is quite simple?
> 
> I don't think it's trivial, personally.

In that case as CPU maintainer I'll give it a try - it relates to and/or
conflicts with a proposal from Jason anyway.

A tricky topic - so far I only came up with an easy way to limit CPUs to
-smp, not to -smp plus Nx -device. I'm wondering if it makes more sense
that way - -smp at initialization time and maxcpus for hotplug.

Cheers,
Andreas

-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH] vl: convert -smp to qemu_opts_parse()
  2013-06-19 19:29 [Qemu-devel] [PATCH] vl: convert -smp to qemu_opts_parse() Michael Tokarev
  2013-06-19 19:35 ` Anthony Liguori
@ 2013-07-01 13:14 ` Anthony Liguori
  1 sibling, 0 replies; 8+ messages in thread
From: Anthony Liguori @ 2013-07-01 13:14 UTC (permalink / raw)
  To: Michael Tokarev, Anthony Liguori
  Cc: Eduardo Habkost, Jason J. Herne, qemu-devel, Igor Mammedov

Applied.  Thanks.

Regards,

Anthony Liguori

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH] vl: convert -smp to qemu_opts_parse()
  2013-06-24 11:06 Michael Tokarev
@ 2013-07-01 13:14 ` Anthony Liguori
  0 siblings, 0 replies; 8+ messages in thread
From: Anthony Liguori @ 2013-07-01 13:14 UTC (permalink / raw)
  To: Michael Tokarev, qemu-devel, Anthony Liguori; +Cc: qemu-trivial

Applied.  Thanks.

Regards,

Anthony Liguori

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Qemu-devel] [PATCH] vl: convert -smp to qemu_opts_parse()
@ 2013-06-24 11:06 Michael Tokarev
  2013-07-01 13:14 ` Anthony Liguori
  0 siblings, 1 reply; 8+ messages in thread
From: Michael Tokarev @ 2013-06-24 11:06 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori; +Cc: qemu-trivial, Michael Tokarev

This also introduces a new suboption, "cpus=",
which is the default.  So after this patch,

 -smp n,sockets=y

is the same as

  -smp cpus=n,sockets=y

(with "cpu" being some generic thing, referring to
either cores, or threads, or sockets, as before).

We still don't validate relations between different
numbers, for example it is still possible to say

  -smp 1,sockets=10

and it will be accepted to mean sockets=1.

Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
---
 qemu-options.hx |    4 +-
 vl.c            |  122 +++++++++++++++++++++++++++++++------------------------
 2 files changed, 71 insertions(+), 55 deletions(-)

diff --git a/qemu-options.hx b/qemu-options.hx
index 8355f9b..982e312 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -73,7 +73,7 @@ Select CPU model (@code{-cpu help} for list and additional feature selection)
 ETEXI
 
 DEF("smp", HAS_ARG, QEMU_OPTION_smp,
-    "-smp n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]\n"
+    "-smp [cpus=]n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]\n"
     "                set the number of CPUs to 'n' [default=1]\n"
     "                maxcpus= maximum number of total cpus, including\n"
     "                offline CPUs for hotplug, etc\n"
@@ -82,7 +82,7 @@ DEF("smp", HAS_ARG, QEMU_OPTION_smp,
     "                sockets= number of discrete sockets in the system\n",
         QEMU_ARCH_ALL)
 STEXI
-@item -smp @var{n}[,cores=@var{cores}][,threads=@var{threads}][,sockets=@var{sockets}][,maxcpus=@var{maxcpus}]
+@item -smp [cpus=]@var{n}[,cores=@var{cores}][,threads=@var{threads}][,sockets=@var{sockets}][,maxcpus=@var{maxcpus}]
 @findex -smp
 Simulate an SMP system with @var{n} CPUs. On the PC target, up to 255
 CPUs are supported. On Sparc32 target, Linux limits the number of usable CPUs
diff --git a/vl.c b/vl.c
index 767e020..c0c842c 100644
--- a/vl.c
+++ b/vl.c
@@ -1401,48 +1401,79 @@ static void numa_add(const char *optarg)
     }
 }
 
-static void smp_parse(const char *optarg)
+static QemuOptsList qemu_smp_opts = {
+    .name = "smp-opts",
+    .implied_opt_name = "cpus",
+    .merge_lists = true,
+    .head = QTAILQ_HEAD_INITIALIZER(qemu_smp_opts.head),
+    .desc = {
+        {
+            .name = "cpus",
+            .type = QEMU_OPT_NUMBER,
+        }, {
+            .name = "sockets",
+            .type = QEMU_OPT_NUMBER,
+        }, {
+            .name = "cores",
+            .type = QEMU_OPT_NUMBER,
+        }, {
+            .name = "threads",
+            .type = QEMU_OPT_NUMBER,
+        }, {
+            .name = "maxcpus",
+            .type = QEMU_OPT_NUMBER,
+        },
+        { /*End of list */ }
+    },
+};
+
+static void smp_parse(QemuOpts *opts)
 {
-    int smp, sockets = 0, threads = 0, cores = 0;
-    char *endptr;
-    char option[128];
+    if (opts) {
 
-    smp = strtoul(optarg, &endptr, 10);
-    if (endptr != optarg) {
-        if (*endptr == ',') {
-            endptr++;
-        }
-    }
-    if (get_param_value(option, 128, "sockets", endptr) != 0)
-        sockets = strtoull(option, NULL, 10);
-    if (get_param_value(option, 128, "cores", endptr) != 0)
-        cores = strtoull(option, NULL, 10);
-    if (get_param_value(option, 128, "threads", endptr) != 0)
-        threads = strtoull(option, NULL, 10);
-    if (get_param_value(option, 128, "maxcpus", endptr) != 0)
-        max_cpus = strtoull(option, NULL, 10);
-
-    /* compute missing values, prefer sockets over cores over threads */
-    if (smp == 0 || sockets == 0) {
-        sockets = sockets > 0 ? sockets : 1;
-        cores = cores > 0 ? cores : 1;
-        threads = threads > 0 ? threads : 1;
-        if (smp == 0) {
-            smp = cores * threads * sockets;
-        }
-    } else {
-        if (cores == 0) {
+        unsigned cpus    = qemu_opt_get_number(opts, "cpus", 0);
+        unsigned sockets = qemu_opt_get_number(opts, "sockets", 0);
+        unsigned cores   = qemu_opt_get_number(opts, "cores", 0);
+        unsigned threads = qemu_opt_get_number(opts, "threads", 0);
+
+        /* compute missing values, prefer sockets over cores over threads */
+        if (cpus == 0 || sockets == 0) {
+            sockets = sockets > 0 ? sockets : 1;
+            cores = cores > 0 ? cores : 1;
             threads = threads > 0 ? threads : 1;
-            cores = smp / (sockets * threads);
+            if (cpus == 0) {
+                cpus = cores * threads * sockets;
+            }
         } else {
-            threads = smp / (cores * sockets);
+            if (cores == 0) {
+                threads = threads > 0 ? threads : 1;
+                cores = cpus / (sockets * threads);
+            } else {
+                threads = cpus / (cores * sockets);
+            }
         }
+
+        max_cpus = qemu_opt_get_number(opts, "maxcpus", 0);
+
+        smp_cpus = cpus;
+        smp_cores = cores > 0 ? cores : 1;
+        smp_threads = threads > 0 ? threads : 1;
+
     }
-    smp_cpus = smp;
-    smp_cores = cores > 0 ? cores : 1;
-    smp_threads = threads > 0 ? threads : 1;
-    if (max_cpus == 0)
+
+    if (max_cpus == 0) {
         max_cpus = smp_cpus;
+    }
+
+    if (max_cpus > 255) {
+        fprintf(stderr, "Unsupported number of maxcpus\n");
+        exit(1);
+    }
+    if (max_cpus < smp_cpus) {
+        fprintf(stderr, "maxcpus must be equal to or greater than smp\n");
+        exit(1);
+    }
+
 }
 
 static void configure_realtime(QemuOpts *opts)
@@ -2895,6 +2926,7 @@ int main(int argc, char **argv, char **envp)
     qemu_add_opts(&qemu_trace_opts);
     qemu_add_opts(&qemu_option_rom_opts);
     qemu_add_opts(&qemu_machine_opts);
+    qemu_add_opts(&qemu_smp_opts);
     qemu_add_opts(&qemu_boot_opts);
     qemu_add_opts(&qemu_sandbox_opts);
     qemu_add_opts(&qemu_add_fd_opts);
@@ -3562,18 +3594,7 @@ int main(int argc, char **argv, char **envp)
                 }
                 break;
             case QEMU_OPTION_smp:
-                smp_parse(optarg);
-                if (smp_cpus < 1) {
-                    fprintf(stderr, "Invalid number of CPUs\n");
-                    exit(1);
-                }
-                if (max_cpus < smp_cpus) {
-                    fprintf(stderr, "maxcpus must be equal to or greater than "
-                            "smp\n");
-                    exit(1);
-                }
-                if (max_cpus > 255) {
-                    fprintf(stderr, "Unsupported number of maxcpus\n");
+                if (!qemu_opts_parse(qemu_find_opts("smp-opts"), optarg, 1)) {
                     exit(1);
                 }
                 break;
@@ -3897,12 +3918,7 @@ int main(int argc, char **argv, char **envp)
         data_dir[data_dir_idx++] = CONFIG_QEMU_DATADIR;
     }
 
-    /*
-     * Default to max_cpus = smp_cpus, in case the user doesn't
-     * specify a max_cpus value.
-     */
-    if (!max_cpus)
-        max_cpus = smp_cpus;
+    smp_parse(qemu_opts_find(qemu_find_opts("smp-opts"), NULL));
 
     machine->max_cpus = machine->max_cpus ?: 1; /* Default to UP */
     if (smp_cpus > machine->max_cpus) {
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2013-07-01 13:16 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-06-19 19:29 [Qemu-devel] [PATCH] vl: convert -smp to qemu_opts_parse() Michael Tokarev
2013-06-19 19:35 ` Anthony Liguori
2013-06-28 10:39   ` Michael Tokarev
2013-06-28 11:27     ` Peter Maydell
2013-06-28 11:51       ` Andreas Färber
2013-07-01 13:14 ` Anthony Liguori
2013-06-24 11:06 Michael Tokarev
2013-07-01 13:14 ` Anthony Liguori

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.