diff mbox

[1/3] cpu: Make the mapping of CPUs and NUMA nodes in cpu_common_realizefn

Message ID 1484743207-10721-2-git-send-email-douly.fnst@cn.fujitsu.com
State New
Headers show

Commit Message

Dou Liyang Jan. 18, 2017, 12:40 p.m. UTC
Current default way of seting the CPUState::numa_node might be wrong
in case on cold/hot-plug CPUs. Making the users confused why the
NUMA info is different beetween the guests and monitor.

Make the mapping of CPUs and NUMA nodes in qom/cpu.c:
cpu_common_realizefn(), where each VCPUs need to realize.

Signed-off-by: Dou Liyang <douly.fnst@cn.fujitsu.com>
---
 qom/cpu.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

Comments

Eduardo Habkost Jan. 18, 2017, 12:56 p.m. UTC | #1
On Wed, Jan 18, 2017 at 08:40:05PM +0800, Dou Liyang wrote:
> Current default way of seting the CPUState::numa_node might be wrong
> in case on cold/hot-plug CPUs. Making the users confused why the
> NUMA info is different beetween the guests and monitor.
> 
> Make the mapping of CPUs and NUMA nodes in qom/cpu.c:
> cpu_common_realizefn(), where each VCPUs need to realize.
> 
> Signed-off-by: Dou Liyang <douly.fnst@cn.fujitsu.com>

parse_numa_opts() is called a long time before any CPU is
created, so this should be safe.

Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>

(But we can squash patch 2/3 and patch 3/3 in this patch).

> ---
>  qom/cpu.c | 15 +++++++++++++++
>  1 file changed, 15 insertions(+)
> 
> diff --git a/qom/cpu.c b/qom/cpu.c
> index 61ee0cb..e08dceb 100644
> --- a/qom/cpu.c
> +++ b/qom/cpu.c
> @@ -23,6 +23,7 @@
>  #include "qemu-common.h"
>  #include "qom/cpu.h"
>  #include "sysemu/kvm.h"
> +#include "sysemu/numa.h"
>  #include "qemu/notify.h"
>  #include "qemu/log.h"
>  #include "exec/log.h"
> @@ -338,6 +339,18 @@ static void cpu_common_parse_features(const char *typename, char *features,
>      }
>  }
>  
> +static void cpu_common_map_numa_node(CPUState *cpu)
> +{
> +    int i;
> +
> +    for (i = 0; i < nb_numa_nodes; i++) {
> +        assert(cpu->cpu_index < max_cpus);
> +        if (test_bit(cpu->cpu_index, numa_info[i].node_cpu)) {
> +            cpu->numa_node = i;
> +        }
> +    }
> +}
> +
>  static void cpu_common_realizefn(DeviceState *dev, Error **errp)
>  {
>      CPUState *cpu = CPU(dev);
> @@ -347,6 +360,8 @@ static void cpu_common_realizefn(DeviceState *dev, Error **errp)
>          cpu_resume(cpu);
>      }
>  
> +    cpu_common_map_numa_node(cpu);
> +
>      /* NOTE: latest generic point where the cpu is fully realized */
>      trace_init_vcpu(cpu);
>  }
> -- 
> 2.5.5
> 
> 
>
Dou Liyang Jan. 18, 2017, 1:17 p.m. UTC | #2
Hi, Eduardo

At 01/18/2017 08:56 PM, Eduardo Habkost wrote:
> On Wed, Jan 18, 2017 at 08:40:05PM +0800, Dou Liyang wrote:
>> Current default way of seting the CPUState::numa_node might be wrong
>> in case on cold/hot-plug CPUs. Making the users confused why the
>> NUMA info is different beetween the guests and monitor.
>>
>> Make the mapping of CPUs and NUMA nodes in qom/cpu.c:
>> cpu_common_realizefn(), where each VCPUs need to realize.
>>
>> Signed-off-by: Dou Liyang <douly.fnst@cn.fujitsu.com>
>
> parse_numa_opts() is called a long time before any CPU is
> created, so this should be safe.
>
> Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
>
> (But we can squash patch 2/3 and patch 3/3 in this patch).

OK, :)

Thanks,
	Liyang.

>
>> ---
>>  qom/cpu.c | 15 +++++++++++++++
>>  1 file changed, 15 insertions(+)
>>
>> diff --git a/qom/cpu.c b/qom/cpu.c
>> index 61ee0cb..e08dceb 100644
>> --- a/qom/cpu.c
>> +++ b/qom/cpu.c
>> @@ -23,6 +23,7 @@
>>  #include "qemu-common.h"
>>  #include "qom/cpu.h"
>>  #include "sysemu/kvm.h"
>> +#include "sysemu/numa.h"
>>  #include "qemu/notify.h"
>>  #include "qemu/log.h"
>>  #include "exec/log.h"
>> @@ -338,6 +339,18 @@ static void cpu_common_parse_features(const char *typename, char *features,
>>      }
>>  }
>>
>> +static void cpu_common_map_numa_node(CPUState *cpu)
>> +{
>> +    int i;
>> +
>> +    for (i = 0; i < nb_numa_nodes; i++) {
>> +        assert(cpu->cpu_index < max_cpus);
>> +        if (test_bit(cpu->cpu_index, numa_info[i].node_cpu)) {
>> +            cpu->numa_node = i;
>> +        }
>> +    }
>> +}
>> +
>>  static void cpu_common_realizefn(DeviceState *dev, Error **errp)
>>  {
>>      CPUState *cpu = CPU(dev);
>> @@ -347,6 +360,8 @@ static void cpu_common_realizefn(DeviceState *dev, Error **errp)
>>          cpu_resume(cpu);
>>      }
>>
>> +    cpu_common_map_numa_node(cpu);
>> +
>>      /* NOTE: latest generic point where the cpu is fully realized */
>>      trace_init_vcpu(cpu);
>>  }
>> --
>> 2.5.5
>>
>>
>>
>
diff mbox

Patch

diff --git a/qom/cpu.c b/qom/cpu.c
index 61ee0cb..e08dceb 100644
--- a/qom/cpu.c
+++ b/qom/cpu.c
@@ -23,6 +23,7 @@ 
 #include "qemu-common.h"
 #include "qom/cpu.h"
 #include "sysemu/kvm.h"
+#include "sysemu/numa.h"
 #include "qemu/notify.h"
 #include "qemu/log.h"
 #include "exec/log.h"
@@ -338,6 +339,18 @@  static void cpu_common_parse_features(const char *typename, char *features,
     }
 }
 
+static void cpu_common_map_numa_node(CPUState *cpu)
+{
+    int i;
+
+    for (i = 0; i < nb_numa_nodes; i++) {
+        assert(cpu->cpu_index < max_cpus);
+        if (test_bit(cpu->cpu_index, numa_info[i].node_cpu)) {
+            cpu->numa_node = i;
+        }
+    }
+}
+
 static void cpu_common_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cpu = CPU(dev);
@@ -347,6 +360,8 @@  static void cpu_common_realizefn(DeviceState *dev, Error **errp)
         cpu_resume(cpu);
     }
 
+    cpu_common_map_numa_node(cpu);
+
     /* NOTE: latest generic point where the cpu is fully realized */
     trace_init_vcpu(cpu);
 }