When do memory hotplug, if there is numa node, we should add
the memory size to the corresponding node memory size.
For now, it mainly affects the result of hmp command "info numa".
Signed-off-by: zhanghailiang<address@hidden>
---
hw/i386/pc.c | 1 +
include/sysemu/sysemu.h | 1 +
numa.c | 13 +++++++++++++
3 files changed, 15 insertions(+)
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 77b6782..bafe48e 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1607,6 +1607,7 @@ static void pc_dimm_plug(HotplugHandler *hotplug_dev,
memory_region_add_subregion(&pcms->hotplug_memory,
addr - pcms->hotplug_memory_base, mr);
vmstate_register_ram(mr, dev);
+ update_numa_node_mem_size(dimm->node, memory_region_size(mr), true);
hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev);
hhc->plug(HOTPLUG_HANDLER(pcms->acpi_dev), dev,&local_err);
diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
index d8539fd..5bc9d73 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -160,6 +160,7 @@ typedef struct node_info {
extern NodeInfo numa_info[MAX_NODES];
void set_numa_nodes(void);
void set_numa_modes(void);
+void update_numa_node_mem_size(int node, uint64_t size, bool hotplug);
extern QemuOptsList qemu_numa_opts;
int numa_init_func(QemuOpts *opts, void *opaque);
diff --git a/numa.c b/numa.c
index 3b98135..bbfa16f 100644
--- a/numa.c
+++ b/numa.c
@@ -315,6 +315,19 @@ void memory_region_allocate_system_memory(MemoryRegion
*mr, Object *owner,
}
}
+void update_numa_node_mem_size(int node, uint64_t size, bool hotplug)
+{
+ if (!nb_numa_nodes) {
+ return;
+ }
+
+ if (hotplug) {
+ numa_info[node].node_mem += size;
+ } else {
+ numa_info[node].node_mem -= size;
+ }
+}