From: Oliver Upton <oupton@kernel.org>
To: Alexandru Elisei <alexandru.elisei@arm.com>
Cc: will@kernel.org, julien.thierry.kdev@gmail.com, maz@kernel.org,
jean-philippe.brucker@arm.com, andre.przywara@arm.com,
suzuki.poulose@arm.com, kvm@vger.kernel.org,
linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev
Subject: Re: [PATCH kvmtool v2 7/7] arm64: Improve KVM_ARM_VCPU_PMU_V3_CTRL diagnostics
Date: Thu, 18 Jun 2026 12:06:12 -0700 [thread overview]
Message-ID: <ajRBpMnlcNkhWzQL@kernel.org> (raw)
In-Reply-To: <20260618155001.226266-8-alexandru.elisei@arm.com>
On Thu, Jun 18, 2026 at 04:50:01PM +0100, Alexandru Elisei wrote:
> kvmtool issues several ioctls when configuring the PMU, and each of them
> can fail for different reasons. Be more specific about the ioctl that
> failed when that happens.
>
> Signed-off-by: Alexandru Elisei <alexandru.elisei@arm.com>
> ---
> arm64/pmu.c | 31 ++++++++++++++++++++++++-------
> 1 file changed, 24 insertions(+), 7 deletions(-)
>
> diff --git a/arm64/pmu.c b/arm64/pmu.c
> index 92cacd62479e..78c15f153fad 100644
> --- a/arm64/pmu.c
> +++ b/arm64/pmu.c
> @@ -12,6 +12,24 @@
>
> #include "asm/pmu.h"
>
> +static const char *pmu_attr_names[] = {
> + [KVM_ARM_VCPU_PMU_V3_IRQ] = "KVM_ARM_VCPU_PMU_V3_IRQ",
> + [KVM_ARM_VCPU_PMU_V3_INIT] = "KVM_ARM_VCPU_PMU_V3_INIT",
> + [KVM_ARM_VCPU_PMU_V3_FILTER] = "KVM_ARM_VCPU_PMU_V3_FILTER",
> + [KVM_ARM_VCPU_PMU_V3_SET_PMU] = "KVM_ARM_VCPU_PMU_V3_SET_PMU",
> + [KVM_ARM_VCPU_PMU_V3_SET_NR_COUNTERS] = "KVM_ARM_VCPU_PMU_V3_SET_NR_COUNTER",
> +};
> +
> +static const char *pmu_get_attr_name(u64 attr)
> +{
> + switch (attr) {
> + case KVM_ARM_VCPU_PMU_V3_IRQ ... KVM_ARM_VCPU_PMU_V3_SET_NR_COUNTERS:
> + return pmu_attr_names[attr];
> + default:
> + return "UNKNOWN";
> + }
> +}
> +
> static bool pmu_has_attr(struct kvm_cpu *vcpu, u64 attr)
> {
> struct kvm_device_attr pmu_attr = {
> @@ -32,13 +50,12 @@ static void set_pmu_attr(struct kvm_cpu *vcpu, void *addr, u64 attr)
> };
> int ret;
>
> - if (pmu_has_attr(vcpu, attr)) {
> - ret = ioctl(vcpu->vcpu_fd, KVM_SET_DEVICE_ATTR, &pmu_attr);
> - if (ret)
> - die_perror("PMU KVM_SET_DEVICE_ATTR");
> - } else {
> - die_perror("PMU KVM_HAS_DEVICE_ATTR");
> - }
> + if (!pmu_has_attr(vcpu, attr))
> + die_perror("KVM_HAS_DEVICE_ATTR(%s)", pmu_get_attr_name(attr));
> +
> + ret = ioctl(vcpu->vcpu_fd, KVM_SET_DEVICE_ATTR, &pmu_attr);
> + if (ret)
> + die_perror("KVM_SET_DEVICE_ATTR(%s)", pmu_get_attr_name(attr));
> }
The whole if (ret) die_perror(...) thing is a bit repetetive IMO. A
treewide cleanup replacing this with macros would be nice, then you could
stringize the ioctl under the hood.
diff --git a/arm64/pmu.c b/arm64/pmu.c
index 5f31d6b..0d9f3df 100644
--- a/arm64/pmu.c
+++ b/arm64/pmu.c
@@ -23,23 +23,19 @@ static bool pmu_has_attr(struct kvm_cpu *vcpu, u64 attr)
return ret == 0;
}
-static void set_pmu_attr(struct kvm_cpu *vcpu, void *addr, u64 attr)
-{
- struct kvm_device_attr pmu_attr = {
- .group = KVM_ARM_VCPU_PMU_V3_CTRL,
- .addr = (u64)addr,
- .attr = attr,
- };
- int ret;
-
- if (pmu_has_attr(vcpu, attr)) {
- ret = ioctl(vcpu->vcpu_fd, KVM_SET_DEVICE_ATTR, &pmu_attr);
- if (ret)
- die_perror("PMU KVM_SET_DEVICE_ATTR");
- } else {
- die_perror("PMU KVM_HAS_DEVICE_ATTR");
- }
-}
+#define kvm_set_device_attr(fd, _group, _attr, _addr) \
+do { \
+ struct kvm_device_attr __attr = { \
+ .group = (_group), \
+ .attr = (_attr), \
+ .addr = (u64)(_addr), \
+ }; \
+ int r; \
+ \
+ r = ioctl((fd), KVM_SET_DEVICE_ATTR, &__attr); \
+ if (r) \
+ die_perror("KVM_SET_DEVICE_ATTR(group:"#_group", attr:"#_attr")"); \
+} while (0)
#define SYS_EVENT_SOURCE "/sys/bus/event_source/devices/"
/*
@@ -218,14 +214,18 @@ void pmu__generate_fdt_nodes(void *fdt, struct kvm *kvm)
for (i = 0; i < kvm->nrcpus; i++) {
vcpu = kvm->cpus[i];
- set_pmu_attr(vcpu, &irq, KVM_ARM_VCPU_PMU_V3_IRQ);
+ kvm_set_device_attr(vcpu->vcpu_fd, KVM_ARM_VCPU_PMU_V3_CTRL,
+ KVM_ARM_VCPU_PMU_V3_IRQ, &irq);
/*
* PMU IDs 0-5 are reserved; a positive value means a PMU was
* found.
*/
if (pmu_id > 0)
- set_pmu_attr(vcpu, &pmu_id, KVM_ARM_VCPU_PMU_V3_SET_PMU);
- set_pmu_attr(vcpu, NULL, KVM_ARM_VCPU_PMU_V3_INIT);
+ kvm_set_device_attr(vcpu->vcpu_fd, KVM_ARM_VCPU_PMU_V3_CTRL,
+ KVM_ARM_VCPU_PMU_V3_SET_PMU, &pmu_id);
+
+ kvm_set_device_attr(vcpu->vcpu_fd, KVM_ARM_VCPU_PMU_V3_CTRL,
+ KVM_ARM_VCPU_PMU_V3_INIT, NULL);
}
_FDT(fdt_begin_node(fdt, "pmu"));
prev parent reply other threads:[~2026-06-18 19:06 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-18 15:49 [PATCH kvmtool v2 0/7] x86 compilation fixes and arm64 PMU improvements Alexandru Elisei
2026-06-18 15:49 ` [PATCH kvmtool v2 1/7] x86: Define bioscall only in 32-bit mode Alexandru Elisei
2026-06-18 15:49 ` [PATCH kvmtool v2 2/7] virtio: Do not modify const strings in virtio_9p_rootdir_parser() Alexandru Elisei
2026-06-18 15:49 ` [PATCH kvmtool v2 3/7] disk/core: Do not modify const strings in disk_img_name_parser() Alexandru Elisei
2026-06-18 15:49 ` [PATCH kvmtool v2 4/7] arm64: Initialise the PMU after the GIC Alexandru Elisei
2026-06-18 15:49 ` [PATCH kvmtool v2 5/7] util: Set exit status to errno in die_perror() Alexandru Elisei
2026-06-18 15:50 ` [PATCH kvmtool v2 6/7] util: Allow die_perror() to take a variable list of argument Alexandru Elisei
2026-06-18 15:50 ` [PATCH kvmtool v2 7/7] arm64: Improve KVM_ARM_VCPU_PMU_V3_CTRL diagnostics Alexandru Elisei
2026-06-18 19:06 ` Oliver Upton [this message]
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=ajRBpMnlcNkhWzQL@kernel.org \
--to=oupton@kernel.org \
--cc=alexandru.elisei@arm.com \
--cc=andre.przywara@arm.com \
--cc=jean-philippe.brucker@arm.com \
--cc=julien.thierry.kdev@gmail.com \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=maz@kernel.org \
--cc=suzuki.poulose@arm.com \
--cc=will@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.