From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Cc: qemu-devel@nongnu.org, qemu-s390x@nongnu.org,
lcapitulino@redhat.com, ehabkost@redhat.com, pbonzini@redhat.com,
crosthwaite.peter@gmail.com, rth@twiddle.net, cohuck@redhat.com,
borntraeger@de.ibm.com, agraf@suse.de, david@redhat.com,
eblake@redhat.com, armbru@redhat.com, berrange@redhat.com
Subject: Re: [Qemu-devel] [PATCH 2/3] qmp: add query-cpus-fast
Date: Mon, 12 Feb 2018 16:50:12 +0000 [thread overview]
Message-ID: <20180212165012.GD2545@work-vm> (raw)
In-Reply-To: <1518437672-7724-3-git-send-email-mihajlov@linux.vnet.ibm.com>
* Viktor Mihajlovski (mihajlov@linux.vnet.ibm.com) wrote:
> From: Luiz Capitulino <lcapitulino@redhat.com>
>
> The query-cpus command has an extremely serious side effect:
> it always interrupts all running vCPUs so that they can run
> ioctl calls. This can cause a huge performance degradation for
> some workloads. And most of the information retrieved by the
> ioctl calls are not even used by query-cpus.
>
> This commit introduces a replacement for query-cpus called
> query-cpus-fast, which has the following features:
>
> o Never interrupt vCPUs threads. query-cpus-fast only returns
> vCPU information maintained by QEMU itself, which should be
> sufficient for most management software needs
>
> o Make "halted" field optional: we only return it if the
> halted state is maintained by QEMU. But this also gives
> the option of dropping the field in the future (see below)
>
> o Drop irrelevant fields such as "current", "pc" and "arch"
>
> o Drop field "halted" since it can't be provided fast reliably
> and is too volatile on most architectures to be really useful
>
> o Rename some fields for better clarification & proper naming
> standard
>
> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
> Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
> ---
> cpus.c | 38 ++++++++++++++++++++++++++++
> hmp-commands-info.hx | 14 +++++++++++
> hmp.c | 21 ++++++++++++++++
> hmp.h | 1 +
> qapi-schema.json | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> 5 files changed, 144 insertions(+)
>
> diff --git a/cpus.c b/cpus.c
> index 6006931..6df6660 100644
> --- a/cpus.c
> +++ b/cpus.c
> @@ -2156,6 +2156,44 @@ CpuInfoList *qmp_query_cpus(Error **errp)
> return head;
> }
>
> +/*
> + * fast means: we NEVER interrupt vCPU threads to retrieve
> + * information from KVM.
> + */
> +CpuInfoFastList *qmp_query_cpus_fast(Error **errp)
> +{
> + MachineState *ms = MACHINE(qdev_get_machine());
> + MachineClass *mc = MACHINE_GET_CLASS(ms);
> + CpuInfoFastList *head = NULL, *cur_item = NULL;
> + CPUState *cpu;
> +
> + CPU_FOREACH(cpu) {
> + CpuInfoFastList *info = g_malloc0(sizeof(*info));
> + info->value = g_malloc0(sizeof(*info->value));
> +
> + info->value->cpu_index = cpu->cpu_index;
> + info->value->qom_path = object_get_canonical_path(OBJECT(cpu));
> + info->value->thread_id = cpu->thread_id;
> +
> + info->value->has_props = !!mc->cpu_index_to_instance_props;
> + if (info->value->has_props) {
> + CpuInstanceProperties *props;
> + props = g_malloc0(sizeof(*props));
> + *props = mc->cpu_index_to_instance_props(ms, cpu->cpu_index);
> + info->value->props = props;
> + }
> +
> + if (!cur_item) {
> + head = cur_item = info;
> + } else {
> + cur_item->next = info;
> + cur_item = info;
> + }
> + }
> +
> + return head;
> +}
> +
> void qmp_memsave(int64_t addr, int64_t size, const char *filename,
> bool has_cpu, int64_t cpu_index, Error **errp)
> {
> diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx
> index ad590a4..16ac602 100644
> --- a/hmp-commands-info.hx
> +++ b/hmp-commands-info.hx
> @@ -160,6 +160,20 @@ Show infos for each CPU.
> ETEXI
>
> {
> + .name = "cpus_fast",
> + .args_type = "",
> + .params = "",
> + .help = "show information for each CPU without interrupting them",
> + .cmd = hmp_info_cpus_fast,
> + },
> +
> +STEXI
> +@item info cpus_fast
> +@findex info cpus_fast
> +Show infos for each CPU without performance penalty.
> +ETEXI
> +
> + {
> .name = "history",
> .args_type = "",
> .params = "",
> diff --git a/hmp.c b/hmp.c
> index a6b94b7..598bfe5 100644
> --- a/hmp.c
> +++ b/hmp.c
> @@ -410,6 +410,27 @@ void hmp_info_cpus(Monitor *mon, const QDict *qdict)
> qapi_free_CpuInfoList(cpu_list);
> }
>
> +void hmp_info_cpus_fast(Monitor *mon, const QDict *qdict)
> +{
> + CpuInfoFastList *head, *cpu;
> + TargetInfo *target;
> +
> + target = qmp_query_target(NULL);
> + monitor_printf(mon, "CPU architecture is '%s'\n\n", target->arch);
> + qapi_free_TargetInfo(target);
> +
> + head = qmp_query_cpus_fast(NULL);
> +
> + for (cpu = head; cpu; cpu = cpu->next) {
> + monitor_printf(mon, "CPU%" PRId64 "\n", cpu->value->cpu_index);
> + monitor_printf(mon, " thread-id=%" PRId64 "\n", cpu->value->thread_id);
> + monitor_printf(mon, " qom-path=%s\n", cpu->value->qom_path);
> + monitor_printf(mon, "\n");
> + }
> +
> + qapi_free_CpuInfoFastList(head);
> +}
> +
> static void print_block_info(Monitor *mon, BlockInfo *info,
> BlockDeviceInfo *inserted, bool verbose)
> {
> diff --git a/hmp.h b/hmp.h
> index 1143db4..93fb4e4 100644
> --- a/hmp.h
> +++ b/hmp.h
> @@ -29,6 +29,7 @@ void hmp_info_migrate_capabilities(Monitor *mon, const QDict *qdict);
> void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict);
> void hmp_info_migrate_cache_size(Monitor *mon, const QDict *qdict);
> void hmp_info_cpus(Monitor *mon, const QDict *qdict);
> +void hmp_info_cpus_fast(Monitor *mon, const QDict *qdict);
> void hmp_info_block(Monitor *mon, const QDict *qdict);
> void hmp_info_blockstats(Monitor *mon, const QDict *qdict);
> void hmp_info_vnc(Monitor *mon, const QDict *qdict);
For HMP:
Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> diff --git a/qapi-schema.json b/qapi-schema.json
> index 66e0927..2a614af 100644
> --- a/qapi-schema.json
> +++ b/qapi-schema.json
> @@ -552,6 +552,12 @@
> #
> # Returns a list of information about each virtual CPU.
> #
> +# This command causes vCPU threads to exit to userspace, which causes
> +# an small interruption guest CPU execution. This will have a negative
> +# impact on realtime guests and other latency sensitive guest workloads.
> +# It is recommended to use @query-cpus-fast instead of this command to
> +# avoid the vCPU interruption.
> +#
> # Returns: a list of @CpuInfo for each virtual CPU
> #
> # Since: 0.14.0
> @@ -585,6 +591,70 @@
> { 'command': 'query-cpus', 'returns': ['CpuInfo'] }
>
> ##
> +# @CpuInfoFast:
> +#
> +# Information about a virtual CPU
> +#
> +# @cpu-index: index of the virtual CPU
> +#
> +# @qom-path: path to the CPU object in the QOM tree
> +#
> +# @thread-id: ID of the underlying host thread
> +#
> +# @props: properties describing to which node/socket/core/thread
> +# virtual CPU belongs to, provided if supported by board
> +#
> +# Since: 2.12
> +#
> +##
> +{ 'struct': 'CpuInfoFast',
> + 'data': {'cpu-index': 'int', 'qom-path': 'str',
> + 'thread-id': 'int', '*props': 'CpuInstanceProperties' } }
> +
> +##
> +# @query-cpus-fast:
> +#
> +# Returns information about all virtual CPUs. This command does not
> +# incur a performance penalty and should be used in production
> +# instead of query-cpus.
> +#
> +# Returns: list of @CpuInfoFast
> +#
> +# Notes: The CPU architecture name is not returned by query-cpus-fast.
> +# Use query-target to retrieve that information.
> +#
> +# Since: 2.12
> +#
> +# Example:
> +#
> +# -> { "execute": "query-cpus-fast" }
> +# <- { "return": [
> +# {
> +# "thread-id": 25627,
> +# "props": {
> +# "core-id": 0,
> +# "thread-id": 0,
> +# "socket-id": 0
> +# },
> +# "qom-path": "/machine/unattached/device[0]",
> +# "cpu-index": 0
> +# },
> +# {
> +# "thread-id": 25628,
> +# "props": {
> +# "core-id": 0,
> +# "thread-id": 0,
> +# "socket-id": 1
> +# },
> +# "qom-path": "/machine/unattached/device[2]",
> +# "cpu-index": 1
> +# }
> +# ]
> +# }
> +##
> +{ 'command': 'query-cpus-fast', 'returns': [ 'CpuInfoFast' ] }
> +
> +##
> # @IOThreadInfo:
> #
> # Information about an iothread
> --
> 1.9.1
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
next prev parent reply other threads:[~2018-02-12 16:50 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-02-12 12:14 [Qemu-devel] [PATCH 0/3] add query-cpu-fast and related s390 changes Viktor Mihajlovski
2018-02-12 12:14 ` [Qemu-devel] [PATCH 1/3] qmp: expose s390-specific CPU info Viktor Mihajlovski
2018-02-12 15:52 ` Cornelia Huck
2018-02-12 16:20 ` Viktor Mihajlovski
2018-02-12 18:03 ` Luiz Capitulino
2018-02-13 11:16 ` [Qemu-devel] [qemu-s390x] " David Hildenbrand
2018-02-13 12:20 ` Viktor Mihajlovski
2018-02-13 15:10 ` Eric Blake
2018-02-12 20:30 ` [Qemu-devel] " David Hildenbrand
2018-02-12 12:14 ` [Qemu-devel] [PATCH 2/3] qmp: add query-cpus-fast Viktor Mihajlovski
2018-02-12 16:06 ` Cornelia Huck
2018-02-12 16:50 ` Dr. David Alan Gilbert [this message]
2018-02-13 15:14 ` Viktor Mihajlovski
2018-02-12 20:35 ` David Hildenbrand
2018-02-12 12:14 ` [Qemu-devel] [PATCH 3/3] qmp: add architecture specific cpu data for query-cpus-fast Viktor Mihajlovski
2018-02-12 16:23 ` Cornelia Huck
2018-02-13 16:12 ` Viktor Mihajlovski
2018-02-13 16:17 ` Cornelia Huck
2018-02-12 18:15 ` Luiz Capitulino
2018-02-13 12:30 ` Viktor Mihajlovski
2018-02-13 13:41 ` Luiz Capitulino
2018-02-12 15:38 ` [Qemu-devel] [PATCH 0/3] add query-cpu-fast and related s390 changes Cornelia Huck
2018-02-12 16:26 ` Viktor Mihajlovski
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=20180212165012.GD2545@work-vm \
--to=dgilbert@redhat.com \
--cc=agraf@suse.de \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=borntraeger@de.ibm.com \
--cc=cohuck@redhat.com \
--cc=crosthwaite.peter@gmail.com \
--cc=david@redhat.com \
--cc=eblake@redhat.com \
--cc=ehabkost@redhat.com \
--cc=lcapitulino@redhat.com \
--cc=mihajlov@linux.vnet.ibm.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-s390x@nongnu.org \
--cc=rth@twiddle.net \
/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.