diff mbox

[2/2] numa/pc-dimm: Fix stat of memory size in node when hotplug memory

Message ID 1410863956-11056-3-git-send-email-zhang.zhanghailiang@huawei.com
State New
Headers show

Commit Message

Zhanghailiang Sept. 16, 2014, 10:39 a.m. UTC
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 <zhang.zhanghailiang@huawei.com>
---
 hw/i386/pc.c            |  1 +
 include/sysemu/sysemu.h |  1 +
 numa.c                  | 13 +++++++++++++
 3 files changed, 15 insertions(+)

Comments

Igor Mammedov Sept. 16, 2014, 11:20 a.m. UTC | #1
On Tue, 16 Sep 2014 18:39:16 +0800
zhanghailiang <zhang.zhanghailiang@huawei.com> wrote:

> 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 <zhang.zhanghailiang@huawei.com>
> ---
>  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;
> +    }
> +}
I don't think is right thing to do.
numa_info.node_mem provides mapping of initial memory specified with -m XXX option,
and later used for building ACPI SRAT table.

I'd suggest to fix 'info numa' command instead. Add to it ability to enumerate
all memory devices, in that case when initial memory is converted to memory devices
'info numa' will continue to work correctly.

> +
>  static int query_memdev(Object *obj, void *opaque)
>  {
>      MemdevList **list = opaque;
Zhanghailiang Sept. 17, 2014, 8:22 a.m. UTC | #2
On 2014/9/16 19:20, Igor Mammedov wrote:
> On Tue, 16 Sep 2014 18:39:16 +0800
> zhanghailiang<zhang.zhanghailiang@huawei.com>  wrote:
>
>> 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<zhang.zhanghailiang@huawei.com>
>> ---
>>   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;
>> +    }
>> +}
> I don't think is right thing to do.
> numa_info.node_mem provides mapping of initial memory specified with -m XXX option,
> and later used for building ACPI SRAT table.
>

Got it;)

> I'd suggest to fix 'info numa' command instead. Add to it ability to enumerate
> all memory devices, in that case when initial memory is converted to memory devices
> 'info numa' will continue to work correctly.
>

Hmm, Good idea, i will fix it.Thanks.

>> +
>>   static int query_memdev(Object *obj, void *opaque)
>>   {
>>       MemdevList **list = opaque;
>
>
> .
>
diff mbox

Patch

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;
+    }
+}
+
 static int query_memdev(Object *obj, void *opaque)
 {
     MemdevList **list = opaque;