From: Sean Christopherson <seanjc@google.com>
To: Manali Shukla <manali.shukla@amd.com>
Cc: kvm@vger.kernel.org, linux-kselftest@vger.kernel.org,
pbonzini@redhat.com, shuah@kernel.org, nikunj@amd.com
Subject: Re: [PATCH v1 2/4] KVM: selftests: Add an interface to read the data of named vcpu stat
Date: Thu, 19 Dec 2024 16:35:12 -0800 [thread overview]
Message-ID: <Z2S7wArwoBu4wBUb@google.com> (raw)
In-Reply-To: <20241021062226.108657-3-manali.shukla@amd.com>
On Mon, Oct 21, 2024, Manali Shukla wrote:
> From: Manali Shukla <Manali.Shukla@amd.com>
>
> The interface is used to read the data values of a specified vcpu stat
> from the currenly available binary stats interface.
>
> Add a concatenation trickery to trigger compiler error if the stat
> doesn't exist, so that it is not possible to pass a per-VM stat into
> vcpu_get_stat().
>
> Suggested-by: Sean Christopherson <seanjc@google.com>
> Signed-off-by: Manali Shukla <Manali.Shukla@amd.com>
> ---
> .../testing/selftests/kvm/include/kvm_util.h | 52 +++++++++++++++++++
> .../kvm/include/x86_64/kvm_util_arch.h | 36 +++++++++++++
> tools/testing/selftests/kvm/lib/kvm_util.c | 40 ++++++++++++++
> 3 files changed, 128 insertions(+)
>
> diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h
> index bc7c242480d6..5dd3acf174f8 100644
> --- a/tools/testing/selftests/kvm/include/kvm_util.h
> +++ b/tools/testing/selftests/kvm/include/kvm_util.h
> @@ -531,6 +531,14 @@ void read_stat_data(int stats_fd, struct kvm_stats_header *header,
> struct kvm_stats_desc *desc, uint64_t *data,
> size_t max_elements);
>
> +#define DEFINE_CHECK_STAT(type, stat) \
> +static inline int check_##type##_##stat##_exists(void) \
> +{ \
> + return 1; \
> +} \
> +
> +#define STAT_EXISTS(type, stat) (check_##type##_##stat##_exists())
This is all unnecessary complicated. To trigger a compilation error, the set
of knnown stats just needs to be defined as _something_ and then referenced.
There's no need for layers of macros and a function for each stat. The fact that
a stat is defined is proof of its existence.
> +
> void __vm_get_stat(struct kvm_vm *vm, const char *stat_name, uint64_t *data,
> size_t max_elements);
>
> @@ -542,6 +550,50 @@ static inline uint64_t vm_get_stat(struct kvm_vm *vm, const char *stat_name)
> return data;
> }
>
> +#define DEFINE_GENERIC_VCPU_STAT \
> + DEFINE_CHECK_STAT(vcpu, halt_successfull_poll) \
> + DEFINE_CHECK_STAT(vcpu, halt_attempted_poll) \
> + DEFINE_CHECK_STAT(vcpu, halt_poll_invalid) \
> + DEFINE_CHECK_STAT(vcpu, halt_wakeup) \
> + DEFINE_CHECK_STAT(vcpu, halt_poll_success_ns) \
> + DEFINE_CHECK_STAT(vcpu, halt_poll_fail_ns) \
> + DEFINE_CHECK_STAT(vcpu, halt_wait_ns) \
> + DEFINE_CHECK_STAT(vcpu, halt_poll_success_hist) \
> + DEFINE_CHECK_STAT(vcpu, halt_poll_fail_hist) \
> + DEFINE_CHECK_STAT(vcpu, halt_wait_hist) \
> + DEFINE_CHECK_STAT(vcpu, blocking) \
> +
> +/*
> + * Define a default empty macro for architectures which do not specify
> + * arch specific vcpu stats
> + */
> +
> +#ifndef DEFINE_ARCH_VCPU_STAT
> +#define DEFINE_ARCH_VCPU_STAT
> +#endif
> +
> +DEFINE_GENERIC_VCPU_STAT
There's also no need to define macros in arch code just to expand them in common
code. Add simple macros in kvm_util_types.h and this goes away.
> +DEFINE_ARCH_VCPU_STAT
> +
> +#undef DEFINE_CHECK_STAT
> +#undef DEFINE_GENERIC_VCPU_STAT
> +#undef DEFINE_ARCH_VCPU_STAT
> +void __vcpu_get_stat(struct kvm_vcpu *vcpu, const char *stat_name, uint64_t *data,
> + size_t max_elements);
> +
> +#define vcpu_get_stat(vcpu, stat_name) \
> +({ \
> + uint64_t data; \
> + \
> + STAT_EXISTS(vcpu, stat_name); \
> + __vcpu_get_stat(vcpu, #stat_name, &data, 1); \
> + data; \
> +}) \
> +
> +#undef DEFINE_CHECK_STAT
> +#undef DEFINE_GENERIC_VCPU_STAT
> +
...
> +void __vcpu_get_stat(struct kvm_vcpu *vcpu, const char *stat_name, uint64_t *data,
> + size_t max_elements)
> +{
> + int vcpu_stats_fd;
> + struct kvm_stats_header header;
> + struct kvm_stats_desc *desc, *t_desc;
> + size_t size_desc;
> + int i;
> +
> + vcpu_stats_fd = vcpu_get_stats_fd(vcpu);
> + read_stats_header(vcpu_stats_fd, &header);
> +
> + desc = read_stats_descriptors(vcpu_stats_fd, &header);
> + size_desc = get_stats_descriptor_size(&header);
> +
> + for (i = 0; i < header.num_desc; ++i) {
> + t_desc = (void *)desc + (i * size_desc);
> +
> + if (strcmp(t_desc->name, stat_name))
> + continue;
> +
> + read_stat_data(vcpu_stats_fd, &header, t_desc,
> + data, max_elements);
> + break;
> + }
> +}
This is copy-pasted nearly verbatim from the VM-scoped code. It even has the
same bugs (doesn't assert the stat exists), along with new bugs (leaks the fd
and header).
It takes a bit of work, but not _that_ much work, to genericize the VM-scoped
infrastructure and reuse it for vCPU-scoped stats.
next prev parent reply other threads:[~2024-12-20 0:35 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-21 6:22 [PATCH v1 0/4] KVM selftests enhancements Manali Shukla
2024-10-21 6:22 ` [PATCH v1 1/4] KVM: selftests: Add safe_halt() and cli() helpers to common code Manali Shukla
2024-12-19 17:39 ` Sean Christopherson
2024-10-21 6:22 ` [PATCH v1 2/4] KVM: selftests: Add an interface to read the data of named vcpu stat Manali Shukla
2024-12-20 0:35 ` Sean Christopherson [this message]
2024-10-21 6:22 ` [PATCH v1 3/4] KVM: selftests: convert vm_get_stat to macro Manali Shukla
2024-10-21 6:22 ` [PATCH v1 4/4] KVM: selftests: Replace previously used vm_get_stat() " Manali Shukla
2024-12-20 0:42 ` Sean Christopherson
2024-11-28 15:06 ` [PATCH v1 0/4] KVM selftests enhancements Manali Shukla
2024-12-20 0:52 ` Sean Christopherson
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=Z2S7wArwoBu4wBUb@google.com \
--to=seanjc@google.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=manali.shukla@amd.com \
--cc=nikunj@amd.com \
--cc=pbonzini@redhat.com \
--cc=shuah@kernel.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.