diff mbox

[2/2] ramblock: add new hmp command "info ramblock"

Message ID 1493192675-16104-3-git-send-email-peterx@redhat.com
State New
Headers show

Commit Message

Peter Xu April 26, 2017, 7:44 a.m. UTC
To dump information about ramblocks. It looks like:

(qemu) info ramblock
              Block Name    PSize              Offset               Used              Total
            /objects/mem       2M  0x0000000000000000 0x0000000080000000 0x0000000080000000
                vga.vram       4K  0x0000000080060000 0x0000000001000000 0x0000000001000000
    /rom@etc/acpi/tables       4K  0x00000000810b0000 0x0000000000020000 0x0000000000200000
                 pc.bios       4K  0x0000000080000000 0x0000000000040000 0x0000000000040000
  0000:00:03.0/e1000.rom       4K  0x0000000081070000 0x0000000000040000 0x0000000000040000
                  pc.rom       4K  0x0000000080040000 0x0000000000020000 0x0000000000020000
    0000:00:02.0/vga.rom       4K  0x0000000081060000 0x0000000000010000 0x0000000000010000
   /rom@etc/table-loader       4K  0x00000000812b0000 0x0000000000001000 0x0000000000001000
      /rom@etc/acpi/rsdp       4K  0x00000000812b1000 0x0000000000001000 0x0000000000001000

Signed-off-by: Peter Xu <peterx@redhat.com>
---
 exec.c                 | 34 ++++++++++++++++++++++++++++++++++
 hmp-commands-info.hx   | 14 ++++++++++++++
 hmp.c                  |  6 ++++++
 hmp.h                  |  1 +
 include/exec/ramlist.h |  1 +
 5 files changed, 56 insertions(+)

Comments

Markus Armbruster April 26, 2017, 12:10 p.m. UTC | #1
Peter Xu <peterx@redhat.com> writes:

> To dump information about ramblocks. It looks like:
>
> (qemu) info ramblock
>               Block Name    PSize              Offset               Used              Total
>             /objects/mem       2M  0x0000000000000000 0x0000000080000000 0x0000000080000000
>                 vga.vram       4K  0x0000000080060000 0x0000000001000000 0x0000000001000000
>     /rom@etc/acpi/tables       4K  0x00000000810b0000 0x0000000000020000 0x0000000000200000
>                  pc.bios       4K  0x0000000080000000 0x0000000000040000 0x0000000000040000
>   0000:00:03.0/e1000.rom       4K  0x0000000081070000 0x0000000000040000 0x0000000000040000
>                   pc.rom       4K  0x0000000080040000 0x0000000000020000 0x0000000000020000
>     0000:00:02.0/vga.rom       4K  0x0000000081060000 0x0000000000010000 0x0000000000010000
>    /rom@etc/table-loader       4K  0x00000000812b0000 0x0000000000001000 0x0000000000001000
>       /rom@etc/acpi/rsdp       4K  0x00000000812b1000 0x0000000000001000 0x0000000000001000
>
> Signed-off-by: Peter Xu <peterx@redhat.com>

You implemented this just for HMP.

In general, functionality available in HMP should also available in QMP.
Exceptions include functionality that makes no sense in QMP, or is of
use only for human users.  If you think your command is an exception,
please explain why in the commit message.

If it isn't, you need to implement it for QMP, then rewrite the HMP
version to reuse either the QMP command or a common core.
Peter Xu April 27, 2017, 2:09 a.m. UTC | #2
On Wed, Apr 26, 2017 at 02:10:16PM +0200, Markus Armbruster wrote:
> Peter Xu <peterx@redhat.com> writes:
> 
> > To dump information about ramblocks. It looks like:
> >
> > (qemu) info ramblock
> >               Block Name    PSize              Offset               Used              Total
> >             /objects/mem       2M  0x0000000000000000 0x0000000080000000 0x0000000080000000
> >                 vga.vram       4K  0x0000000080060000 0x0000000001000000 0x0000000001000000
> >     /rom@etc/acpi/tables       4K  0x00000000810b0000 0x0000000000020000 0x0000000000200000
> >                  pc.bios       4K  0x0000000080000000 0x0000000000040000 0x0000000000040000
> >   0000:00:03.0/e1000.rom       4K  0x0000000081070000 0x0000000000040000 0x0000000000040000
> >                   pc.rom       4K  0x0000000080040000 0x0000000000020000 0x0000000000020000
> >     0000:00:02.0/vga.rom       4K  0x0000000081060000 0x0000000000010000 0x0000000000010000
> >    /rom@etc/table-loader       4K  0x00000000812b0000 0x0000000000001000 0x0000000000001000
> >       /rom@etc/acpi/rsdp       4K  0x00000000812b1000 0x0000000000001000 0x0000000000001000
> >
> > Signed-off-by: Peter Xu <peterx@redhat.com>
> 
> You implemented this just for HMP.
> 
> In general, functionality available in HMP should also available in QMP.
> Exceptions include functionality that makes no sense in QMP, or is of
> use only for human users.  If you think your command is an exception,
> please explain why in the commit message.
> 
> If it isn't, you need to implement it for QMP, then rewrite the HMP
> version to reuse either the QMP command or a common core.

I see. I think it should belongs to the first condition, which should
only be used by human users, especially developers. Maybe I can repost
with some more comment in the commit message to emphasize that.

But, before that, I would also want to know whether anyone would think
this an useful thing even to QMP... If so, I would be glad to provide
QMP interface as well.

Thanks,
Markus Armbruster April 27, 2017, 7:07 a.m. UTC | #3
Peter Xu <peterx@redhat.com> writes:

> On Wed, Apr 26, 2017 at 02:10:16PM +0200, Markus Armbruster wrote:
>> Peter Xu <peterx@redhat.com> writes:
>> 
>> > To dump information about ramblocks. It looks like:
>> >
>> > (qemu) info ramblock
>> >               Block Name    PSize              Offset               Used              Total
>> >             /objects/mem       2M  0x0000000000000000 0x0000000080000000 0x0000000080000000
>> >                 vga.vram       4K  0x0000000080060000 0x0000000001000000 0x0000000001000000
>> >     /rom@etc/acpi/tables       4K  0x00000000810b0000 0x0000000000020000 0x0000000000200000
>> >                  pc.bios       4K  0x0000000080000000 0x0000000000040000 0x0000000000040000
>> >   0000:00:03.0/e1000.rom       4K  0x0000000081070000 0x0000000000040000 0x0000000000040000
>> >                   pc.rom       4K  0x0000000080040000 0x0000000000020000 0x0000000000020000
>> >     0000:00:02.0/vga.rom       4K  0x0000000081060000 0x0000000000010000 0x0000000000010000
>> >    /rom@etc/table-loader       4K  0x00000000812b0000 0x0000000000001000 0x0000000000001000
>> >       /rom@etc/acpi/rsdp       4K  0x00000000812b1000 0x0000000000001000 0x0000000000001000
>> >
>> > Signed-off-by: Peter Xu <peterx@redhat.com>
>> 
>> You implemented this just for HMP.
>> 
>> In general, functionality available in HMP should also available in QMP.
>> Exceptions include functionality that makes no sense in QMP, or is of
>> use only for human users.  If you think your command is an exception,
>> please explain why in the commit message.
>> 
>> If it isn't, you need to implement it for QMP, then rewrite the HMP
>> version to reuse either the QMP command or a common core.
>
> I see. I think it should belongs to the first condition, which should
> only be used by human users, especially developers. Maybe I can repost
> with some more comment in the commit message to emphasize that.

Example for "makes no sense in QMP": setting the current CPU[1], because
a QMP monitor doesn't have a current CPU.

Examples for "is of use only for human users": HMP command "help", the
integrated pocket calculator[2].


> But, before that, I would also want to know whether anyone would think
> this an useful thing even to QMP... If so, I would be glad to provide
> QMP interface as well.

Can't say without understanding the use cases.  Perhaps you can start
with explaining the itch your HMP command scratches.



[1] For reasons lost in time, we added QMP command "cpu" anyway, it just
does nothing.

[2] I doubt that one is of much use to humans, either.
Paolo Bonzini April 27, 2017, 7:39 a.m. UTC | #4
On 27/04/2017 09:07, Markus Armbruster wrote:
> Example for "makes no sense in QMP": setting the current CPU[1], because
> a QMP monitor doesn't have a current CPU.
> 
> Examples for "is of use only for human users": HMP command "help", the
> integrated pocket calculator[2].

This example is more or less like "info mtree".

In addition, it exposes ram_addr_t which is an internal interface to
QEMU.  Therefore it shouldn't be exposed through QMP.

Paolo

>> But, before that, I would also want to know whether anyone would think
>> this an useful thing even to QMP... If so, I would be glad to provide
>> QMP interface as well.
> Can't say without understanding the use cases.  Perhaps you can start
> with explaining the itch your HMP command scratches.
Markus Armbruster April 27, 2017, 7:57 a.m. UTC | #5
Paolo Bonzini <pbonzini@redhat.com> writes:

> On 27/04/2017 09:07, Markus Armbruster wrote:
>> Example for "makes no sense in QMP": setting the current CPU[1], because
>> a QMP monitor doesn't have a current CPU.
>> 
>> Examples for "is of use only for human users": HMP command "help", the
>> integrated pocket calculator[2].
>
> This example is more or less like "info mtree".
>
> In addition, it exposes ram_addr_t which is an internal interface to
> QEMU.  Therefore it shouldn't be exposed through QMP.

Makes sense.  Peter, please explain it in your commit message.
Peter Xu April 27, 2017, 8:06 a.m. UTC | #6
On Thu, Apr 27, 2017 at 09:57:04AM +0200, Markus Armbruster wrote:
> Paolo Bonzini <pbonzini@redhat.com> writes:
> 
> > On 27/04/2017 09:07, Markus Armbruster wrote:
> >> Example for "makes no sense in QMP": setting the current CPU[1], because
> >> a QMP monitor doesn't have a current CPU.
> >> 
> >> Examples for "is of use only for human users": HMP command "help", the
> >> integrated pocket calculator[2].
> >
> > This example is more or less like "info mtree".
> >
> > In addition, it exposes ram_addr_t which is an internal interface to
> > QEMU.  Therefore it shouldn't be exposed through QMP.
> 
> Makes sense.  Peter, please explain it in your commit message.

Will do. Thanks Markus, Paolo.
diff mbox

Patch

diff --git a/exec.c b/exec.c
index 50519ae..85a2c2b 100644
--- a/exec.c
+++ b/exec.c
@@ -71,6 +71,8 @@ 
 #include "qemu/mmap-alloc.h"
 #endif
 
+#include "monitor/monitor.h"
+
 //#define DEBUG_SUBPAGE
 
 #if !defined(CONFIG_USER_ONLY)
@@ -1333,6 +1335,38 @@  void qemu_mutex_unlock_ramlist(void)
     qemu_mutex_unlock(&ram_list.mutex);
 }
 
+static const char *page_size_to_str(size_t psize)
+{
+    switch (psize) {
+    case 0x1000:
+        return "4K";
+    case 0x10000:
+        return "64K";
+    case 0x200000:
+        return "2M";
+    case 0x40000000:
+        return "1G";
+    default:
+        return "N/A";
+    }
+}
+
+void ram_block_dump(Monitor *mon)
+{
+    RAMBlock *block;
+
+    rcu_read_lock();
+    monitor_printf(mon, "%24s %8s  %18s %18s %18s\n",
+                   "Block Name", "PSize", "Offset", "Used", "Total");
+    RAMBLOCK_FOREACH(block) {
+        monitor_printf(mon, "%24s %8s  0x%016lx 0x%016lx 0x%016lx\n",
+                       block->idstr, page_size_to_str(block->page_size),
+                       block->offset, block->used_length,
+                       block->max_length);
+    }
+    rcu_read_unlock();
+}
+
 #ifdef __linux__
 /*
  * FIXME TOCTTOU: this iterates over memory backends' mem-path, which
diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx
index a53f105..ae16901 100644
--- a/hmp-commands-info.hx
+++ b/hmp-commands-info.hx
@@ -788,6 +788,20 @@  Display the latest dump status.
 ETEXI
 
     {
+        .name       = "ramblock",
+        .args_type  = "",
+        .params     = "",
+        .help       = "Display system ramblock information",
+        .cmd        = hmp_info_ramblock,
+    },
+
+STEXI
+@item info ramblock
+@findex ramblock
+Dump all the ramblocks of the system.
+ETEXI
+
+    {
         .name       = "hotpluggable-cpus",
         .args_type  = "",
         .params     = "",
diff --git a/hmp.c b/hmp.c
index ab407d6..8369388 100644
--- a/hmp.c
+++ b/hmp.c
@@ -37,6 +37,7 @@ 
 #include "qemu-io.h"
 #include "qemu/cutils.h"
 #include "qemu/error-report.h"
+#include "exec/ramlist.h"
 #include "hw/intc/intc.h"
 
 #ifdef CONFIG_SPICE
@@ -2563,6 +2564,11 @@  void hmp_info_dump(Monitor *mon, const QDict *qdict)
     qapi_free_DumpQueryResult(result);
 }
 
+void hmp_info_ramblock(Monitor *mon, const QDict *qdict)
+{
+    ram_block_dump(mon);
+}
+
 void hmp_hotpluggable_cpus(Monitor *mon, const QDict *qdict)
 {
     Error *err = NULL;
diff --git a/hmp.h b/hmp.h
index 799fd37..7353b67 100644
--- a/hmp.h
+++ b/hmp.h
@@ -136,6 +136,7 @@  void hmp_rocker_ports(Monitor *mon, const QDict *qdict);
 void hmp_rocker_of_dpa_flows(Monitor *mon, const QDict *qdict);
 void hmp_rocker_of_dpa_groups(Monitor *mon, const QDict *qdict);
 void hmp_info_dump(Monitor *mon, const QDict *qdict);
+void hmp_info_ramblock(Monitor *mon, const QDict *qdict);
 void hmp_hotpluggable_cpus(Monitor *mon, const QDict *qdict);
 void hmp_info_vm_generation_id(Monitor *mon, const QDict *qdict);
 
diff --git a/include/exec/ramlist.h b/include/exec/ramlist.h
index f1c6b45..2e2ac6c 100644
--- a/include/exec/ramlist.h
+++ b/include/exec/ramlist.h
@@ -73,5 +73,6 @@  void ram_block_notifier_remove(RAMBlockNotifier *n);
 void ram_block_notify_add(void *host, size_t size);
 void ram_block_notify_remove(void *host, size_t size);
 
+void ram_block_dump(Monitor *mon);
 
 #endif /* RAMLIST_H */