Message ID | 1484743207-10721-2-git-send-email-douly.fnst@cn.fujitsu.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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 > > >
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 --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); }
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(+)