|
@@ -15,6 +15,7 @@
|
|
|
#include "qapi/qmp/qerror.h"
|
|
|
#include "qapi/qmp/qobject.h"
|
|
|
#include "qapi/qobject-input-visitor.h"
|
|
|
+#include "qapi/type-helpers.h"
|
|
|
#include "qemu/main-loop.h"
|
|
|
#include "qom/qom-qobject.h"
|
|
|
#include "sysemu/hostmem.h"
|
|
@@ -204,3 +205,42 @@ MemdevList *qmp_query_memdev(Error **errp)
|
|
|
object_child_foreach(obj, query_memdev, &list);
|
|
|
return list;
|
|
|
}
|
|
|
+
|
|
|
+HumanReadableText *qmp_x_query_numa(Error **errp)
|
|
|
+{
|
|
|
+ g_autoptr(GString) buf = g_string_new("");
|
|
|
+ int i, nb_numa_nodes;
|
|
|
+ NumaNodeMem *node_mem;
|
|
|
+ CpuInfoFastList *cpu_list, *cpu;
|
|
|
+ MachineState *ms = MACHINE(qdev_get_machine());
|
|
|
+
|
|
|
+ nb_numa_nodes = ms->numa_state ? ms->numa_state->num_nodes : 0;
|
|
|
+ g_string_append_printf(buf, "%d nodes\n", nb_numa_nodes);
|
|
|
+ if (!nb_numa_nodes) {
|
|
|
+ goto done;
|
|
|
+ }
|
|
|
+
|
|
|
+ cpu_list = qmp_query_cpus_fast(&error_abort);
|
|
|
+ node_mem = g_new0(NumaNodeMem, nb_numa_nodes);
|
|
|
+
|
|
|
+ query_numa_node_mem(node_mem, ms);
|
|
|
+ for (i = 0; i < nb_numa_nodes; i++) {
|
|
|
+ g_string_append_printf(buf, "node %d cpus:", i);
|
|
|
+ for (cpu = cpu_list; cpu; cpu = cpu->next) {
|
|
|
+ if (cpu->value->has_props && cpu->value->props->has_node_id &&
|
|
|
+ cpu->value->props->node_id == i) {
|
|
|
+ g_string_append_printf(buf, " %" PRIi64, cpu->value->cpu_index);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ g_string_append_printf(buf, "\n");
|
|
|
+ g_string_append_printf(buf, "node %d size: %" PRId64 " MB\n", i,
|
|
|
+ node_mem[i].node_mem >> 20);
|
|
|
+ g_string_append_printf(buf, "node %d plugged: %" PRId64 " MB\n", i,
|
|
|
+ node_mem[i].node_plugged_mem >> 20);
|
|
|
+ }
|
|
|
+ qapi_free_CpuInfoFastList(cpu_list);
|
|
|
+ g_free(node_mem);
|
|
|
+
|
|
|
+ done:
|
|
|
+ return human_readable_text_from_str(buf);
|
|
|
+}
|