Re: [RFC PATCH v3 4/4] hw/arm/virt: Parse -smp cluster parameter in virt_smp_parse

2021-05-18 Thread Andrew Jones
On Tue, May 18, 2021 at 11:48:34AM +0800, wangyanan (Y) wrote:
> Hi Salil,
> 
> On 2021/5/17 23:17, Salil Mehta wrote:
> > > From: Qemu-devel
> > > [mailto:qemu-devel-bounces+salil.mehta=huawei@nongnu.org] On Behalf Of
> > > Yanan Wang
> > > Sent: Sunday, May 16, 2021 11:32 AM
> > > To: Peter Maydell ; Paolo Bonzini
> > > ; Andrew Jones ; Michael S . 
> > > Tsirkin
> > > ; Igor Mammedov ; Shannon Zhao
> > > ; qemu-devel@nongnu.org; qemu-...@nongnu.org
> > > Cc: Song Bao Hua (Barry Song) ; Philippe
> > > Mathieu-Daudé ; wangyanan (Y) ;
> > > Zengtao (B) ; Wanghaibin (D)
> > > ; yuzenghui ; yangyicong
> > > ; zhukeqian 
> > > Subject: [RFC PATCH v3 4/4] hw/arm/virt: Parse -smp cluster parameter in
> > > virt_smp_parse
> > > 
> > > There is a separate function virt_smp_parse() in hw/virt/arm.c used
> > > to parse cpu topology for the ARM machines. So add parsing of -smp
> > > cluster parameter in it, then total number of logical cpus will be
> > > calculated like: max_cpus = sockets * clusters * cores * threads.
> > > 
> > > Note, we will assume multi-cluster in one socket is not supported
> > > and default the value of clusters to 1, if it's not explicitly
> > > specified in -smp cmdline.
> > > 
> > > Signed-off-by: Yanan Wang 
> > > ---
> > >   hw/arm/virt.c | 32 ++--
> > >   1 file changed, 18 insertions(+), 14 deletions(-)
> > > 
> > > diff --git a/hw/arm/virt.c b/hw/arm/virt.c
> > > index 7de822e491..678d5ef36c 100644
> > > --- a/hw/arm/virt.c
> > > +++ b/hw/arm/virt.c
> > > @@ -2642,8 +2642,8 @@ static int virt_kvm_type(MachineState *ms, const 
> > > char
> > > *type_str)
> > >* with the -smp cmdlines when parsing them.
> > >*
> > >* We require that at least one of cpus or maxcpus must be provided.
> > > - * Threads will default to 1 if not provided. Sockets and cores must
> > > - * be either both provided or both not.
> > > + * Clusters and threads will default to 1 if they are not provided.
> > > + * Sockets and cores must be either both provided or both not.
> > >*
> > >* Note, if neither sockets nor cores are specified, we will calculate
> > >* all the missing values just like smp_parse() does, but will disable
> > > @@ -2652,15 +2652,18 @@ static int virt_kvm_type(MachineState *ms, const 
> > > char
> > > *type_str)
> > >   static void virt_smp_parse(MachineState *ms, QemuOpts *opts)
> > >   {
> > >   VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(ms);
> > > +VirtMachineState *vms = VIRT_MACHINE(ms);
> > > 
> > >   if (opts) {
> > >   unsigned cpus = qemu_opt_get_number(opts, "cpus", 0);
> > >   unsigned maxcpus = qemu_opt_get_number(opts, "maxcpus", 0);
> > >   unsigned sockets = qemu_opt_get_number(opts, "sockets", 0);
> > > +unsigned clusters = qemu_opt_get_number(opts, "clusters", 0);
> > >   unsigned cores = qemu_opt_get_number(opts, "cores", 0);
> > >   unsigned threads = qemu_opt_get_number(opts, "threads", 0);
> > > 
> > > -/* Default threads to 1 if not provided */
> > > +/* Default clusters and threads to 1 if not provided */
> > > +clusters = clusters > 0 ? clusters : 1;
> > >   threads = threads > 0 ? threads : 1;
> > > 
> > >   if (cpus == 0 && maxcpus == 0) {
> > > @@ -2676,13 +2679,13 @@ static void virt_smp_parse(MachineState *ms, 
> > > QemuOpts
> > > *opts)
> > >   cores = 1;
> > >   if (cpus == 0) {
> > >   sockets = 1;
> > > -cpus = sockets * cores * threads;
> > > +cpus = sockets * clusters * cores * threads;
> > >   } else {
> > >   maxcpus = maxcpus > 0 ? maxcpus : cpus;
> > > -sockets = maxcpus / (cores * threads);
> > > +sockets = maxcpus / (clusters * cores * threads);
> > >   }
> > >   } else if (sockets > 0 && cores > 0) {
> > > -cpus = cpus > 0 ? cpus : sockets * cores * threads;
> > > +cpus = cpus > 0 ? cpus : sockets * clusters * cores * 
> > > threads;
> > >   maxcpus = maxcpus > 0 ? maxcpus : cpus;
> > >   } else {
> > >   error_report("sockets and cores must be both provided "
> > > @@ -2695,25 +2698,26 @@ static void virt_smp_parse(MachineState *ms, 
> > > QemuOpts
> > > *opts)
> > >   exit(1);
> > >   }
> > > 
> > > -if (sockets * cores * threads < cpus) {
> > > +if (sockets * clusters * cores * threads < cpus) {
> > >   error_report("cpu topology: "
> > > - "sockets (%u) * cores (%u) * threads (%u) < "
> > > - "smp_cpus (%u)",
> > > - sockets, cores, threads, cpus);
> > > + "sockets (%u) * clusters (%u) * cores (%u) * "
> > > + "threads (%u) < smp_cpus (%u)",
> > > + sockets, clusters, cores, threads, cpus);
> > >   

RE: [RFC PATCH v3 4/4] hw/arm/virt: Parse -smp cluster parameter in virt_smp_parse

2021-05-18 Thread Salil Mehta
> From: wangyanan (Y)
> 
> Hi Salil,
> 
> On 2021/5/17 23:17, Salil Mehta wrote:
> >> From: Qemu-devel
> >> [mailto:qemu-devel-bounces+salil.mehta=huawei@nongnu.org] On Behalf Of
> >> Yanan Wang
> >> Sent: Sunday, May 16, 2021 11:32 AM
> >> To: Peter Maydell ; Paolo Bonzini
> >> ; Andrew Jones ; Michael S . 
> >> Tsirkin
> >> ; Igor Mammedov ; Shannon Zhao
> >> ; qemu-devel@nongnu.org; qemu-...@nongnu.org
> >> Cc: Song Bao Hua (Barry Song) ; Philippe
> >> Mathieu-Daudé ; wangyanan (Y) ;
> >> Zengtao (B) ; Wanghaibin (D)
> >> ; yuzenghui ; yangyicong
> >> ; zhukeqian 
> >> Subject: [RFC PATCH v3 4/4] hw/arm/virt: Parse -smp cluster parameter in
> >> virt_smp_parse
> >>
> >> There is a separate function virt_smp_parse() in hw/virt/arm.c used
> >> to parse cpu topology for the ARM machines. So add parsing of -smp
> >> cluster parameter in it, then total number of logical cpus will be
> >> calculated like: max_cpus = sockets * clusters * cores * threads.
> >>
> >> Note, we will assume multi-cluster in one socket is not supported
> >> and default the value of clusters to 1, if it's not explicitly
> >> specified in -smp cmdline.
> >>
> >> Signed-off-by: Yanan Wang 
> >> ---
> >>   hw/arm/virt.c | 32 ++--
> >>   1 file changed, 18 insertions(+), 14 deletions(-)
> >>
> >> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
> >> index 7de822e491..678d5ef36c 100644
> >> --- a/hw/arm/virt.c
> >> +++ b/hw/arm/virt.c
> >> @@ -2642,8 +2642,8 @@ static int virt_kvm_type(MachineState *ms, const char
> >> *type_str)
> >>* with the -smp cmdlines when parsing them.
> >>*
> >>* We require that at least one of cpus or maxcpus must be provided.
> >> - * Threads will default to 1 if not provided. Sockets and cores must
> >> - * be either both provided or both not.
> >> + * Clusters and threads will default to 1 if they are not provided.
> >> + * Sockets and cores must be either both provided or both not.
> >>*
> >>* Note, if neither sockets nor cores are specified, we will calculate
> >>* all the missing values just like smp_parse() does, but will disable
> >> @@ -2652,15 +2652,18 @@ static int virt_kvm_type(MachineState *ms, const 
> >> char
> >> *type_str)
> >>   static void virt_smp_parse(MachineState *ms, QemuOpts *opts)
> >>   {
> >>   VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(ms);
> >> +VirtMachineState *vms = VIRT_MACHINE(ms);
> >>
> >>   if (opts) {
> >>   unsigned cpus = qemu_opt_get_number(opts, "cpus", 0);
> >>   unsigned maxcpus = qemu_opt_get_number(opts, "maxcpus", 0);
> >>   unsigned sockets = qemu_opt_get_number(opts, "sockets", 0);
> >> +unsigned clusters = qemu_opt_get_number(opts, "clusters", 0);
> >>   unsigned cores = qemu_opt_get_number(opts, "cores", 0);
> >>   unsigned threads = qemu_opt_get_number(opts, "threads", 0);
> >>
> >> -/* Default threads to 1 if not provided */
> >> +/* Default clusters and threads to 1 if not provided */
> >> +clusters = clusters > 0 ? clusters : 1;
> >>   threads = threads > 0 ? threads : 1;
> >>
> >>   if (cpus == 0 && maxcpus == 0) {
> >> @@ -2676,13 +2679,13 @@ static void virt_smp_parse(MachineState *ms, 
> >> QemuOpts
> >> *opts)
> >>   cores = 1;
> >>   if (cpus == 0) {
> >>   sockets = 1;
> >> -cpus = sockets * cores * threads;
> >> +cpus = sockets * clusters * cores * threads;
> >>   } else {
> >>   maxcpus = maxcpus > 0 ? maxcpus : cpus;
> >> -sockets = maxcpus / (cores * threads);
> >> +sockets = maxcpus / (clusters * cores * threads);
> >>   }
> >>   } else if (sockets > 0 && cores > 0) {
> >> -cpus = cpus > 0 ? cpus : sockets * cores * threads;
> >> +cpus = cpus > 0 ? cpus : sockets * clusters * cores * threads;
> >>   maxcpus = maxcpus > 0 ? maxcpus : cpus;
> >>   } else {
> >>   error_report("sockets and cores must be both provided "
> >> @@ -2695,25 +2698,26 @@ static void virt_smp_parse(MachineState *ms, 
> >> QemuOpts
> >> *opts)
> >>   exit(1);
> >>   }
> >>
> >> -if (sockets * cores * threads < cpus) {
> >> +if (sockets * clusters * cores * threads < cpus) {
> >>   error_report("cpu topology: "
> >> - "sockets (%u) * cores (%u) * threads (%u) < "
> >> - "smp_cpus (%u)",
> >> - sockets, cores, threads, cpus);
> >> + "sockets (%u) * clusters (%u) * cores (%u) * "
> >> + "threads (%u) < smp_cpus (%u)",
> >> + sockets, clusters, cores, threads, cpus);
> >>   exit(1);
> >>   }
> >>
> >> -if (sockets * cores * threads != maxcpus) {
> >> +if (sockets * clusters * cores * threads != 

Re: [RFC PATCH v3 4/4] hw/arm/virt: Parse -smp cluster parameter in virt_smp_parse

2021-05-17 Thread wangyanan (Y)

Hi Salil,

On 2021/5/17 23:17, Salil Mehta wrote:

From: Qemu-devel
[mailto:qemu-devel-bounces+salil.mehta=huawei@nongnu.org] On Behalf Of
Yanan Wang
Sent: Sunday, May 16, 2021 11:32 AM
To: Peter Maydell ; Paolo Bonzini
; Andrew Jones ; Michael S . Tsirkin
; Igor Mammedov ; Shannon Zhao
; qemu-devel@nongnu.org; qemu-...@nongnu.org
Cc: Song Bao Hua (Barry Song) ; Philippe
Mathieu-Daudé ; wangyanan (Y) ;
Zengtao (B) ; Wanghaibin (D)
; yuzenghui ; yangyicong
; zhukeqian 
Subject: [RFC PATCH v3 4/4] hw/arm/virt: Parse -smp cluster parameter in
virt_smp_parse

There is a separate function virt_smp_parse() in hw/virt/arm.c used
to parse cpu topology for the ARM machines. So add parsing of -smp
cluster parameter in it, then total number of logical cpus will be
calculated like: max_cpus = sockets * clusters * cores * threads.

Note, we will assume multi-cluster in one socket is not supported
and default the value of clusters to 1, if it's not explicitly
specified in -smp cmdline.

Signed-off-by: Yanan Wang 
---
  hw/arm/virt.c | 32 ++--
  1 file changed, 18 insertions(+), 14 deletions(-)

diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 7de822e491..678d5ef36c 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -2642,8 +2642,8 @@ static int virt_kvm_type(MachineState *ms, const char
*type_str)
   * with the -smp cmdlines when parsing them.
   *
   * We require that at least one of cpus or maxcpus must be provided.
- * Threads will default to 1 if not provided. Sockets and cores must
- * be either both provided or both not.
+ * Clusters and threads will default to 1 if they are not provided.
+ * Sockets and cores must be either both provided or both not.
   *
   * Note, if neither sockets nor cores are specified, we will calculate
   * all the missing values just like smp_parse() does, but will disable
@@ -2652,15 +2652,18 @@ static int virt_kvm_type(MachineState *ms, const char
*type_str)
  static void virt_smp_parse(MachineState *ms, QemuOpts *opts)
  {
  VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(ms);
+VirtMachineState *vms = VIRT_MACHINE(ms);

  if (opts) {
  unsigned cpus = qemu_opt_get_number(opts, "cpus", 0);
  unsigned maxcpus = qemu_opt_get_number(opts, "maxcpus", 0);
  unsigned sockets = qemu_opt_get_number(opts, "sockets", 0);
+unsigned clusters = qemu_opt_get_number(opts, "clusters", 0);
  unsigned cores = qemu_opt_get_number(opts, "cores", 0);
  unsigned threads = qemu_opt_get_number(opts, "threads", 0);

-/* Default threads to 1 if not provided */
+/* Default clusters and threads to 1 if not provided */
+clusters = clusters > 0 ? clusters : 1;
  threads = threads > 0 ? threads : 1;

  if (cpus == 0 && maxcpus == 0) {
@@ -2676,13 +2679,13 @@ static void virt_smp_parse(MachineState *ms, QemuOpts
*opts)
  cores = 1;
  if (cpus == 0) {
  sockets = 1;
-cpus = sockets * cores * threads;
+cpus = sockets * clusters * cores * threads;
  } else {
  maxcpus = maxcpus > 0 ? maxcpus : cpus;
-sockets = maxcpus / (cores * threads);
+sockets = maxcpus / (clusters * cores * threads);
  }
  } else if (sockets > 0 && cores > 0) {
-cpus = cpus > 0 ? cpus : sockets * cores * threads;
+cpus = cpus > 0 ? cpus : sockets * clusters * cores * threads;
  maxcpus = maxcpus > 0 ? maxcpus : cpus;
  } else {
  error_report("sockets and cores must be both provided "
@@ -2695,25 +2698,26 @@ static void virt_smp_parse(MachineState *ms, QemuOpts
*opts)
  exit(1);
  }

-if (sockets * cores * threads < cpus) {
+if (sockets * clusters * cores * threads < cpus) {
  error_report("cpu topology: "
- "sockets (%u) * cores (%u) * threads (%u) < "
- "smp_cpus (%u)",
- sockets, cores, threads, cpus);
+ "sockets (%u) * clusters (%u) * cores (%u) * "
+ "threads (%u) < smp_cpus (%u)",
+ sockets, clusters, cores, threads, cpus);
  exit(1);
  }

-if (sockets * cores * threads != maxcpus) {
+if (sockets * clusters * cores * threads != maxcpus) {
  error_report("cpu topology: "
- "sockets (%u) * cores (%u) * threads (%u) "
- "!= maxcpus (%u)",
- sockets, cores, threads, maxcpus);
+ "sockets (%u) * clusters (%u) * cores (%u) * "
+ "threads (%u) != maxcpus (%u)",
+ sockets, clusters, cores, threads, maxcpus);
  exit(1);
  }

  ms->smp.cpus = cpus;
  ms->smp.max_cpus = maxcpus;
  ms->smp.sockets = 

RE: [RFC PATCH v3 4/4] hw/arm/virt: Parse -smp cluster parameter in virt_smp_parse

2021-05-17 Thread Salil Mehta
> From: Qemu-devel
> [mailto:qemu-devel-bounces+salil.mehta=huawei@nongnu.org] On Behalf Of
> Yanan Wang
> Sent: Sunday, May 16, 2021 11:32 AM
> To: Peter Maydell ; Paolo Bonzini
> ; Andrew Jones ; Michael S . Tsirkin
> ; Igor Mammedov ; Shannon Zhao
> ; qemu-devel@nongnu.org; qemu-...@nongnu.org
> Cc: Song Bao Hua (Barry Song) ; Philippe
> Mathieu-Daudé ; wangyanan (Y) ;
> Zengtao (B) ; Wanghaibin (D)
> ; yuzenghui ; yangyicong
> ; zhukeqian 
> Subject: [RFC PATCH v3 4/4] hw/arm/virt: Parse -smp cluster parameter in
> virt_smp_parse
> 
> There is a separate function virt_smp_parse() in hw/virt/arm.c used
> to parse cpu topology for the ARM machines. So add parsing of -smp
> cluster parameter in it, then total number of logical cpus will be
> calculated like: max_cpus = sockets * clusters * cores * threads.
> 
> Note, we will assume multi-cluster in one socket is not supported
> and default the value of clusters to 1, if it's not explicitly
> specified in -smp cmdline.
> 
> Signed-off-by: Yanan Wang 
> ---
>  hw/arm/virt.c | 32 ++--
>  1 file changed, 18 insertions(+), 14 deletions(-)
> 
> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
> index 7de822e491..678d5ef36c 100644
> --- a/hw/arm/virt.c
> +++ b/hw/arm/virt.c
> @@ -2642,8 +2642,8 @@ static int virt_kvm_type(MachineState *ms, const char
> *type_str)
>   * with the -smp cmdlines when parsing them.
>   *
>   * We require that at least one of cpus or maxcpus must be provided.
> - * Threads will default to 1 if not provided. Sockets and cores must
> - * be either both provided or both not.
> + * Clusters and threads will default to 1 if they are not provided.
> + * Sockets and cores must be either both provided or both not.
>   *
>   * Note, if neither sockets nor cores are specified, we will calculate
>   * all the missing values just like smp_parse() does, but will disable
> @@ -2652,15 +2652,18 @@ static int virt_kvm_type(MachineState *ms, const char
> *type_str)
>  static void virt_smp_parse(MachineState *ms, QemuOpts *opts)
>  {
>  VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(ms);
> +VirtMachineState *vms = VIRT_MACHINE(ms);
> 
>  if (opts) {
>  unsigned cpus = qemu_opt_get_number(opts, "cpus", 0);
>  unsigned maxcpus = qemu_opt_get_number(opts, "maxcpus", 0);
>  unsigned sockets = qemu_opt_get_number(opts, "sockets", 0);
> +unsigned clusters = qemu_opt_get_number(opts, "clusters", 0);
>  unsigned cores = qemu_opt_get_number(opts, "cores", 0);
>  unsigned threads = qemu_opt_get_number(opts, "threads", 0);
> 
> -/* Default threads to 1 if not provided */
> +/* Default clusters and threads to 1 if not provided */
> +clusters = clusters > 0 ? clusters : 1;
>  threads = threads > 0 ? threads : 1;
> 
>  if (cpus == 0 && maxcpus == 0) {
> @@ -2676,13 +2679,13 @@ static void virt_smp_parse(MachineState *ms, QemuOpts
> *opts)
>  cores = 1;
>  if (cpus == 0) {
>  sockets = 1;
> -cpus = sockets * cores * threads;
> +cpus = sockets * clusters * cores * threads;
>  } else {
>  maxcpus = maxcpus > 0 ? maxcpus : cpus;
> -sockets = maxcpus / (cores * threads);
> +sockets = maxcpus / (clusters * cores * threads);
>  }
>  } else if (sockets > 0 && cores > 0) {
> -cpus = cpus > 0 ? cpus : sockets * cores * threads;
> +cpus = cpus > 0 ? cpus : sockets * clusters * cores * threads;
>  maxcpus = maxcpus > 0 ? maxcpus : cpus;
>  } else {
>  error_report("sockets and cores must be both provided "
> @@ -2695,25 +2698,26 @@ static void virt_smp_parse(MachineState *ms, QemuOpts
> *opts)
>  exit(1);
>  }
> 
> -if (sockets * cores * threads < cpus) {
> +if (sockets * clusters * cores * threads < cpus) {
>  error_report("cpu topology: "
> - "sockets (%u) * cores (%u) * threads (%u) < "
> - "smp_cpus (%u)",
> - sockets, cores, threads, cpus);
> + "sockets (%u) * clusters (%u) * cores (%u) * "
> + "threads (%u) < smp_cpus (%u)",
> + sockets, clusters, cores, threads, cpus);
>  exit(1);
>  }
> 
> -if (sockets * cores * threads != maxcpus) {
> +if (sockets * clusters * cores * threads != maxcpus) {
>  error_report("cpu topology: "
> - "sockets (%u) * cores (%u) * threads (%u) "
> - "!= maxcpus (%u)",
> - sockets, cores, threads, maxcpus);
> + "sockets (%u) * clusters (%u) * cores (%u) * "
> + "threads (%u) != maxcpus (%u)",
> + sockets, clusters, cores, threads, maxcpus);

Re: [RFC PATCH v3 4/4] hw/arm/virt: Parse -smp cluster parameter in virt_smp_parse

2021-05-17 Thread wangyanan (Y)

Hi Drew,

On 2021/5/17 17:12, Andrew Jones wrote:

On Sun, May 16, 2021 at 06:32:28PM +0800, Yanan Wang wrote:

There is a separate function virt_smp_parse() in hw/virt/arm.c used
to parse cpu topology for the ARM machines. So add parsing of -smp
cluster parameter in it, then total number of logical cpus will be
calculated like: max_cpus = sockets * clusters * cores * threads.

Note, we will assume multi-cluster in one socket is not supported
and default the value of clusters to 1, if it's not explicitly
specified in -smp cmdline.

Signed-off-by: Yanan Wang 
---
  hw/arm/virt.c | 32 ++--
  1 file changed, 18 insertions(+), 14 deletions(-)

diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 7de822e491..678d5ef36c 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -2642,8 +2642,8 @@ static int virt_kvm_type(MachineState *ms, const char 
*type_str)
   * with the -smp cmdlines when parsing them.
   *
   * We require that at least one of cpus or maxcpus must be provided.
- * Threads will default to 1 if not provided. Sockets and cores must
- * be either both provided or both not.
+ * Clusters and threads will default to 1 if they are not provided.
+ * Sockets and cores must be either both provided or both not.
   *
   * Note, if neither sockets nor cores are specified, we will calculate
   * all the missing values just like smp_parse() does, but will disable
@@ -2652,15 +2652,18 @@ static int virt_kvm_type(MachineState *ms, const char 
*type_str)
  static void virt_smp_parse(MachineState *ms, QemuOpts *opts)
  {
  VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(ms);
+VirtMachineState *vms = VIRT_MACHINE(ms);
  
  if (opts) {

  unsigned cpus = qemu_opt_get_number(opts, "cpus", 0);
  unsigned maxcpus = qemu_opt_get_number(opts, "maxcpus", 0);
  unsigned sockets = qemu_opt_get_number(opts, "sockets", 0);
+unsigned clusters = qemu_opt_get_number(opts, "clusters", 0);
  unsigned cores = qemu_opt_get_number(opts, "cores", 0);
  unsigned threads = qemu_opt_get_number(opts, "threads", 0);
  
-/* Default threads to 1 if not provided */

+/* Default clusters and threads to 1 if not provided */
+clusters = clusters > 0 ? clusters : 1;
  threads = threads > 0 ? threads : 1;
  
  if (cpus == 0 && maxcpus == 0) {

@@ -2676,13 +2679,13 @@ static void virt_smp_parse(MachineState *ms, QemuOpts 
*opts)
  cores = 1;
  if (cpus == 0) {
  sockets = 1;
-cpus = sockets * cores * threads;
+cpus = sockets * clusters * cores * threads;
  } else {
  maxcpus = maxcpus > 0 ? maxcpus : cpus;
-sockets = maxcpus / (cores * threads);
+sockets = maxcpus / (clusters * cores * threads);
  }
  } else if (sockets > 0 && cores > 0) {
-cpus = cpus > 0 ? cpus : sockets * cores * threads;
+cpus = cpus > 0 ? cpus : sockets * clusters * cores * threads;
  maxcpus = maxcpus > 0 ? maxcpus : cpus;
  } else {
  error_report("sockets and cores must be both provided "
@@ -2695,25 +2698,26 @@ static void virt_smp_parse(MachineState *ms, QemuOpts 
*opts)
  exit(1);
  }
  
-if (sockets * cores * threads < cpus) {

+if (sockets * clusters * cores * threads < cpus) {
  error_report("cpu topology: "
- "sockets (%u) * cores (%u) * threads (%u) < "
- "smp_cpus (%u)",
- sockets, cores, threads, cpus);
+ "sockets (%u) * clusters (%u) * cores (%u) * "
+ "threads (%u) < smp_cpus (%u)",
+ sockets, clusters, cores, threads, cpus);
  exit(1);
  }
  
-if (sockets * cores * threads != maxcpus) {

+if (sockets * clusters * cores * threads != maxcpus) {
  error_report("cpu topology: "
- "sockets (%u) * cores (%u) * threads (%u) "
- "!= maxcpus (%u)",
- sockets, cores, threads, maxcpus);
+ "sockets (%u) * clusters (%u) * cores (%u) * "
+ "threads (%u) != maxcpus (%u)",
+ sockets, clusters, cores, threads, maxcpus);
  exit(1);
  }
  
  ms->smp.cpus = cpus;

  ms->smp.max_cpus = maxcpus;
  ms->smp.sockets = sockets;
+vms->smp_clusters = clusters;
  ms->smp.cores = cores;
  ms->smp.threads = threads;
  }
--
2.19.1


After reworking "[RFC PATCH v3 9/9] hw/arm/virt: Add separate -smp parsing
function for ARM machines", this should also be reworked and fully tested,
possibly using a standalone test, as as I suggested in the other review.

Ok, I will make full test.

Thanks,
Yanan

Thanks,
drew

.




Re: [RFC PATCH v3 4/4] hw/arm/virt: Parse -smp cluster parameter in virt_smp_parse

2021-05-17 Thread Andrew Jones
On Sun, May 16, 2021 at 06:32:28PM +0800, Yanan Wang wrote:
> There is a separate function virt_smp_parse() in hw/virt/arm.c used
> to parse cpu topology for the ARM machines. So add parsing of -smp
> cluster parameter in it, then total number of logical cpus will be
> calculated like: max_cpus = sockets * clusters * cores * threads.
> 
> Note, we will assume multi-cluster in one socket is not supported
> and default the value of clusters to 1, if it's not explicitly
> specified in -smp cmdline.
> 
> Signed-off-by: Yanan Wang 
> ---
>  hw/arm/virt.c | 32 ++--
>  1 file changed, 18 insertions(+), 14 deletions(-)
> 
> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
> index 7de822e491..678d5ef36c 100644
> --- a/hw/arm/virt.c
> +++ b/hw/arm/virt.c
> @@ -2642,8 +2642,8 @@ static int virt_kvm_type(MachineState *ms, const char 
> *type_str)
>   * with the -smp cmdlines when parsing them.
>   *
>   * We require that at least one of cpus or maxcpus must be provided.
> - * Threads will default to 1 if not provided. Sockets and cores must
> - * be either both provided or both not.
> + * Clusters and threads will default to 1 if they are not provided.
> + * Sockets and cores must be either both provided or both not.
>   *
>   * Note, if neither sockets nor cores are specified, we will calculate
>   * all the missing values just like smp_parse() does, but will disable
> @@ -2652,15 +2652,18 @@ static int virt_kvm_type(MachineState *ms, const char 
> *type_str)
>  static void virt_smp_parse(MachineState *ms, QemuOpts *opts)
>  {
>  VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(ms);
> +VirtMachineState *vms = VIRT_MACHINE(ms);
>  
>  if (opts) {
>  unsigned cpus = qemu_opt_get_number(opts, "cpus", 0);
>  unsigned maxcpus = qemu_opt_get_number(opts, "maxcpus", 0);
>  unsigned sockets = qemu_opt_get_number(opts, "sockets", 0);
> +unsigned clusters = qemu_opt_get_number(opts, "clusters", 0);
>  unsigned cores = qemu_opt_get_number(opts, "cores", 0);
>  unsigned threads = qemu_opt_get_number(opts, "threads", 0);
>  
> -/* Default threads to 1 if not provided */
> +/* Default clusters and threads to 1 if not provided */
> +clusters = clusters > 0 ? clusters : 1;
>  threads = threads > 0 ? threads : 1;
>  
>  if (cpus == 0 && maxcpus == 0) {
> @@ -2676,13 +2679,13 @@ static void virt_smp_parse(MachineState *ms, QemuOpts 
> *opts)
>  cores = 1;
>  if (cpus == 0) {
>  sockets = 1;
> -cpus = sockets * cores * threads;
> +cpus = sockets * clusters * cores * threads;
>  } else {
>  maxcpus = maxcpus > 0 ? maxcpus : cpus;
> -sockets = maxcpus / (cores * threads);
> +sockets = maxcpus / (clusters * cores * threads);
>  }
>  } else if (sockets > 0 && cores > 0) {
> -cpus = cpus > 0 ? cpus : sockets * cores * threads;
> +cpus = cpus > 0 ? cpus : sockets * clusters * cores * threads;
>  maxcpus = maxcpus > 0 ? maxcpus : cpus;
>  } else {
>  error_report("sockets and cores must be both provided "
> @@ -2695,25 +2698,26 @@ static void virt_smp_parse(MachineState *ms, QemuOpts 
> *opts)
>  exit(1);
>  }
>  
> -if (sockets * cores * threads < cpus) {
> +if (sockets * clusters * cores * threads < cpus) {
>  error_report("cpu topology: "
> - "sockets (%u) * cores (%u) * threads (%u) < "
> - "smp_cpus (%u)",
> - sockets, cores, threads, cpus);
> + "sockets (%u) * clusters (%u) * cores (%u) * "
> + "threads (%u) < smp_cpus (%u)",
> + sockets, clusters, cores, threads, cpus);
>  exit(1);
>  }
>  
> -if (sockets * cores * threads != maxcpus) {
> +if (sockets * clusters * cores * threads != maxcpus) {
>  error_report("cpu topology: "
> - "sockets (%u) * cores (%u) * threads (%u) "
> - "!= maxcpus (%u)",
> - sockets, cores, threads, maxcpus);
> + "sockets (%u) * clusters (%u) * cores (%u) * "
> + "threads (%u) != maxcpus (%u)",
> + sockets, clusters, cores, threads, maxcpus);
>  exit(1);
>  }
>  
>  ms->smp.cpus = cpus;
>  ms->smp.max_cpus = maxcpus;
>  ms->smp.sockets = sockets;
> +vms->smp_clusters = clusters;
>  ms->smp.cores = cores;
>  ms->smp.threads = threads;
>  }
> -- 
> 2.19.1
>

After reworking "[RFC PATCH v3 9/9] hw/arm/virt: Add separate -smp parsing
function for ARM machines", this should also be reworked and fully tested,
possibly using a standalone test, as