# HG changeset patch # User Andre Przywara # Date 1229435568 -3600 # Node ID 4f0a8ac2d88ffffc1dcd82785c1620553baa86da # Parent 5a74bd76931b79713803795b3943aa8383946521 add -numa monitor command to repin guest nodes diff -r 5a74bd76931b -r 4f0a8ac2d88f monitor.c --- a/monitor.c Tue Dec 16 14:51:24 2008 +0100 +++ b/monitor.c Tue Dec 16 14:52:48 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 @@ -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, }, };