diff mbox

[v6] numa: make 'info numa' take into account hotplugged memory

Message ID 1413535838-11000-1-git-send-email-zhang.zhanghailiang@huawei.com
State New
Headers show

Commit Message

Zhanghailiang Oct. 17, 2014, 8:50 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".

Reviewed-by: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
---
 v6:
- remove unnecessary 'di' variable (GongLei)
 v5:
- reword the subject (Igor Mammedov)
- turn query_numa_node_mem to void (Igor Mammedov)
 v4:
- s/pc_dimm_stat_node_mem/numa_stat_memory_devices/ (Igor Mammedov)
- rewrite numa_stat_memory_devices and this will also fix compile error for 
  targets that don't support memory hotplug
 v3:
- cold-plugged memory should not be excluded (Igor Mammedov)
 v2:
- Don't modify the numa_info.node_mem directly when treating hotplug memory,
  fix the "info numa" instead (Igor Mammedov)

Thanks for review!;)
---

 include/sysemu/sysemu.h |  1 +
 monitor.c               |  6 +++++-
 numa.c                  | 38 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 44 insertions(+), 1 deletion(-)

Comments

Gonglei (Arei) Oct. 17, 2014, 9:02 a.m. UTC | #1
On 2014/10/17 16:50, zhanghailiang 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".
> 
> Reviewed-by: Igor Mammedov <imammedo@redhat.com>
> Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
> ---
>  v6:
> - remove unnecessary 'di' variable (GongLei)
>  v5:
> - reword the subject (Igor Mammedov)
> - turn query_numa_node_mem to void (Igor Mammedov)
>  v4:
> - s/pc_dimm_stat_node_mem/numa_stat_memory_devices/ (Igor Mammedov)
> - rewrite numa_stat_memory_devices and this will also fix compile error for 
>   targets that don't support memory hotplug
>  v3:
> - cold-plugged memory should not be excluded (Igor Mammedov)
>  v2:
> - Don't modify the numa_info.node_mem directly when treating hotplug memory,
>   fix the "info numa" instead (Igor Mammedov)
> 
> Thanks for review!;)
> ---
> 
>  include/sysemu/sysemu.h |  1 +
>  monitor.c               |  6 +++++-
>  numa.c                  | 38 ++++++++++++++++++++++++++++++++++++++
>  3 files changed, 44 insertions(+), 1 deletion(-)
> 

Reviewed-by: Gonglei <arei.gonglei@huawei.com>

Best regards,
-Gonglei
Zhanghailiang Oct. 23, 2014, 12:32 a.m. UTC | #2
Hi,

Ping...
This patch has been reviewed, please pick up, Thanks.

Best Regargs,
zhanghailiang

On 2014/10/17 17:02, Gonglei wrote:
> On 2014/10/17 16:50, zhanghailiang 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".
>>
>> Reviewed-by: Igor Mammedov <imammedo@redhat.com>
>> Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
>> ---
>>   v6:
>> - remove unnecessary 'di' variable (GongLei)
>>   v5:
>> - reword the subject (Igor Mammedov)
>> - turn query_numa_node_mem to void (Igor Mammedov)
>>   v4:
>> - s/pc_dimm_stat_node_mem/numa_stat_memory_devices/ (Igor Mammedov)
>> - rewrite numa_stat_memory_devices and this will also fix compile error for
>>    targets that don't support memory hotplug
>>   v3:
>> - cold-plugged memory should not be excluded (Igor Mammedov)
>>   v2:
>> - Don't modify the numa_info.node_mem directly when treating hotplug memory,
>>    fix the "info numa" instead (Igor Mammedov)
>>
>> Thanks for review!;)
>> ---
>>
>>   include/sysemu/sysemu.h |  1 +
>>   monitor.c               |  6 +++++-
>>   numa.c                  | 38 ++++++++++++++++++++++++++++++++++++++
>>   3 files changed, 44 insertions(+), 1 deletion(-)
>>
>
> Reviewed-by: Gonglei <arei.gonglei@huawei.com>
>
> Best regards,
> -Gonglei
>
>
> .
>
Zhanghailiang Oct. 27, 2014, 9:40 a.m. UTC | #3
Hi Luiz,

Can you apply this to your qmp branch?
It has been reviewd;)

Thanks,
zhanghailiang

On 2014/10/23 8:32, zhanghailiang wrote:
> Hi,
>
> Ping...
> This patch has been reviewed, please pick up, Thanks.
>
> Best Regargs,
> zhanghailiang
>
> On 2014/10/17 17:02, Gonglei wrote:
>> On 2014/10/17 16:50, zhanghailiang 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".
>>>
>>> Reviewed-by: Igor Mammedov <imammedo@redhat.com>
>>> Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
>>> ---
>>>   v6:
>>> - remove unnecessary 'di' variable (GongLei)
>>>   v5:
>>> - reword the subject (Igor Mammedov)
>>> - turn query_numa_node_mem to void (Igor Mammedov)
>>>   v4:
>>> - s/pc_dimm_stat_node_mem/numa_stat_memory_devices/ (Igor Mammedov)
>>> - rewrite numa_stat_memory_devices and this will also fix compile error for
>>>    targets that don't support memory hotplug
>>>   v3:
>>> - cold-plugged memory should not be excluded (Igor Mammedov)
>>>   v2:
>>> - Don't modify the numa_info.node_mem directly when treating hotplug memory,
>>>    fix the "info numa" instead (Igor Mammedov)
>>>
>>> Thanks for review!;)
>>> ---
>>>
>>>   include/sysemu/sysemu.h |  1 +
>>>   monitor.c               |  6 +++++-
>>>   numa.c                  | 38 ++++++++++++++++++++++++++++++++++++++
>>>   3 files changed, 44 insertions(+), 1 deletion(-)
>>>
>>
>> Reviewed-by: Gonglei <arei.gonglei@huawei.com>
>>
>> Best regards,
>> -Gonglei
>>
>>
>> .
>>
>
>
>
>
>
Luiz Capitulino Oct. 27, 2014, 12:46 p.m. UTC | #4
On Mon, 27 Oct 2014 17:40:11 +0800
zhanghailiang <zhang.zhanghailiang@huawei.com> wrote:

> Hi Luiz,
> 
> Can you apply this to your qmp branch?
> It has been reviewd;)

I can, but I don't have bandwidth for another pull request for v2.2 unless
it's a fix for a blocker. This means you have two options, wait for v2.3
or find another tree to merge this.

> 
> Thanks,
> zhanghailiang
> 
> On 2014/10/23 8:32, zhanghailiang wrote:
> > Hi,
> >
> > Ping...
> > This patch has been reviewed, please pick up, Thanks.
> >
> > Best Regargs,
> > zhanghailiang
> >
> > On 2014/10/17 17:02, Gonglei wrote:
> >> On 2014/10/17 16:50, zhanghailiang 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".
> >>>
> >>> Reviewed-by: Igor Mammedov <imammedo@redhat.com>
> >>> Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
> >>> ---
> >>>   v6:
> >>> - remove unnecessary 'di' variable (GongLei)
> >>>   v5:
> >>> - reword the subject (Igor Mammedov)
> >>> - turn query_numa_node_mem to void (Igor Mammedov)
> >>>   v4:
> >>> - s/pc_dimm_stat_node_mem/numa_stat_memory_devices/ (Igor Mammedov)
> >>> - rewrite numa_stat_memory_devices and this will also fix compile error for
> >>>    targets that don't support memory hotplug
> >>>   v3:
> >>> - cold-plugged memory should not be excluded (Igor Mammedov)
> >>>   v2:
> >>> - Don't modify the numa_info.node_mem directly when treating hotplug memory,
> >>>    fix the "info numa" instead (Igor Mammedov)
> >>>
> >>> Thanks for review!;)
> >>> ---
> >>>
> >>>   include/sysemu/sysemu.h |  1 +
> >>>   monitor.c               |  6 +++++-
> >>>   numa.c                  | 38 ++++++++++++++++++++++++++++++++++++++
> >>>   3 files changed, 44 insertions(+), 1 deletion(-)
> >>>
> >>
> >> Reviewed-by: Gonglei <arei.gonglei@huawei.com>
> >>
> >> Best regards,
> >> -Gonglei
> >>
> >>
> >> .
> >>
> >
> >
> >
> >
> >
> 
>
Zhanghailiang Oct. 28, 2014, 12:38 a.m. UTC | #5
On 2014/10/27 20:46, Luiz Capitulino wrote:
> On Mon, 27 Oct 2014 17:40:11 +0800
> zhanghailiang <zhang.zhanghailiang@huawei.com> wrote:
>
>> Hi Luiz,
>>
>> Can you apply this to your qmp branch?
>> It has been reviewd;)
>
> I can, but I don't have bandwidth for another pull request for v2.2 unless
> it's a fix for a blocker. This means you have two options, wait for v2.3
> or find another tree to merge this.
>

OK, i will wait for v2.3, thanks;)

>>
>> Thanks,
>> zhanghailiang
>>
>> On 2014/10/23 8:32, zhanghailiang wrote:
>>> Hi,
>>>
>>> Ping...
>>> This patch has been reviewed, please pick up, Thanks.
>>>
>>> Best Regargs,
>>> zhanghailiang
>>>
>>> On 2014/10/17 17:02, Gonglei wrote:
>>>> On 2014/10/17 16:50, zhanghailiang 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".
>>>>>
>>>>> Reviewed-by: Igor Mammedov <imammedo@redhat.com>
>>>>> Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
>>>>> ---
>>>>>    v6:
>>>>> - remove unnecessary 'di' variable (GongLei)
>>>>>    v5:
>>>>> - reword the subject (Igor Mammedov)
>>>>> - turn query_numa_node_mem to void (Igor Mammedov)
>>>>>    v4:
>>>>> - s/pc_dimm_stat_node_mem/numa_stat_memory_devices/ (Igor Mammedov)
>>>>> - rewrite numa_stat_memory_devices and this will also fix compile error for
>>>>>     targets that don't support memory hotplug
>>>>>    v3:
>>>>> - cold-plugged memory should not be excluded (Igor Mammedov)
>>>>>    v2:
>>>>> - Don't modify the numa_info.node_mem directly when treating hotplug memory,
>>>>>     fix the "info numa" instead (Igor Mammedov)
>>>>>
>>>>> Thanks for review!;)
>>>>> ---
>>>>>
>>>>>    include/sysemu/sysemu.h |  1 +
>>>>>    monitor.c               |  6 +++++-
>>>>>    numa.c                  | 38 ++++++++++++++++++++++++++++++++++++++
>>>>>    3 files changed, 44 insertions(+), 1 deletion(-)
>>>>>
>>>>
>>>> Reviewed-by: Gonglei <arei.gonglei@huawei.com>
>>>>
>>>> Best regards,
>>>> -Gonglei
>>>>
>>>>
>>>> .
>>>>
>>>
>>>
>>>
>>>
>>>
>>
>>
>
>
> .
>
Zhanghailiang Oct. 30, 2014, 8:22 a.m. UTC | #6
Hi Michael,

Can you help applying this patch to -trivial branch?
It has been reviewed, and it mainly fix bug for hmp command of 'info numa'.
Which i don't know if it should go qemu-stable, for this is not a blocker.

Maybe go trivial branch is a better choice.

Thanks,
zhanghailiang

On 2014/10/27 20:46, Luiz Capitulino wrote:
> On Mon, 27 Oct 2014 17:40:11 +0800
> zhanghailiang <zhang.zhanghailiang@huawei.com> wrote:
>
>> Hi Luiz,
>>
>> Can you apply this to your qmp branch?
>> It has been reviewd;)
>
> I can, but I don't have bandwidth for another pull request for v2.2 unless
> it's a fix for a blocker. This means you have two options, wait for v2.3
> or find another tree to merge this.
>
>>
>> Thanks,
>> zhanghailiang
>>
>> On 2014/10/23 8:32, zhanghailiang wrote:
>>> Hi,
>>>
>>> Ping...
>>> This patch has been reviewed, please pick up, Thanks.
>>>
>>> Best Regargs,
>>> zhanghailiang
>>>
>>> On 2014/10/17 17:02, Gonglei wrote:
>>>> On 2014/10/17 16:50, zhanghailiang 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".
>>>>>
>>>>> Reviewed-by: Igor Mammedov <imammedo@redhat.com>
>>>>> Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
>>>>> ---
>>>>>    v6:
>>>>> - remove unnecessary 'di' variable (GongLei)
>>>>>    v5:
>>>>> - reword the subject (Igor Mammedov)
>>>>> - turn query_numa_node_mem to void (Igor Mammedov)
>>>>>    v4:
>>>>> - s/pc_dimm_stat_node_mem/numa_stat_memory_devices/ (Igor Mammedov)
>>>>> - rewrite numa_stat_memory_devices and this will also fix compile error for
>>>>>     targets that don't support memory hotplug
>>>>>    v3:
>>>>> - cold-plugged memory should not be excluded (Igor Mammedov)
>>>>>    v2:
>>>>> - Don't modify the numa_info.node_mem directly when treating hotplug memory,
>>>>>     fix the "info numa" instead (Igor Mammedov)
>>>>>
>>>>> Thanks for review!;)
>>>>> ---
>>>>>
>>>>>    include/sysemu/sysemu.h |  1 +
>>>>>    monitor.c               |  6 +++++-
>>>>>    numa.c                  | 38 ++++++++++++++++++++++++++++++++++++++
>>>>>    3 files changed, 44 insertions(+), 1 deletion(-)
>>>>>
>>>>
>>>> Reviewed-by: Gonglei <arei.gonglei@huawei.com>
>>>>
>>>> Best regards,
>>>> -Gonglei
>>>>
>>>>
>>>> .
>>>>
>>>
>>>
>>>
>>>
>>>
>>
>>
>
>
> .
>
Michael Tokarev Nov. 2, 2014, 7:03 a.m. UTC | #7
30.10.2014 11:22, zhanghailiang wrote:
> Hi Michael,
> 
> Can you help applying this patch to -trivial branch?
> It has been reviewed, and it mainly fix bug for hmp command of 'info numa'.
> Which i don't know if it should go qemu-stable, for this is not a blocker.
> 
> Maybe go trivial branch is a better choice.

And the original patch description is:

>>>>>> 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".

What does the "for now" means in this context?  Is the patch
incpmplete somehow and we should expect more code in this
area/theme?

In the patch we have:

+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;
+    }
+}

Please note that while the node_mem is a pointer, it is used as
an array.  In C, pointers and arrays in this context is the same
thing, but I think it is better to make the fact that it is an
array explicit in the function prototype, to be like this:

+void query_numa_node_mem(uint64_t node_mem[])

(But I don't know how various tools like coverity et al will react
to this.  Gcc and any other C compiler should be fine).

The same stands for other function prototype.

I'm not sure this qualifies as -trivial really.  Yes the change
does not affect anything but the `info' command, and is rather
simple, but... I'm not sure.

Thanks.

/mjt
Markus Armbruster Nov. 3, 2014, 7:56 a.m. UTC | #8
Michael Tokarev <mjt@tls.msk.ru> writes:

> 30.10.2014 11:22, zhanghailiang wrote:
>> Hi Michael,
>> 
>> Can you help applying this patch to -trivial branch?
>> It has been reviewed, and it mainly fix bug for hmp command of 'info numa'.
>> Which i don't know if it should go qemu-stable, for this is not a blocker.
>> 
>> Maybe go trivial branch is a better choice.
>
> And the original patch description is:
>
>>>>>>> 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".
>
> What does the "for now" means in this context?  Is the patch
> incpmplete somehow and we should expect more code in this
> area/theme?
>
> In the patch we have:
>
> +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;
> +    }
> +}
>
> Please note that while the node_mem is a pointer, it is used as
> an array.  In C, pointers and arrays in this context is the same
> thing, but I think it is better to make the fact that it is an
> array explicit in the function prototype, to be like this:
>
> +void query_numa_node_mem(uint64_t node_mem[])
>
> (But I don't know how various tools like coverity et al will react
> to this.  Gcc and any other C compiler should be fine).
>
> The same stands for other function prototype.
>
> I'm not sure this qualifies as -trivial really.  Yes the change
> does not affect anything but the `info' command, and is rather
> simple, but... I'm not sure.

Fortunately, monitor.c got a maintainer.  Luiz, would you be willing to
shepherd this patch?
Michael Tokarev Nov. 3, 2014, 8:06 a.m. UTC | #9
03.11.2014 10:56, Markus Armbruster wrote:
> Michael Tokarev <mjt@tls.msk.ru> writes:
[]
>> I'm not sure this qualifies as -trivial really.  Yes the change
>> does not affect anything but the `info' command, and is rather
>> simple, but... I'm not sure.
> 
> Fortunately, monitor.c got a maintainer.  Luiz, would you be willing to
> shepherd this patch?

He already replied to that, that's why the whole thing has been Cc'd
to -trivial:

"""I can, but I don't have bandwidth for another pull request for v2.2 unless
it's a fix for a blocker. This means you have two options, wait for v2.3
or find another tree to merge this."""

(http://patchwork.ozlabs.org/patch/400457/)

Thanks,

/mjt
Zhanghailiang Nov. 3, 2014, 11:54 a.m. UTC | #10
On 2014/11/2 15:03, Michael Tokarev wrote:
> 30.10.2014 11:22, zhanghailiang wrote:
>> Hi Michael,
>>
>> Can you help applying this patch to -trivial branch?
>> It has been reviewed, and it mainly fix bug for hmp command of 'info numa'.
>> Which i don't know if it should go qemu-stable, for this is not a blocker.
>>
>> Maybe go trivial branch is a better choice.
>
> And the original patch description is:
>
>>>>>>> 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".
>
> What does the "for now" means in this context?  Is the patch
> incpmplete somehow and we should expect more code in this
> area/theme?
>

Hmm, yes, it not exact, i should remove the confused context.

> In the patch we have:
>
> +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;
> +    }
> +}
>
> Please note that while the node_mem is a pointer, it is used as
> an array.  In C, pointers and arrays in this context is the same
> thing, but I think it is better to make the fact that it is an
> array explicit in the function prototype, to be like this:
>
> +void query_numa_node_mem(uint64_t node_mem[])
>

Good idea;), it is more clear.

> (But I don't know how various tools like coverity et al will react
> to this.  Gcc and any other C compiler should be fine).
>

I will look into this.

> The same stands for other function prototype.
>
> I'm not sure this qualifies as -trivial really.  Yes the change
> does not affect anything but the `info' command, and is rather
> simple, but... I'm not sure.
>

Hmm, this a tangled thing.:(
Markus Armbruster Nov. 3, 2014, 2:39 p.m. UTC | #11
Michael Tokarev <mjt@tls.msk.ru> writes:

> 03.11.2014 10:56, Markus Armbruster wrote:
>> Michael Tokarev <mjt@tls.msk.ru> writes:
> []
>>> I'm not sure this qualifies as -trivial really.  Yes the change
>>> does not affect anything but the `info' command, and is rather
>>> simple, but... I'm not sure.
>> 
>> Fortunately, monitor.c got a maintainer.  Luiz, would you be willing to
>> shepherd this patch?
>
> He already replied to that, that's why the whole thing has been Cc'd
> to -trivial:
>
> """I can, but I don't have bandwidth for another pull request for v2.2 unless
> it's a fix for a blocker. This means you have two options, wait for v2.3
> or find another tree to merge this."""
>
> (http://patchwork.ozlabs.org/patch/400457/)

Right, I had already forgotten.

It's a bug fix for "info numa".  Whether the fix is important enough to
justify another pull for 2.2 is for Luiz to decide.  Whether it's
trivial enough for you to take it via -trivial is for you to decide.  If
you both say no, it goes into 2.3 via Luiz.  Not exactly terrible.
diff mbox

Patch

diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
index 0037a69..ef5eaf4 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -161,6 +161,7 @@  typedef struct node_info {
 extern NodeInfo numa_info[MAX_NODES];
 void set_numa_nodes(void);
 void set_numa_modes(void);
+void query_numa_node_mem(uint64_t *node_mem);
 extern QemuOptsList qemu_numa_opts;
 int numa_init_func(QemuOpts *opts, void *opaque);
 
diff --git a/monitor.c b/monitor.c
index 2d14f39..d45b0a3 100644
--- a/monitor.c
+++ b/monitor.c
@@ -1949,7 +1949,10 @@  static void do_info_numa(Monitor *mon, const QDict *qdict)
 {
     int i;
     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);
     for (i = 0; i < nb_numa_nodes; i++) {
         monitor_printf(mon, "node %d cpus:", i);
@@ -1960,8 +1963,9 @@  static void do_info_numa(Monitor *mon, const QDict *qdict)
         }
         monitor_printf(mon, "\n");
         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
diff --git a/numa.c b/numa.c
index 3b98135..ae1c7f4 100644
--- a/numa.c
+++ b/numa.c
@@ -35,6 +35,7 @@ 
 #include "hw/boards.h"
 #include "sysemu/hostmem.h"
 #include "qmp-commands.h"
+#include "hw/mem/pc-dimm.h"
 
 QemuOptsList qemu_numa_opts = {
     .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)
 {
     MemdevList **list = opaque;