v2: add numa monitor command
PATCH 7/8 v2: add numa monitor command
Signature · 9 lines
Andre Przywara AMD-Operating System Research Center (OSRC), Dresden, Germany Tel: +49 351 277-84917 ----to satisfy European Law for business letters: AMD Saxony Limited Liability Company & Co. KG, Wilschdorfer Landstr. 101, 01109 Dresden, Germany Register Court Dresden: HRA 4896, General Partner authorized to represent: AMD Saxony LLC (Wilmington, Delaware, US) General Manager of AMD Saxony LLC: Dr. Hans-R. Deppe, Thomas McCoy
# HG changeset patch
# User Andre Przywara <[email protected]> # Date 1229435568 -3600
# Node ID 4f0a8ac2d88ffffc1dcd82785c1620553baa86da # Parent 5a74bd76931b79713803795b3943aa8383946521 add -numa monitor command to repin guest nodes
monitor.c +42 -1
@@ -39,6 +39,9 @@#include "qemu-timer.h" #include "migration.h" #include "kvm.h" +#ifdef CONFIG_NUMA +#include <numa.h> +#endif //#define DEBUG //#define DEBUG_COMPLETION
@@ -1285,6 +1288,9 @@ static void do_info_numa(void) {int i, j; +#ifndef CONFIG_NUMA +term_printf ("NUMA placement support: not compiled\n" ); +#endif term_printf ("%d nodes\n" , numnumanodes);for (i =0 ; i < numnumanodes; i++) {term_printf ("node %d cpus:" , i);
@@ -1292,7 +1298,40 @@ static void do_info_numa(void)if (node_to_cpus[i] & (1ULL << j))term_printf (" %d" , j);term_printf ("\n" );term_printf ("node %d size: %" PRId64" MB\n" , i, node_mem[i] >>20 ); - } +term_printf ("node %d host: " , i); +if (hostnodes[i] == (uint64_t )-1 )term_printf ("*\n" );else +term_printf ("%" PRId64"\n" , hostnodes[i]); + } +} + +static void do_numa (const char *affinity) +{ +#ifdef CONFIG_NUMA +uint64_t newaff[MAX_NODES ]; +int i; +unsigned long offset =0 ; + +if (numnumanodes <=0 )term_printf ("No NUMA nodes defined.\n" );else +if (numa_available () ==-1 )term_printf ("Not a NUMA host.\n" );else + { +for (i =0 ; i < numnumanodes; i++) newaff[i] = hostnodes[i]; +parse_numa_args (affinity, newaff,NULL ,NULL ,MAX_NODES ,0 ); +for (i =0 ; i < numnumanodes; i++) { +if (newaff[i] != hostnodes[i]) { + hostnodes[i] = newaff[i]; +if (hostnodes[i] == (uint64_t )-1 ) +numa_tonodemask_memory (phys_ram_base + offset, + node_mem[i], &numa_all_nodes); +else +numa_tonode_memory (phys_ram_base + offset, + node_mem[i], hostnodes[i] % (numa_max_node () +1 )); + } + offset += node_mem[i]; + } + } +#else +term_printf ("NUMA host affinity support not compiled in\n" ); +#endif }#ifdef CONFIG_PROFILER
@@ -1514,6 +1553,8 @@ static const term_cmd_t term_cmds[] = { "value", "set maximum speed (in bytes) for migrations" }, {"balloon" ,"i" , do_balloon, "target", "request VM to change it's memory allocation (in MB)" }, + { "numa", "s", do_numa, + "affinity", "change NUMA affinity" }, { NULL, NULL, }, };
Quoted 44 lines · Andre Przywara
Signed-off-by Andre Przywara <[email protected]># HG changeset patch
# User Andre Przywara <[email protected]> # Date 1229435568 -3600
# Node ID4f0a8ac2d88ffffc1dcd82785c1620553baa86da# Parent5a74bd76931b79713803795b3943aa8383946521add -numa monitor command to repin guest nodesdiff -r
5a74bd76931b-r4f0a8ac2d88fmonitor.cmonitor.c +13
-1@@ -39,6 +39,9 @@#include "qemu-timer.h" #include "migration.h" #include "kvm.h" +#ifdef CONFIG_NUMA +#include <numa.h> +#endif //#define DEBUG //#define DEBUG_COMPLETION @@ -1285,6 +1288,9 @@ static void do_info_numa(void) {int i, j; +#ifndef CONFIG_NUMA +term_printf ("NUMA placement support: not compiled\n" ); +#endif term_printf ("%d nodes\n" , numnumanodes);for (i =0 ; i < numnumanodes; i++) {term_printf ("node %d cpus:" , i);@@ -1292,7 +1298,40 @@ static void do_info_numa(void)if (node_to_cpus[i] & (1ULL << j))term_printf (" %d" , j);term_printf ("\n" );term_printf ("node %d size: %" PRId64" MB\n" , i, node_mem[i] >>20 ); - } +term_printf ("node %d host: " , i); +if (hostnodes[i] == (uint64_t )-1 )term_printf ("*\n" );else +term_printf ("%" PRId64"\n" , hostnodes[i]); + } +} + +static void do_numa (const char *affinity)
monitor.c static void do_info_numa(void) · line 1317
Quoted 10 lines
monitor.c +9
-0+{ +#ifdef CONFIG_NUMA +uint64_t newaff[MAX_NODES ]; +int i; +unsigned long offset =0 ; + +if (numnumanodes <=0 )term_printf ("No NUMA nodes defined.\n" );else +if (numa_available () ==-1 )term_printf ("Not a NUMA host.\n" );else + {
This should be reformatted.
monitor.c static void do_info_numa(void) · line 1336
Quoted 2 lines
monitor.c +1
-0+for (i =0 ; i < numnumanodes; i++) newaff[i] = hostnodes[i];
This should be a separate line.
monitor.c static void do_info_numa(void) · line 1336
Quoted 6 lines
monitor.c +5
-0+parse_numa_args (affinity, newaff,NULL ,NULL ,MAX_NODES ,0 ); +for (i =0 ; i < numnumanodes; i++) { +if (newaff[i] != hostnodes[i]) { + hostnodes[i] = newaff[i]; +if (hostnodes[i] == (uint64_t )-1 )
I don't think using u64's for cpu=>node mappings is a reasonable thing to do at this stage. 64 processors systems are relatively common these days.
Quoted 12 lines
monitor.c +12
-0+numa_tonodemask_memory (phys_ram_base + offset, + node_mem[i], &numa_all_nodes); + else + numa_tonode_memory(phys_ram_base + offset, + node_mem[i], hostnodes[i] % (numa_max_node() + 1)); + } + offset += node_mem[i]; + } + } +#else +term_printf ("NUMA host affinity support not compiled in\n" ); +#endif
Quoted 1 line
}
Regards,
Anthony Liguori