NUMA: add monitor interface
PATCH 3/3 NUMA: add monitor interface
This patch adds the new commands 'info numa' and 'numa' to the monitor. (See mail 0/3 for more details).
Signed-off-by Andre Przywara <[email protected]>
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 1228992347 -3600
# Node ID c7ddfcb009edab9b72d500c488abc4c0f2312c56 # Parent 0501b7490a00ef7a77e69f846d332f797162052a add numa monitor support
monitor.c +53 -0
@@ -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
@@ -1281,6 +1284,52 @@ static void do_info_kvm(void)#endif } +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); +for (j =0 ; j <64 ; j++) +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]; +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 int64_t kqemu_time;
@@ -1500,6 +1549,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, }, };
@@ -1538,6 +1589,8 @@ static const term_cmd_t info_cmds[] = { "", "show kqemu information", }, {"kvm" ,"" , do_info_kvm, "", "show kvm information", }, + { "numa", "", do_info_numa, + "", "show NUMA information", }, { "usb", "", usb_info, "", "show guest USB devices", }, { "usbhost", "", usb_host_info,