numa: make 'info numa' take into account hotplugged memory
When do memory hotplug, if there is numa node, we should add the memory size to the corresponding node memory size. It affects the result of hmp command "info numa". Reviewed-by: Igor Mammedov <imammedo@redhat.com> Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com> Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
This commit is contained in:
parent
7912d04be6
commit
5b009e4008
@ -161,6 +161,7 @@ typedef struct node_info {
|
|||||||
extern NodeInfo numa_info[MAX_NODES];
|
extern NodeInfo numa_info[MAX_NODES];
|
||||||
void set_numa_nodes(void);
|
void set_numa_nodes(void);
|
||||||
void set_numa_modes(void);
|
void set_numa_modes(void);
|
||||||
|
void query_numa_node_mem(uint64_t node_mem[]);
|
||||||
extern QemuOptsList qemu_numa_opts;
|
extern QemuOptsList qemu_numa_opts;
|
||||||
int numa_init_func(QemuOpts *opts, void *opaque);
|
int numa_init_func(QemuOpts *opts, void *opaque);
|
||||||
|
|
||||||
|
@ -1948,7 +1948,10 @@ static void do_info_numa(Monitor *mon, const QDict *qdict)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
CPUState *cpu;
|
CPUState *cpu;
|
||||||
|
uint64_t *node_mem;
|
||||||
|
|
||||||
|
node_mem = g_new0(uint64_t, nb_numa_nodes);
|
||||||
|
query_numa_node_mem(node_mem);
|
||||||
monitor_printf(mon, "%d nodes\n", nb_numa_nodes);
|
monitor_printf(mon, "%d nodes\n", nb_numa_nodes);
|
||||||
for (i = 0; i < nb_numa_nodes; i++) {
|
for (i = 0; i < nb_numa_nodes; i++) {
|
||||||
monitor_printf(mon, "node %d cpus:", i);
|
monitor_printf(mon, "node %d cpus:", i);
|
||||||
@ -1959,8 +1962,9 @@ static void do_info_numa(Monitor *mon, const QDict *qdict)
|
|||||||
}
|
}
|
||||||
monitor_printf(mon, "\n");
|
monitor_printf(mon, "\n");
|
||||||
monitor_printf(mon, "node %d size: %" PRId64 " MB\n", i,
|
monitor_printf(mon, "node %d size: %" PRId64 " MB\n", i,
|
||||||
numa_info[i].node_mem >> 20);
|
node_mem[i] >> 20);
|
||||||
}
|
}
|
||||||
|
g_free(node_mem);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PROFILER
|
#ifdef CONFIG_PROFILER
|
||||||
|
38
numa.c
38
numa.c
@ -35,6 +35,7 @@
|
|||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
#include "sysemu/hostmem.h"
|
#include "sysemu/hostmem.h"
|
||||||
#include "qmp-commands.h"
|
#include "qmp-commands.h"
|
||||||
|
#include "hw/mem/pc-dimm.h"
|
||||||
|
|
||||||
QemuOptsList qemu_numa_opts = {
|
QemuOptsList qemu_numa_opts = {
|
||||||
.name = "numa",
|
.name = "numa",
|
||||||
@ -315,6 +316,43 @@ void memory_region_allocate_system_memory(MemoryRegion *mr, Object *owner,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void numa_stat_memory_devices(uint64_t node_mem[])
|
||||||
|
{
|
||||||
|
MemoryDeviceInfoList *info_list = NULL;
|
||||||
|
MemoryDeviceInfoList **prev = &info_list;
|
||||||
|
MemoryDeviceInfoList *info;
|
||||||
|
|
||||||
|
qmp_pc_dimm_device_list(qdev_get_machine(), &prev);
|
||||||
|
for (info = info_list; info; info = info->next) {
|
||||||
|
MemoryDeviceInfo *value = info->value;
|
||||||
|
|
||||||
|
if (value) {
|
||||||
|
switch (value->kind) {
|
||||||
|
case MEMORY_DEVICE_INFO_KIND_DIMM:
|
||||||
|
node_mem[value->dimm->node] += value->dimm->size;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
qapi_free_MemoryDeviceInfoList(info_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
void query_numa_node_mem(uint64_t node_mem[])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (nb_numa_nodes <= 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
numa_stat_memory_devices(node_mem);
|
||||||
|
for (i = 0; i < nb_numa_nodes; i++) {
|
||||||
|
node_mem[i] += numa_info[i].node_mem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int query_memdev(Object *obj, void *opaque)
|
static int query_memdev(Object *obj, void *opaque)
|
||||||
{
|
{
|
||||||
MemdevList **list = opaque;
|
MemdevList **list = opaque;
|
||||||
|
Loading…
Reference in New Issue
Block a user