diff mbox series

[v4,06/16] hw/i386: Update structures for nodes_per_pkg

Message ID 158161782489.48948.9328710425201785950.stgit@naples-babu.amd.com (mailing list archive)
State New, archived
Headers show
Series APIC ID fixes for AMD EPYC CPU model | expand

Commit Message

Babu Moger Feb. 13, 2020, 6:17 p.m. UTC
Update structures X86CPUTopoIDs and CPUX86State to hold the nodes_per_pkg.
This is required to build EPYC mode topology.

Signed-off-by: Babu Moger <babu.moger@amd.com>
---
 hw/i386/pc.c               |    1 +
 hw/i386/x86.c              |    2 ++
 include/hw/i386/topology.h |    2 ++
 include/hw/i386/x86.h      |    1 +
 target/i386/cpu.c          |    1 +
 target/i386/cpu.h          |    1 +
 6 files changed, 8 insertions(+)

Comments

Igor Mammedov Feb. 24, 2020, 8:34 a.m. UTC | #1
On Thu, 13 Feb 2020 12:17:04 -0600
Babu Moger <babu.moger@amd.com> wrote:

> Update structures X86CPUTopoIDs and CPUX86State to hold the nodes_per_pkg.
> This is required to build EPYC mode topology.
>
> Signed-off-by: Babu Moger <babu.moger@amd.com>
> ---
>  hw/i386/pc.c               |    1 +
>  hw/i386/x86.c              |    2 ++
>  include/hw/i386/topology.h |    2 ++
>  include/hw/i386/x86.h      |    1 +
>  target/i386/cpu.c          |    1 +
>  target/i386/cpu.h          |    1 +
>  6 files changed, 8 insertions(+)
> 
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index f13721ac43..02fdb3d506 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -1753,6 +1753,7 @@ static void pc_cpu_pre_plug(HotplugHandler *hotplug_dev,
>      init_topo_info(&topo_info, x86ms);
>  
>      env->nr_dies = x86ms->smp_dies;
> +    env->nr_nodes = ms->numa_state->num_nodes / ms->smp.sockets;

it would be better if calculation would result in valid result
so you won't have to later scatter MAX(env->nr_nodes, 1) everywhere.

also I'd use earlier intialized:
  env->nr_nodes = topo_info->nodes_per_pkg
to avoid repeating calculation

>      /*
>       * If APIC ID is not set,
> diff --git a/hw/i386/x86.c b/hw/i386/x86.c
> index 083effb2f5..3d944f68e6 100644
> --- a/hw/i386/x86.c
> +++ b/hw/i386/x86.c
> @@ -89,11 +89,13 @@ void x86_cpu_new(X86MachineState *x86ms, int64_t apic_id, Error **errp)
>      Object *cpu = NULL;
>      Error *local_err = NULL;
>      CPUX86State *env = NULL;
> +    MachineState *ms = MACHINE(x86ms);
>  
>      cpu = object_new(MACHINE(x86ms)->cpu_type);
>  
>      env = &X86_CPU(cpu)->env;
>      env->nr_dies = x86ms->smp_dies;
> +    env->nr_nodes = ms->numa_state->num_nodes / ms->smp.sockets;

Is this really necessary?  (I think pc_cpu_pre_plug should take care of setting it)

>      object_property_set_uint(cpu, apic_id, "apic-id", &local_err);
>      object_property_set_bool(cpu, true, "realized", &local_err);
> diff --git a/include/hw/i386/topology.h b/include/hw/i386/topology.h
> index ef0ab0b6a3..522c77e6a9 100644
> --- a/include/hw/i386/topology.h
> +++ b/include/hw/i386/topology.h
> @@ -41,12 +41,14 @@
>  
>  #include "qemu/bitops.h"
>  #include "hw/i386/x86.h"
> +#include "sysemu/numa.h"
>  
>  static inline void init_topo_info(X86CPUTopoInfo *topo_info,
>                                    const X86MachineState *x86ms)
>  {
>      MachineState *ms = MACHINE(x86ms);
>  
> +    topo_info->nodes_per_pkg = ms->numa_state->num_nodes / ms->smp.sockets;
>      topo_info->dies_per_pkg = x86ms->smp_dies;
>      topo_info->cores_per_die = ms->smp.cores;
>      topo_info->threads_per_core = ms->smp.threads;
> diff --git a/include/hw/i386/x86.h b/include/hw/i386/x86.h
> index ad62b01cf2..d76fd0bbb1 100644
> --- a/include/hw/i386/x86.h
> +++ b/include/hw/i386/x86.h
> @@ -48,6 +48,7 @@ typedef struct X86CPUTopoIDs {
>  } X86CPUTopoIDs;
>  
>  typedef struct X86CPUTopoInfo {
> +    unsigned nodes_per_pkg;
>      unsigned dies_per_pkg;
>      unsigned cores_per_die;
>      unsigned threads_per_core;
> diff --git a/target/i386/cpu.c b/target/i386/cpu.c
> index 7e630f47ac..5d6edfd09b 100644
> --- a/target/i386/cpu.c
> +++ b/target/i386/cpu.c
> @@ -6761,6 +6761,7 @@ static void x86_cpu_initfn(Object *obj)
>      FeatureWord w;
>  
>      env->nr_dies = 1;
> +    env->nr_nodes = 1;
>      cpu_set_cpustate_pointers(cpu);
>  
>      object_property_add(obj, "family", "int",
> diff --git a/target/i386/cpu.h b/target/i386/cpu.h
> index af282936a7..627a8cb9be 100644
> --- a/target/i386/cpu.h
> +++ b/target/i386/cpu.h
> @@ -1603,6 +1603,7 @@ typedef struct CPUX86State {
>      TPRAccess tpr_access_type;
>  
>      unsigned nr_dies;
> +    unsigned nr_nodes;
>  } CPUX86State;
>  
>  struct kvm_msrs;
>
Babu Moger Feb. 24, 2020, 5:12 p.m. UTC | #2
On 2/24/20 2:34 AM, Igor Mammedov wrote:
> On Thu, 13 Feb 2020 12:17:04 -0600
> Babu Moger <babu.moger@amd.com> wrote:
> 
>> Update structures X86CPUTopoIDs and CPUX86State to hold the nodes_per_pkg.
>> This is required to build EPYC mode topology.
>>
>> Signed-off-by: Babu Moger <babu.moger@amd.com>
>> ---
>>  hw/i386/pc.c               |    1 +
>>  hw/i386/x86.c              |    2 ++
>>  include/hw/i386/topology.h |    2 ++
>>  include/hw/i386/x86.h      |    1 +
>>  target/i386/cpu.c          |    1 +
>>  target/i386/cpu.h          |    1 +
>>  6 files changed, 8 insertions(+)
>>
>> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
>> index f13721ac43..02fdb3d506 100644
>> --- a/hw/i386/pc.c
>> +++ b/hw/i386/pc.c
>> @@ -1753,6 +1753,7 @@ static void pc_cpu_pre_plug(HotplugHandler *hotplug_dev,
>>      init_topo_info(&topo_info, x86ms);
>>  
>>      env->nr_dies = x86ms->smp_dies;
>> +    env->nr_nodes = ms->numa_state->num_nodes / ms->smp.sockets;
> 
> it would be better if calculation would result in valid result
> so you won't have to later scatter MAX(env->nr_nodes, 1) everywhere.

Ok. Sure.
> 
> also I'd use earlier intialized:
>   env->nr_nodes = topo_info->nodes_per_pkg
> to avoid repeating calculation

yes. Will do it.

> 
>>      /*
>>       * If APIC ID is not set,
>> diff --git a/hw/i386/x86.c b/hw/i386/x86.c
>> index 083effb2f5..3d944f68e6 100644
>> --- a/hw/i386/x86.c
>> +++ b/hw/i386/x86.c
>> @@ -89,11 +89,13 @@ void x86_cpu_new(X86MachineState *x86ms, int64_t apic_id, Error **errp)
>>      Object *cpu = NULL;
>>      Error *local_err = NULL;
>>      CPUX86State *env = NULL;
>> +    MachineState *ms = MACHINE(x86ms);
>>  
>>      cpu = object_new(MACHINE(x86ms)->cpu_type);
>>  
>>      env = &X86_CPU(cpu)->env;
>>      env->nr_dies = x86ms->smp_dies;
>> +    env->nr_nodes = ms->numa_state->num_nodes / ms->smp.sockets;
> 
> Is this really necessary?  (I think pc_cpu_pre_plug should take care of setting it)

This does not seem necessary. I can add as a separate patch to remove env
initialization from x86_cpu_new.

> 
>>      object_property_set_uint(cpu, apic_id, "apic-id", &local_err);
>>      object_property_set_bool(cpu, true, "realized", &local_err);
>> diff --git a/include/hw/i386/topology.h b/include/hw/i386/topology.h
>> index ef0ab0b6a3..522c77e6a9 100644
>> --- a/include/hw/i386/topology.h
>> +++ b/include/hw/i386/topology.h
>> @@ -41,12 +41,14 @@
>>  
>>  #include "qemu/bitops.h"
>>  #include "hw/i386/x86.h"
>> +#include "sysemu/numa.h"
>>  
>>  static inline void init_topo_info(X86CPUTopoInfo *topo_info,
>>                                    const X86MachineState *x86ms)
>>  {
>>      MachineState *ms = MACHINE(x86ms);
>>  
>> +    topo_info->nodes_per_pkg = ms->numa_state->num_nodes / ms->smp.sockets;
>>      topo_info->dies_per_pkg = x86ms->smp_dies;
>>      topo_info->cores_per_die = ms->smp.cores;
>>      topo_info->threads_per_core = ms->smp.threads;
>> diff --git a/include/hw/i386/x86.h b/include/hw/i386/x86.h
>> index ad62b01cf2..d76fd0bbb1 100644
>> --- a/include/hw/i386/x86.h
>> +++ b/include/hw/i386/x86.h
>> @@ -48,6 +48,7 @@ typedef struct X86CPUTopoIDs {
>>  } X86CPUTopoIDs;
>>  
>>  typedef struct X86CPUTopoInfo {
>> +    unsigned nodes_per_pkg;
>>      unsigned dies_per_pkg;
>>      unsigned cores_per_die;
>>      unsigned threads_per_core;
>> diff --git a/target/i386/cpu.c b/target/i386/cpu.c
>> index 7e630f47ac..5d6edfd09b 100644
>> --- a/target/i386/cpu.c
>> +++ b/target/i386/cpu.c
>> @@ -6761,6 +6761,7 @@ static void x86_cpu_initfn(Object *obj)
>>      FeatureWord w;
>>  
>>      env->nr_dies = 1;
>> +    env->nr_nodes = 1;
>>      cpu_set_cpustate_pointers(cpu);
>>  
>>      object_property_add(obj, "family", "int",
>> diff --git a/target/i386/cpu.h b/target/i386/cpu.h
>> index af282936a7..627a8cb9be 100644
>> --- a/target/i386/cpu.h
>> +++ b/target/i386/cpu.h
>> @@ -1603,6 +1603,7 @@ typedef struct CPUX86State {
>>      TPRAccess tpr_access_type;
>>  
>>      unsigned nr_dies;
>> +    unsigned nr_nodes;
>>  } CPUX86State;
>>  
>>  struct kvm_msrs;
>>
>
Igor Mammedov Feb. 25, 2020, 7:42 a.m. UTC | #3
On Mon, 24 Feb 2020 11:12:41 -0600
Babu Moger <babu.moger@amd.com> wrote:

> On 2/24/20 2:34 AM, Igor Mammedov wrote:
> > On Thu, 13 Feb 2020 12:17:04 -0600
> > Babu Moger <babu.moger@amd.com> wrote:
> >   
> >> Update structures X86CPUTopoIDs and CPUX86State to hold the nodes_per_pkg.
> >> This is required to build EPYC mode topology.
> >>
> >> Signed-off-by: Babu Moger <babu.moger@amd.com>
> >> ---
> >>  hw/i386/pc.c               |    1 +
> >>  hw/i386/x86.c              |    2 ++
> >>  include/hw/i386/topology.h |    2 ++
> >>  include/hw/i386/x86.h      |    1 +
> >>  target/i386/cpu.c          |    1 +
> >>  target/i386/cpu.h          |    1 +
> >>  6 files changed, 8 insertions(+)
> >>
> >> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> >> index f13721ac43..02fdb3d506 100644
> >> --- a/hw/i386/pc.c
> >> +++ b/hw/i386/pc.c
> >> @@ -1753,6 +1753,7 @@ static void pc_cpu_pre_plug(HotplugHandler *hotplug_dev,
> >>      init_topo_info(&topo_info, x86ms);
> >>  
> >>      env->nr_dies = x86ms->smp_dies;
> >> +    env->nr_nodes = ms->numa_state->num_nodes / ms->smp.sockets;  
> > 
> > it would be better if calculation would result in valid result
> > so you won't have to later scatter MAX(env->nr_nodes, 1) everywhere.  
> 
> Ok. Sure.
> > 
> > also I'd use earlier intialized:
> >   env->nr_nodes = topo_info->nodes_per_pkg
> > to avoid repeating calculation  
> 
> yes. Will do it.
> 
> >   
> >>      /*
> >>       * If APIC ID is not set,
> >> diff --git a/hw/i386/x86.c b/hw/i386/x86.c
> >> index 083effb2f5..3d944f68e6 100644
> >> --- a/hw/i386/x86.c
> >> +++ b/hw/i386/x86.c
> >> @@ -89,11 +89,13 @@ void x86_cpu_new(X86MachineState *x86ms, int64_t apic_id, Error **errp)
> >>      Object *cpu = NULL;
> >>      Error *local_err = NULL;
> >>      CPUX86State *env = NULL;
> >> +    MachineState *ms = MACHINE(x86ms);
> >>  
> >>      cpu = object_new(MACHINE(x86ms)->cpu_type);
> >>  
> >>      env = &X86_CPU(cpu)->env;
> >>      env->nr_dies = x86ms->smp_dies;
> >> +    env->nr_nodes = ms->numa_state->num_nodes / ms->smp.sockets;  
> > 
> > Is this really necessary?  (I think pc_cpu_pre_plug should take care of setting it)  
> 
> This does not seem necessary. I can add as a separate patch to remove env
> initialization from x86_cpu_new.

it doesn't have to be part of this series, but it's up to you
how to send it

> 
> >   
> >>      object_property_set_uint(cpu, apic_id, "apic-id", &local_err);
> >>      object_property_set_bool(cpu, true, "realized", &local_err);
> >> diff --git a/include/hw/i386/topology.h b/include/hw/i386/topology.h
> >> index ef0ab0b6a3..522c77e6a9 100644
> >> --- a/include/hw/i386/topology.h
> >> +++ b/include/hw/i386/topology.h
> >> @@ -41,12 +41,14 @@
> >>  
> >>  #include "qemu/bitops.h"
> >>  #include "hw/i386/x86.h"
> >> +#include "sysemu/numa.h"
> >>  
> >>  static inline void init_topo_info(X86CPUTopoInfo *topo_info,
> >>                                    const X86MachineState *x86ms)
> >>  {
> >>      MachineState *ms = MACHINE(x86ms);
> >>  
> >> +    topo_info->nodes_per_pkg = ms->numa_state->num_nodes / ms->smp.sockets;
> >>      topo_info->dies_per_pkg = x86ms->smp_dies;
> >>      topo_info->cores_per_die = ms->smp.cores;
> >>      topo_info->threads_per_core = ms->smp.threads;
> >> diff --git a/include/hw/i386/x86.h b/include/hw/i386/x86.h
> >> index ad62b01cf2..d76fd0bbb1 100644
> >> --- a/include/hw/i386/x86.h
> >> +++ b/include/hw/i386/x86.h
> >> @@ -48,6 +48,7 @@ typedef struct X86CPUTopoIDs {
> >>  } X86CPUTopoIDs;
> >>  
> >>  typedef struct X86CPUTopoInfo {
> >> +    unsigned nodes_per_pkg;
> >>      unsigned dies_per_pkg;
> >>      unsigned cores_per_die;
> >>      unsigned threads_per_core;
> >> diff --git a/target/i386/cpu.c b/target/i386/cpu.c
> >> index 7e630f47ac..5d6edfd09b 100644
> >> --- a/target/i386/cpu.c
> >> +++ b/target/i386/cpu.c
> >> @@ -6761,6 +6761,7 @@ static void x86_cpu_initfn(Object *obj)
> >>      FeatureWord w;
> >>  
> >>      env->nr_dies = 1;
> >> +    env->nr_nodes = 1;
> >>      cpu_set_cpustate_pointers(cpu);
> >>  
> >>      object_property_add(obj, "family", "int",
> >> diff --git a/target/i386/cpu.h b/target/i386/cpu.h
> >> index af282936a7..627a8cb9be 100644
> >> --- a/target/i386/cpu.h
> >> +++ b/target/i386/cpu.h
> >> @@ -1603,6 +1603,7 @@ typedef struct CPUX86State {
> >>      TPRAccess tpr_access_type;
> >>  
> >>      unsigned nr_dies;
> >> +    unsigned nr_nodes;
> >>  } CPUX86State;
> >>  
> >>  struct kvm_msrs;
> >>  
> >   
>
diff mbox series

Patch

diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index f13721ac43..02fdb3d506 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1753,6 +1753,7 @@  static void pc_cpu_pre_plug(HotplugHandler *hotplug_dev,
     init_topo_info(&topo_info, x86ms);
 
     env->nr_dies = x86ms->smp_dies;
+    env->nr_nodes = ms->numa_state->num_nodes / ms->smp.sockets;
 
     /*
      * If APIC ID is not set,
diff --git a/hw/i386/x86.c b/hw/i386/x86.c
index 083effb2f5..3d944f68e6 100644
--- a/hw/i386/x86.c
+++ b/hw/i386/x86.c
@@ -89,11 +89,13 @@  void x86_cpu_new(X86MachineState *x86ms, int64_t apic_id, Error **errp)
     Object *cpu = NULL;
     Error *local_err = NULL;
     CPUX86State *env = NULL;
+    MachineState *ms = MACHINE(x86ms);
 
     cpu = object_new(MACHINE(x86ms)->cpu_type);
 
     env = &X86_CPU(cpu)->env;
     env->nr_dies = x86ms->smp_dies;
+    env->nr_nodes = ms->numa_state->num_nodes / ms->smp.sockets;
 
     object_property_set_uint(cpu, apic_id, "apic-id", &local_err);
     object_property_set_bool(cpu, true, "realized", &local_err);
diff --git a/include/hw/i386/topology.h b/include/hw/i386/topology.h
index ef0ab0b6a3..522c77e6a9 100644
--- a/include/hw/i386/topology.h
+++ b/include/hw/i386/topology.h
@@ -41,12 +41,14 @@ 
 
 #include "qemu/bitops.h"
 #include "hw/i386/x86.h"
+#include "sysemu/numa.h"
 
 static inline void init_topo_info(X86CPUTopoInfo *topo_info,
                                   const X86MachineState *x86ms)
 {
     MachineState *ms = MACHINE(x86ms);
 
+    topo_info->nodes_per_pkg = ms->numa_state->num_nodes / ms->smp.sockets;
     topo_info->dies_per_pkg = x86ms->smp_dies;
     topo_info->cores_per_die = ms->smp.cores;
     topo_info->threads_per_core = ms->smp.threads;
diff --git a/include/hw/i386/x86.h b/include/hw/i386/x86.h
index ad62b01cf2..d76fd0bbb1 100644
--- a/include/hw/i386/x86.h
+++ b/include/hw/i386/x86.h
@@ -48,6 +48,7 @@  typedef struct X86CPUTopoIDs {
 } X86CPUTopoIDs;
 
 typedef struct X86CPUTopoInfo {
+    unsigned nodes_per_pkg;
     unsigned dies_per_pkg;
     unsigned cores_per_die;
     unsigned threads_per_core;
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index 7e630f47ac..5d6edfd09b 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -6761,6 +6761,7 @@  static void x86_cpu_initfn(Object *obj)
     FeatureWord w;
 
     env->nr_dies = 1;
+    env->nr_nodes = 1;
     cpu_set_cpustate_pointers(cpu);
 
     object_property_add(obj, "family", "int",
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
index af282936a7..627a8cb9be 100644
--- a/target/i386/cpu.h
+++ b/target/i386/cpu.h
@@ -1603,6 +1603,7 @@  typedef struct CPUX86State {
     TPRAccess tpr_access_type;
 
     unsigned nr_dies;
+    unsigned nr_nodes;
 } CPUX86State;
 
 struct kvm_msrs;