From: Markus Armbruster <armbru@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: qemu-devel@nongnu.org, armbru@redhat.com,
Mark Kanda <mark.kanda@oracle.com>
Subject: Re: [PATCH 5/8] qmp: add filtering of statistics by provider
Date: Tue, 24 May 2022 14:32:49 +0200 [thread overview]
Message-ID: <877d6bxg9a.fsf@pond.sub.org> (raw)
In-Reply-To: <20220523150722.349700-5-pbonzini@redhat.com> (Paolo Bonzini's message of "Mon, 23 May 2022 17:07:19 +0200")
Paolo Bonzini <pbonzini@redhat.com> writes:
> Allow retrieving the statistics from a specific provider only.
> This can be used in the future by HMP commands such as "info
> sync-profile" or "info profile". The next patch also adds
> filter-by-provider capabilities to the HMP equivalent of
> query-stats, "info stats".
>
> Example:
>
> { "execute": "query-stats",
> "arguments": {
> "target": "vm",
> "providers": [
> { "provider": "kvm" } ] } }
>
> The QAPI is a bit more verbose than just a list of StatsProvider,
> so that it can be subsequently extended with filtering of statistics
> by name.
>
> Extracted from a patch by Mark Kanda.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> accel/kvm/kvm-all.c | 3 ++-
> include/monitor/stats.h | 4 +++-
> monitor/hmp-cmds.c | 2 +-
> monitor/qmp-cmds.c | 45 ++++++++++++++++++++++++++++++++---------
> qapi/stats.json | 17 ++++++++++++++--
> 5 files changed, 56 insertions(+), 15 deletions(-)
>
> diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
> index 3ee431a431..461b6cf927 100644
> --- a/accel/kvm/kvm-all.c
> +++ b/accel/kvm/kvm-all.c
> @@ -2644,7 +2644,8 @@ static int kvm_init(MachineState *ms)
> }
>
> if (kvm_check_extension(kvm_state, KVM_CAP_BINARY_STATS_FD)) {
> - add_stats_callbacks(query_stats_cb, query_stats_schemas_cb);
> + add_stats_callbacks(STATS_PROVIDER_KVM, query_stats_cb,
> + query_stats_schemas_cb);
> }
>
> return 0;
> diff --git a/include/monitor/stats.h b/include/monitor/stats.h
> index 8c50feeaa9..840c4ed08e 100644
> --- a/include/monitor/stats.h
> +++ b/include/monitor/stats.h
> @@ -17,10 +17,12 @@ typedef void SchemaRetrieveFunc(StatsSchemaList **result, Error **errp);
> /*
> * Register callbacks for the QMP query-stats command.
> *
> + * @provider: stats provider
Argument documentation that merely paraphrases the type is redundant.
May I have a proper contract?
> * @stats_fn: routine to query stats:
> * @schema_fn: routine to query stat schemas:
> */
> -void add_stats_callbacks(StatRetrieveFunc *stats_fn,
> +void add_stats_callbacks(StatsProvider provider,
> + StatRetrieveFunc *stats_fn,
> SchemaRetrieveFunc *schemas_fn);
>
> /*
> diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
> index c0cb440902..8d2c4792d5 100644
> --- a/monitor/hmp-cmds.c
> +++ b/monitor/hmp-cmds.c
> @@ -2394,7 +2394,7 @@ void hmp_info_stats(Monitor *mon, const QDict *qdict)
> goto exit_no_print;
> }
>
> - schema = qmp_query_stats_schemas(&err);
> + schema = qmp_query_stats_schemas(false, 0, &err);
NULL instead of 0 please.
> if (err) {
> goto exit;
> }
> diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c
> index ebf6f49446..7be0e7414a 100644
> --- a/monitor/qmp-cmds.c
> +++ b/monitor/qmp-cmds.c
> @@ -445,6 +445,7 @@ HumanReadableText *qmp_x_query_irq(Error **errp)
> }
>
> typedef struct StatsCallbacks {
> + StatsProvider provider;
> StatRetrieveFunc *stats_cb;
> SchemaRetrieveFunc *schemas_cb;
> QTAILQ_ENTRY(StatsCallbacks) next;
> @@ -453,16 +454,34 @@ typedef struct StatsCallbacks {
> static QTAILQ_HEAD(, StatsCallbacks) stats_callbacks =
> QTAILQ_HEAD_INITIALIZER(stats_callbacks);
>
> -void add_stats_callbacks(StatRetrieveFunc *stats_fn,
> +void add_stats_callbacks(StatsProvider provider,
> + StatRetrieveFunc *stats_fn,
> SchemaRetrieveFunc *schemas_fn)
> {
> StatsCallbacks *entry = g_new(StatsCallbacks, 1);
> + entry->provider = provider;
> entry->stats_cb = stats_fn;
> entry->schemas_cb = schemas_fn;
>
> QTAILQ_INSERT_TAIL(&stats_callbacks, entry, next);
> }
>
> +static bool stats_provider_requested(StatsProvider provider,
> + StatsFilter *filter)
> +{
> + StatsRequestList *request;
> +
> + if (!filter->has_providers) {
> + return true;
> + }
> + for (request = filter->providers; request; request = request->next) {
> + if (request->value->provider == provider) {
> + return true;
> + }
> + }
> + return false;
> +}
> +
This is just like apply_str_list_filter(). Good! Could we make the two
names similar, too?
> StatsResultList *qmp_query_stats(StatsFilter *filter, Error **errp)
> {
> StatsResultList *stats_results = NULL;
> @@ -487,27 +506,33 @@ StatsResultList *qmp_query_stats(StatsFilter *filter, Error **errp)
> }
>
> QTAILQ_FOREACH(entry, &stats_callbacks, next) {
> - entry->stats_cb(&stats_results, filter->target, targets, errp);
> - if (*errp) {
> - qapi_free_StatsResultList(stats_results);
> - return NULL;
> + if (stats_provider_requested(entry->provider, filter)) {
> + entry->stats_cb(&stats_results, filter->target, targets, errp);
> + if (*errp) {
> + qapi_free_StatsResultList(stats_results);
> + return NULL;
> + }
I like if (!wanted) continue in such loops for less nesting. Clearly a
matter of taste.
> }
> }
>
> return stats_results;
> }
>
> -StatsSchemaList *qmp_query_stats_schemas(Error **errp)
> +StatsSchemaList *qmp_query_stats_schemas(bool has_provider,
> + StatsProvider provider,
> + Error **errp)
> {
> StatsSchemaList *stats_results = NULL;
> StatsCallbacks *entry;
> ERRP_GUARD();
>
> QTAILQ_FOREACH(entry, &stats_callbacks, next) {
> - entry->schemas_cb(&stats_results, errp);
> - if (*errp) {
> - qapi_free_StatsSchemaList(stats_results);
> - return NULL;
> + if (!has_provider || provider == entry->provider) {
> + entry->schemas_cb(&stats_results, errp);
> + if (*errp) {
> + qapi_free_StatsSchemaList(stats_results);
> + return NULL;
> + }
Likewise.
> }
> }
>
> diff --git a/qapi/stats.json b/qapi/stats.json
> index e8ed907793..b75bb86124 100644
> --- a/qapi/stats.json
> +++ b/qapi/stats.json
> @@ -68,6 +68,18 @@
> { 'enum': 'StatsTarget',
> 'data': [ 'vm', 'vcpu' ] }
>
> +##
> +# @StatsRequest:
> +#
> +# Indicates a set of statistics that should be returned by query-stats.
> +#
> +# @provider: provider for which to return statistics.
> +#
> +# Since: 7.1
> +##
> +{ 'struct': 'StatsRequest',
> + 'data': { 'provider': 'StatsProvider' } }
> +
> ##
> # @StatsVCPUFilter:
> #
> @@ -85,11 +97,12 @@
> # request statistics and optionally the required subset of information for
> # that target:
> # - which vCPUs to request statistics for
> +# - which provider to request statistics from
> #
> # Since: 7.1
> ##
> { 'union': 'StatsFilter',
> - 'base': { 'target': 'StatsTarget' },
> + 'base': { 'target': 'StatsTarget', '*providers': [ 'StatsRequest' ] },
Easier to read, I think:
'base': {
'target': 'StatsTarget',
'*providers': [ 'StatsRequest' ] },
> 'discriminator': 'target',
> 'data': { 'vcpu': 'StatsVCPUFilter' } }
>
> @@ -225,5 +238,5 @@
> # Since: 7.1
> ##
> { 'command': 'query-stats-schemas',
> - 'data': { },
> + 'data': { '*provider': 'StatsProvider' },
> 'returns': [ 'StatsSchema' ] }
Only the "NULL instead of 0" is a request, the remainder suggestions.
So, with that request addressed
Reviewed-by: Markus Armbruster <armbru@redhat.com>
PS: Consider adding
[diff]
orderFile = scripts/git.orderfile
to your .git/config.
next prev parent reply other threads:[~2022-05-24 12:48 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-23 15:05 [PATCH v4 0/8] qmp, hmp: statistics subsystem and KVM suport Paolo Bonzini
2022-05-23 15:07 ` [PATCH 1/8] qmp: Support for querying stats Paolo Bonzini
2022-05-23 15:07 ` [PATCH 2/8] kvm: Support for querying fd-based stats Paolo Bonzini
2022-05-23 15:07 ` [PATCH 3/8] qmp: add filtering of statistics by target vCPU Paolo Bonzini
2022-05-24 11:20 ` Markus Armbruster
2022-05-23 15:07 ` [PATCH 4/8] hmp: add basic "info stats" implementation Paolo Bonzini
2022-05-24 17:22 ` Mark Kanda
2022-05-23 15:07 ` [PATCH 5/8] qmp: add filtering of statistics by provider Paolo Bonzini
2022-05-24 12:32 ` Markus Armbruster [this message]
2022-05-24 16:42 ` Paolo Bonzini
2022-05-23 15:07 ` [PATCH 6/8] hmp: " Paolo Bonzini
2022-05-23 15:07 ` [PATCH 7/8] qmp: add filtering of statistics by name Paolo Bonzini
2022-05-24 13:08 ` Markus Armbruster
2022-05-24 16:49 ` Paolo Bonzini
2022-05-25 7:49 ` Markus Armbruster
2022-05-23 15:07 ` [PATCH 8/8] hmp: " Paolo Bonzini
2022-05-24 10:41 ` [PATCH 1/8] qmp: Support for querying stats Markus Armbruster
2022-05-24 16:47 ` Paolo Bonzini
2022-05-24 12:20 ` Markus Armbruster
-- strict thread matches above, loose matches on Subject: below --
2022-04-26 14:16 [PATCH 0/8] qmp, hmp: statistics subsystem and KVM suport Paolo Bonzini
2022-04-26 14:16 ` [PATCH 5/8] qmp: add filtering of statistics by provider Paolo Bonzini
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=877d6bxg9a.fsf@pond.sub.org \
--to=armbru@redhat.com \
--cc=mark.kanda@oracle.com \
--cc=pbonzini@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.