Message ID | 1493192675-16104-3-git-send-email-peterx@redhat.com |
---|---|
State | New |
Headers | show |
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.
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,
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.
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.
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.
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 --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 */
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(+)