All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: Peter Xu <peterx@redhat.com>
Cc: qemu-devel@nongnu.org, Paolo Bonzini <pbonzini@redhat.com>,
	Markus Armbruster <armbru@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v3 2/2] ramblock: add new hmp command "info ramblock"
Date: Thu, 27 Apr 2017 12:23:14 +0100	[thread overview]
Message-ID: <20170427112313.GD2082@work-vm> (raw)
In-Reply-To: <1493287126-19072-3-git-send-email-peterx@redhat.com>

* Peter Xu (peterx@redhat.com) wrote:
> 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
> 
> Ramblock is something hidden internally in QEMU implementation, and this
> command should only be used by mostly QEMU developers on RAM stuff. It
> is not a command suitable for QMP interface. So only HMP interface is
> provided for it.
> 
> Signed-off-by: Peter Xu <peterx@redhat.com>
> ---
>  exec.c                 | 36 ++++++++++++++++++++++++++++++++++++
>  hmp-commands-info.hx   | 14 ++++++++++++++
>  hmp.c                  |  6 ++++++
>  hmp.h                  |  1 +
>  include/exec/ramlist.h |  1 +
>  5 files changed, 58 insertions(+)
> 
> diff --git a/exec.c b/exec.c
> index 50519ae..9b9d16e 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,40 @@ 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";

That's not very portable; other platforms have other sizes, for example
I think ARM has 16kB as one option, and I'm pretty sure the huge-pages
on Power are a different size.
Hmm, we already have
                     qemu-io-cmds.c:cvtstr and
       qapi/string-output-visitor.c:print_type_size

to print sizes nicely; it's a pity we can't use them somehow rather
than having a 3rd similar function.

> +    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%016" PRIx64 " 0x%016" PRIx64
> +                       " 0x%016" PRIx64 "\n", block->idstr,
> +                       page_size_to_str(block->page_size),
> +                       (uint64_t)block->offset,
> +                       (uint64_t)block->used_length,
> +                       (uint64_t)block->max_length);
> +    }

Yes that should work, I remember there's a RAM_ADDR_FMT macro that's
supposed to be usable for ram_addr_t, but that's fine.

Dave

> +    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 */
> -- 
> 2.7.4
> 
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK

  reply	other threads:[~2017-04-27 11:23 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-27  9:58 [Qemu-devel] [PATCH v3 0/2] ramblock: add hmp command "info ramblock" Peter Xu
2017-04-27  9:58 ` [Qemu-devel] [PATCH v3 1/2] ramblock: add RAMBLOCK_FOREACH() Peter Xu
2017-04-27 10:49   ` Dr. David Alan Gilbert
2017-04-27  9:58 ` [Qemu-devel] [PATCH v3 2/2] ramblock: add new hmp command "info ramblock" Peter Xu
2017-04-27 11:23   ` Dr. David Alan Gilbert [this message]
2017-04-28 10:21     ` Peter Xu
2017-04-28 10:39       ` Peter Xu
2017-04-28 11:07         ` Dr. David Alan Gilbert

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170427112313.GD2082@work-vm \
    --to=dgilbert@redhat.com \
    --cc=armbru@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peterx@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.