From e35704ba9ce0cd1e3c401f3bfbf3faf98b0b6885 Mon Sep 17 00:00:00 2001 From: Eduardo Habkost Date: Sun, 8 Feb 2015 16:51:16 -0200 Subject: [PATCH 1/7] numa: Move NUMA declarations from sysemu.h to numa.h Not all sysemu.h users need the NUMA declarations, and keeping them in a separate file makes it easier to see what are the interfaces provided by numa.c. Reviewed-by: Paolo Bonzini Acked-by: Michael S. Tsirkin Signed-off-by: Eduardo Habkost --- hw/i386/pc.c | 1 + hw/mem/pc-dimm.c | 1 + hw/ppc/spapr.c | 1 + include/sysemu/numa.h | 28 ++++++++++++++++++++++++++++ include/sysemu/sysemu.h | 18 ------------------ monitor.c | 1 + numa.c | 2 +- vl.c | 1 + 8 files changed, 34 insertions(+), 19 deletions(-) create mode 100644 include/sysemu/numa.h diff --git a/hw/i386/pc.c b/hw/i386/pc.c index c7af6aae01..0b31c1488a 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -41,6 +41,7 @@ #include "hw/pci/msi.h" #include "hw/sysbus.h" #include "sysemu/sysemu.h" +#include "sysemu/numa.h" #include "sysemu/kvm.h" #include "kvm_i386.h" #include "hw/xen/xen.h" diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c index 18cdc54bf9..f27a087061 100644 --- a/hw/mem/pc-dimm.c +++ b/hw/mem/pc-dimm.c @@ -22,6 +22,7 @@ #include "qemu/config-file.h" #include "qapi/visitor.h" #include "qemu/range.h" +#include "sysemu/numa.h" typedef struct pc_dimms_capacity { uint64_t size; diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 812d03054d..0f92bb2df2 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -25,6 +25,7 @@ * */ #include "sysemu/sysemu.h" +#include "sysemu/numa.h" #include "hw/hw.h" #include "hw/fw-path-provider.h" #include "elf.h" diff --git a/include/sysemu/numa.h b/include/sysemu/numa.h new file mode 100644 index 0000000000..514914f9a9 --- /dev/null +++ b/include/sysemu/numa.h @@ -0,0 +1,28 @@ +#ifndef SYSEMU_NUMA_H +#define SYSEMU_NUMA_H + +#include +#include "qemu/bitmap.h" +#include "qemu/option.h" +#include "sysemu/sysemu.h" +#include "sysemu/hostmem.h" + +extern int nb_numa_nodes; /* Number of NUMA nodes */ +extern int max_numa_nodeid; /* Highest specified NUMA node ID, plus one. + * For all nodes, nodeid < max_numa_nodeid + */ + +typedef struct node_info { + uint64_t node_mem; + DECLARE_BITMAP(node_cpu, MAX_CPUMASK_BITS); + struct HostMemoryBackend *node_memdev; + bool present; +} NodeInfo; +extern NodeInfo numa_info[MAX_NODES]; +void set_numa_nodes(void); +void set_numa_modes(void); +void query_numa_node_mem(uint64_t node_mem[]); +extern QemuOptsList qemu_numa_opts; +int numa_init_func(QemuOpts *opts, void *opaque); + +#endif diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h index 748d0597f0..a72665919b 100644 --- a/include/sysemu/sysemu.h +++ b/include/sysemu/sysemu.h @@ -147,24 +147,6 @@ extern int mem_prealloc; */ #define MAX_CPUMASK_BITS 255 -extern int nb_numa_nodes; /* Number of NUMA nodes */ -extern int max_numa_nodeid; /* Highest specified NUMA node ID, plus one. - * For all nodes, nodeid < max_numa_nodeid - */ - -typedef struct node_info { - uint64_t node_mem; - DECLARE_BITMAP(node_cpu, MAX_CPUMASK_BITS); - struct HostMemoryBackend *node_memdev; - bool present; -} NodeInfo; -extern NodeInfo numa_info[MAX_NODES]; -void set_numa_nodes(void); -void set_numa_modes(void); -void query_numa_node_mem(uint64_t node_mem[]); -extern QemuOptsList qemu_numa_opts; -int numa_init_func(QemuOpts *opts, void *opaque); - #define MAX_OPTION_ROMS 16 typedef struct QEMUOptionRom { const char *name; diff --git a/monitor.c b/monitor.c index c3cc060b45..8ee6b76cd6 100644 --- a/monitor.c +++ b/monitor.c @@ -35,6 +35,7 @@ #include "sysemu/char.h" #include "ui/qemu-spice.h" #include "sysemu/sysemu.h" +#include "sysemu/numa.h" #include "monitor/monitor.h" #include "qemu/readline.h" #include "ui/console.h" diff --git a/numa.c b/numa.c index afd28666b3..40f3d36472 100644 --- a/numa.c +++ b/numa.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ -#include "sysemu/sysemu.h" +#include "sysemu/numa.h" #include "exec/cpu-common.h" #include "qemu/bitmap.h" #include "qom/cpu.h" diff --git a/vl.c b/vl.c index 8c8f14287e..eca970e985 100644 --- a/vl.c +++ b/vl.c @@ -78,6 +78,7 @@ int main(int argc, char **argv) #include "monitor/monitor.h" #include "ui/console.h" #include "sysemu/sysemu.h" +#include "sysemu/numa.h" #include "exec/gdbstub.h" #include "qemu/timer.h" #include "sysemu/char.h" From 61b388c14c5b042e6a43caaba842e351b2c88edd Mon Sep 17 00:00:00 2001 From: Eduardo Habkost Date: Sun, 8 Feb 2015 16:51:17 -0200 Subject: [PATCH 2/7] vl.c: Remove unnecessary zero-initialization of NUMA globals There's no need to zero-initialize globals, they are automatically initialized to zero. Reviewed-by: Paolo Bonzini Acked-by: Michael S. Tsirkin Signed-off-by: Eduardo Habkost --- vl.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/vl.c b/vl.c index eca970e985..52a49d93b8 100644 --- a/vl.c +++ b/vl.c @@ -2821,14 +2821,6 @@ int main(int argc, char **argv, char **envp) cyls = heads = secs = 0; translation = BIOS_ATA_TRANSLATION_AUTO; - for (i = 0; i < MAX_NODES; i++) { - numa_info[i].node_mem = 0; - numa_info[i].present = false; - bitmap_zero(numa_info[i].node_cpu, MAX_CPUMASK_BITS); - } - - nb_numa_nodes = 0; - max_numa_nodeid = 0; nb_nics = 0; bdrv_init_with_whitelist(); From de1a7c84c49affff5884175d621c95196007ea23 Mon Sep 17 00:00:00 2001 From: Eduardo Habkost Date: Sun, 8 Feb 2015 16:51:18 -0200 Subject: [PATCH 3/7] numa: Move NUMA globals to numa.c Reviewed-by: Paolo Bonzini Acked-by: Michael S. Tsirkin Signed-off-by: Eduardo Habkost --- numa.c | 3 +++ vl.c | 4 ---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/numa.c b/numa.c index 40f3d36472..61531db5a1 100644 --- a/numa.c +++ b/numa.c @@ -45,6 +45,9 @@ QemuOptsList qemu_numa_opts = { }; static int have_memdevs = -1; +int nb_numa_nodes; +int max_numa_nodeid; +NodeInfo numa_info[MAX_NODES]; static void numa_node_parse(NumaNodeOptions *node, QemuOpts *opts, Error **errp) { diff --git a/vl.c b/vl.c index 52a49d93b8..52e9f2cacd 100644 --- a/vl.c +++ b/vl.c @@ -184,10 +184,6 @@ uint8_t qemu_extra_params_fw[2]; int icount_align_option; -int nb_numa_nodes; -int max_numa_nodeid; -NodeInfo numa_info[MAX_NODES]; - /* The bytes in qemu_uuid[] are in the order specified by RFC4122, _not_ in the * little-endian "wire format" described in the SMBIOS 2.6 specification. */ From 25712ffe8478a95abd7b82e2f085c7c929498643 Mon Sep 17 00:00:00 2001 From: Eduardo Habkost Date: Sun, 8 Feb 2015 16:51:19 -0200 Subject: [PATCH 4/7] numa: Make max_numa_nodeid static Now the only code that uses the variable is inside numa.c. Reviewed-by: Paolo Bonzini Acked-by: Michael S. Tsirkin Signed-off-by: Eduardo Habkost --- include/sysemu/numa.h | 3 --- numa.c | 4 +++- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/include/sysemu/numa.h b/include/sysemu/numa.h index 514914f9a9..eae881e453 100644 --- a/include/sysemu/numa.h +++ b/include/sysemu/numa.h @@ -8,9 +8,6 @@ #include "sysemu/hostmem.h" extern int nb_numa_nodes; /* Number of NUMA nodes */ -extern int max_numa_nodeid; /* Highest specified NUMA node ID, plus one. - * For all nodes, nodeid < max_numa_nodeid - */ typedef struct node_info { uint64_t node_mem; diff --git a/numa.c b/numa.c index 61531db5a1..84d4cb5d13 100644 --- a/numa.c +++ b/numa.c @@ -45,8 +45,10 @@ QemuOptsList qemu_numa_opts = { }; static int have_memdevs = -1; +static int max_numa_nodeid; /* Highest specified NUMA node ID, plus one. + * For all nodes, nodeid < max_numa_nodeid + */ int nb_numa_nodes; -int max_numa_nodeid; NodeInfo numa_info[MAX_NODES]; static void numa_node_parse(NumaNodeOptions *node, QemuOpts *opts, Error **errp) From 7dcd1d70fe2886a1e30d32678b795e6b9b6dd5c4 Mon Sep 17 00:00:00 2001 From: Eduardo Habkost Date: Sun, 8 Feb 2015 16:51:20 -0200 Subject: [PATCH 5/7] numa: Move QemuOpts parsing to set_numa_nodes() This allows us to make numa_init_func() static. Reviewed-by: Paolo Bonzini Acked-by: Michael S. Tsirkin Signed-off-by: Eduardo Habkost --- include/sysemu/numa.h | 1 - numa.c | 9 ++++++++- vl.c | 5 ----- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/include/sysemu/numa.h b/include/sysemu/numa.h index eae881e453..d25ada9119 100644 --- a/include/sysemu/numa.h +++ b/include/sysemu/numa.h @@ -20,6 +20,5 @@ void set_numa_nodes(void); void set_numa_modes(void); void query_numa_node_mem(uint64_t node_mem[]); extern QemuOptsList qemu_numa_opts; -int numa_init_func(QemuOpts *opts, void *opaque); #endif diff --git a/numa.c b/numa.c index 84d4cb5d13..eb9259b66a 100644 --- a/numa.c +++ b/numa.c @@ -36,6 +36,8 @@ #include "sysemu/hostmem.h" #include "qmp-commands.h" #include "hw/mem/pc-dimm.h" +#include "qemu/option.h" +#include "qemu/config-file.h" QemuOptsList qemu_numa_opts = { .name = "numa", @@ -121,7 +123,7 @@ static void numa_node_parse(NumaNodeOptions *node, QemuOpts *opts, Error **errp) max_numa_nodeid = MAX(max_numa_nodeid, nodenr + 1); } -int numa_init_func(QemuOpts *opts, void *opaque) +static int numa_init_func(QemuOpts *opts, void *opaque) { NumaOptions *object = NULL; Error *err = NULL; @@ -168,6 +170,11 @@ void set_numa_nodes(void) { int i; + if (qemu_opts_foreach(qemu_find_opts("numa"), numa_init_func, + NULL, 1) != 0) { + exit(1); + } + assert(max_numa_nodeid <= MAX_NODES); /* No support for sparse NUMA node IDs yet: */ diff --git a/vl.c b/vl.c index 52e9f2cacd..6db7724262 100644 --- a/vl.c +++ b/vl.c @@ -4157,11 +4157,6 @@ int main(int argc, char **argv, char **envp) default_drive(default_floppy, snapshot, IF_FLOPPY, 0, FD_OPTS); default_drive(default_sdcard, snapshot, IF_SD, 0, SD_OPTS); - if (qemu_opts_foreach(qemu_find_opts("numa"), numa_init_func, - NULL, 1) != 0) { - exit(1); - } - set_numa_nodes(); if (qemu_opts_foreach(qemu_find_opts("mon"), mon_init_func, NULL, 1) != 0) { From 1c1e6732786d46c7b0ab160cbf61122c53bb44cc Mon Sep 17 00:00:00 2001 From: Eduardo Habkost Date: Sun, 8 Feb 2015 16:51:21 -0200 Subject: [PATCH 6/7] numa: Rename option parsing functions Renaming set_numa_nodes() and numa_init_func() to parse_numa_opts() and parse_numa() makes the purpose of those functions clearer. Reviewed-by: Paolo Bonzini Acked-by: Michael S. Tsirkin Signed-off-by: Eduardo Habkost --- include/sysemu/numa.h | 2 +- numa.c | 6 +++--- vl.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/sysemu/numa.h b/include/sysemu/numa.h index d25ada9119..453b49af06 100644 --- a/include/sysemu/numa.h +++ b/include/sysemu/numa.h @@ -16,7 +16,7 @@ typedef struct node_info { bool present; } NodeInfo; extern NodeInfo numa_info[MAX_NODES]; -void set_numa_nodes(void); +void parse_numa_opts(void); void set_numa_modes(void); void query_numa_node_mem(uint64_t node_mem[]); extern QemuOptsList qemu_numa_opts; diff --git a/numa.c b/numa.c index eb9259b66a..d5b95e1a0a 100644 --- a/numa.c +++ b/numa.c @@ -123,7 +123,7 @@ static void numa_node_parse(NumaNodeOptions *node, QemuOpts *opts, Error **errp) max_numa_nodeid = MAX(max_numa_nodeid, nodenr + 1); } -static int numa_init_func(QemuOpts *opts, void *opaque) +static int parse_numa(QemuOpts *opts, void *opaque) { NumaOptions *object = NULL; Error *err = NULL; @@ -166,11 +166,11 @@ error: return -1; } -void set_numa_nodes(void) +void parse_numa_opts(void) { int i; - if (qemu_opts_foreach(qemu_find_opts("numa"), numa_init_func, + if (qemu_opts_foreach(qemu_find_opts("numa"), parse_numa, NULL, 1) != 0) { exit(1); } diff --git a/vl.c b/vl.c index 6db7724262..a71f015694 100644 --- a/vl.c +++ b/vl.c @@ -4157,7 +4157,7 @@ int main(int argc, char **argv, char **envp) default_drive(default_floppy, snapshot, IF_FLOPPY, 0, FD_OPTS); default_drive(default_sdcard, snapshot, IF_SD, 0, SD_OPTS); - set_numa_nodes(); + parse_numa_opts(); if (qemu_opts_foreach(qemu_find_opts("mon"), mon_init_func, NULL, 1) != 0) { exit(1); From dde11116782c1891a057165539efc014cf365026 Mon Sep 17 00:00:00 2001 From: Eduardo Habkost Date: Sun, 8 Feb 2015 16:51:22 -0200 Subject: [PATCH 7/7] numa: Rename set_numa_modes() to numa_post_machine_init() This function does some initialization that needs to be done after machine init. The function may be eventually removed if we move the CPUState.numa_node initialization to the CPU init code, but while the function exists, lets give it a name that makes sense. Reviewed-by: Paolo Bonzini Acked-by: Michael S. Tsirkin Signed-off-by: Eduardo Habkost --- include/sysemu/numa.h | 2 +- numa.c | 2 +- vl.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/sysemu/numa.h b/include/sysemu/numa.h index 453b49af06..5633b856a8 100644 --- a/include/sysemu/numa.h +++ b/include/sysemu/numa.h @@ -17,7 +17,7 @@ typedef struct node_info { } NodeInfo; extern NodeInfo numa_info[MAX_NODES]; void parse_numa_opts(void); -void set_numa_modes(void); +void numa_post_machine_init(void); void query_numa_node_mem(uint64_t node_mem[]); extern QemuOptsList qemu_numa_opts; diff --git a/numa.c b/numa.c index d5b95e1a0a..0d15375dfd 100644 --- a/numa.c +++ b/numa.c @@ -246,7 +246,7 @@ void parse_numa_opts(void) } } -void set_numa_modes(void) +void numa_post_machine_init(void) { CPUState *cpu; int i; diff --git a/vl.c b/vl.c index a71f015694..b5795df40d 100644 --- a/vl.c +++ b/vl.c @@ -4216,7 +4216,7 @@ int main(int argc, char **argv, char **envp) cpu_synchronize_all_post_init(); - set_numa_modes(); + numa_post_machine_init(); /* init USB devices */ if (usb_enabled()) {