[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v3] hmp, qmp: introduce "info memory" and "query
From: |
Igor Mammedov |
Subject: |
Re: [Qemu-devel] [PATCH v3] hmp, qmp: introduce "info memory" and "query-memory" commands |
Date: |
Tue, 27 Jun 2017 16:05:12 +0200 |
On Wed, 14 Jun 2017 17:21:06 +0200
Vadim Galitsyn <address@hidden> wrote:
> Commands above provide the following memory information in bytes:
>
> * base-memory - amount of static memory specified
> with '-m' option at the start of the QEMU process.
>
> * hot-plug-memory - amount of memory that was hot-plugged.
>
> * ballooned-actual-memory - size of the memory that remains
> available to the guest after ballooning, as reported by the
> guest. If the guest has not reported its memory, this value
> equals to @base-memory + @hot-plug-memory. If ballooning
> is not enabled, zero value is reported.
>
> NOTE:
>
> Parameter @ballooned-actual-memory reports the same as
> "info balloon" command when ballooning is enabled. The idea
> to have it in scope of this command(s) comes from
> https://lists.gnu.org/archive/html/qemu-devel/2012-07/msg01472.html.
>
> Signed-off-by: Vasilis Liaskovitis <address@hidden>
> Signed-off-by: Mohammed Gamal <address@hidden>
> Signed-off-by: Eduardo Otubo <address@hidden>
> Signed-off-by: Vadim Galitsyn <address@hidden>
> Reviewed-by: Eugene Crosser <address@hidden>
> Cc: Dr. David Alan Gilbert <address@hidden>
> Cc: Markus Armbruster <address@hidden>
> Cc: address@hidden
> ---
>
> v3:
> * Use PRIu64 instead of 'lu' when printing results via HMP.
> * Report zero hot-plugged memory instead of reporting error
> when target architecture has no CONFIG_MEM_HOTPLUG enabled.
>
> v2:
> * Fixed build for targets which do not have CONFIG_MEM_HOTPLUG enabled.
>
> hmp-commands-info.hx | 15 +++++++++++++++
> hmp.c | 16 ++++++++++++++++
> hmp.h | 1 +
> qapi-schema.json | 27 +++++++++++++++++++++++++++
> qmp.c | 36 ++++++++++++++++++++++++++++++++++++
> 5 files changed, 95 insertions(+)
>
> diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx
> index ae169011b1..bc37525550 100644
> --- a/hmp-commands-info.hx
> +++ b/hmp-commands-info.hx
> @@ -833,6 +833,21 @@ STEXI
> @end table
> ETEXI
>
> +STEXI
> address@hidden info memory
s/memory/memory-size-summary/
maybe the same for qmp command name
> address@hidden memory
> +Display ***
s/***/summary present memory size including hotplugged, ballooned if enabled.
or something like this
> +ETEXI
> +
> + {
> + .name = "memory",
> + .args_type = "",
> + .params = "",
> + .help = "show memory size information in bytes (static, "
> + "hotplugged, ballooned)",
> + .cmd = hmp_info_memory,
> + },
> +
> STEXI
> @end table
> ETEXI
> diff --git a/hmp.c b/hmp.c
> index 8c72c58b20..d6ec686376 100644
> --- a/hmp.c
> +++ b/hmp.c
> @@ -2817,3 +2817,19 @@ void hmp_info_vm_generation_id(Monitor *mon, const
> QDict *qdict)
> hmp_handle_error(mon, &err);
> qapi_free_GuidInfo(info);
> }
> +
> +void hmp_info_memory(Monitor *mon, const QDict *qdict)
> +{
> + Error *err = NULL;
> + MemoryInfo *info = qmp_query_memory(&err);
> + if (info) {
> + monitor_printf(mon, "base-memory: %" PRIu64 "\n",
> + info->base_memory);
> + monitor_printf(mon, "hot-plug-memory: %" PRIu64 "\n",
> + info->hot_plug_memory);
it shouldn't be printed if hotplug is not enabled
> + monitor_printf(mon, "ballooned-actual-memory: %" PRIu64 "\n",
> + info->ballooned_actual_memory);
> + g_free(info);
probably there is autogenerated qapi_free_FOO() for MemInfo type
since it's QAPI type, it should be used here instead of g_free() if it exists.
> + }
> + hmp_handle_error(mon, &err);
> +}
> diff --git a/hmp.h b/hmp.h
> index d8b94ce9dc..c422aa2fac 100644
> --- a/hmp.h
> +++ b/hmp.h
> @@ -143,5 +143,6 @@ 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);
> +void hmp_info_memory(Monitor *mon, const QDict *qdict);
>
> #endif
> diff --git a/qapi-schema.json b/qapi-schema.json
> index 4b50b652d3..33cd7cb3b8 100644
> --- a/qapi-schema.json
> +++ b/qapi-schema.json
> @@ -4324,6 +4324,33 @@
> 'data': { 'name': 'str', '*migration-safe': 'bool', 'static': 'bool',
> '*unavailable-features': [ 'str' ], 'typename': 'str' } }
>
> +##
> +# @MemoryInfo:
> +#
> +# Memory information in bytes.
s/Memory/Present memory/
> +#
> +# @base-memory: size of static memory which was specified on Qemu start.
s/static/unremovable/
s/was specified on Qemu start/is specified with '-m size' CLI option
> +#
> +# @hot-plug-memory: size of hot-plugged memory.
hotpluggable-memory
> +#
> +# @ballooned-actual-memory: amount of guest memory available after
> ballooning.
> +#
> +# Since: 2.10.0
> +##
> +{ 'struct': 'MemoryInfo',
> + 'data' : { 'base-memory': 'int',
> 'hot-plug-memory': 'int',
should be optional and shown only if hotplug is actually enabled
> + 'ballooned-actual-memory': 'int' } }
maybe the same for ballooning
> +
> +##
> +# @query-memory:
> +#
> +# Return memory size information which includes
s//present/
> +# static, hotplugged and ballooned memory.
> +#
> +# Since: 2.10.0
> +##
> +{ 'command': 'query-memory', 'returns': 'MemoryInfo' }
> +
> ##
> # @query-cpu-definitions:
> #
> diff --git a/qmp.c b/qmp.c
> index 7ee9bcfdcf..56b89ffbde 100644
> --- a/qmp.c
> +++ b/qmp.c
> @@ -712,3 +712,39 @@ ACPIOSTInfoList *qmp_query_acpi_ospm_status(Error **errp)
>
> return head;
> }
> +
> +MemoryInfo *qmp_query_memory(Error **errp)
> +{
> + MemoryInfo *mem_info = g_malloc0(sizeof(MemoryInfo));
> + BalloonInfo *balloon_info;
> + Error *local_err = NULL;
> +
> + mem_info->base_memory = ram_size;
> +
> + /* If current configuration does not have CONFIG_MEM_HOTPLUG
> + * enabled, report zero hot-plugged memory.
> + */
> +#ifdef CONFIG_MEM_HOTPLUG
> + mem_info->hot_plug_memory = pc_existing_dimms_capacity(&local_err);
I'd use &error_abort here as this call should never fail
however it it won't work for spapr target which has CONFIG_MEM_HOTPLUG
and should fail to build due to missing pc_existing_dimms_capacity()
implementation.
I'd suggest to introduce
get_exiting_hotpluggable_memory_size()
+ stub in stubs/... to avoid ifdefs
and then make separate impl. for pc and spapr targets to make
command work correctly on both targets.
> + if (local_err) {
> + error_setg(errp, "could not get hot-plug memory info: %s",
> + error_get_pretty(local_err));
> + g_free(mem_info);
> + return NULL;
> + }
> +#else
> + mem_info->hot_plug_memory = 0;
> +#endif
> + /* In case if it is not possible to get balloon info, just ignore it. */
> + balloon_info = qmp_query_balloon(&local_err);
> + if (local_err) {
> + mem_info->ballooned_actual_memory = 0;
> + error_free(local_err);
> + } else {
> + mem_info->ballooned_actual_memory = balloon_info->actual;
> + }
> +
> + qapi_free_BalloonInfo(balloon_info);
> +
> + return mem_info;
> +}