# HG changeset patch # User Andre Przywara # Date 1228992347 -3600 # Node ID c7ddfcb009edab9b72d500c488abc4c0f2312c56 # Parent 0501b7490a00ef7a77e69f846d332f797162052a add numa monitor support diff -r 0501b7490a00 -r c7ddfcb009ed monitor.c --- a/monitor.c Thu Dec 11 11:42:41 2008 +0100 +++ b/monitor.c Thu Dec 11 11:45:47 2008 +0100 @@ -39,6 +39,9 @@ #include "qemu-timer.h" #include "migration.h" #include "kvm.h" +#ifdef CONFIG_NUMA +#include +#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,