From: Alexandru Elisei <alexandru.elisei@arm.com> To: will@kernel.org, julien.thierry.kdev@gmail.com, linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, maz@kernel.org, james.morse@arm.com, suzuki.poulose@arm.com, mark.rutland@arm.com, andre.przywara@arm.com Subject: [PATCH v2 kvmtool 06/10] arm64: Rework set_pmu_attr() Date: Thu, 27 Jan 2022 16:20:29 +0000 [thread overview] Message-ID: <20220127162033.54290-7-alexandru.elisei@arm.com> (raw) In-Reply-To: <20220127162033.54290-1-alexandru.elisei@arm.com> By the time kvmtool generates the DTB node for the PMU, the KVM_ARM_VCPU_PMU_V3 VCPU feature is already set by kvm_cpu__arch_init(). KVM refuses to run a VCPU if the PMU hasn't been initialized. A PMU cannot be initialized if the interrupt ID hasn't been set by userspace. As a consequence, kvmtool will get an error if the interrupt ID or if the PMU has not been initialized: KVM_RUN failed: Invalid argument To make debugging easier, exit with an error message as soon as one the PMU ioctls fails, instead of waiting until the VCPU is first run. To avoid the repetition of assigning a new kvm_device_attr struct in the main body of pmu__generate_fdt_nodes(), which hinders readability of the function, move the struct to set_pmu_attr(). Signed-off-by: Alexandru Elisei <alexandru.elisei@arm.com> --- arm/aarch64/pmu.c | 48 ++++++++++++++++------------------------------- 1 file changed, 16 insertions(+), 32 deletions(-) diff --git a/arm/aarch64/pmu.c b/arm/aarch64/pmu.c index 6b190c5e2ae5..ac5b7bcd6ca9 100644 --- a/arm/aarch64/pmu.c +++ b/arm/aarch64/pmu.c @@ -7,30 +7,31 @@ #include "asm/pmu.h" -static int set_pmu_attr(struct kvm *kvm, int vcpu_idx, - struct kvm_device_attr *attr) +static void set_pmu_attr(struct kvm_cpu *vcpu, void *addr, u64 attr) { - int ret, fd; - - fd = kvm->cpus[vcpu_idx]->vcpu_fd; + struct kvm_device_attr pmu_attr = { + .group = KVM_ARM_VCPU_PMU_V3_CTRL, + .addr = (u64)addr, + .attr = attr, + }; + int ret; - ret = ioctl(fd, KVM_HAS_DEVICE_ATTR, attr); + ret = ioctl(vcpu->vcpu_fd, KVM_HAS_DEVICE_ATTR, &pmu_attr); if (!ret) { - ret = ioctl(fd, KVM_SET_DEVICE_ATTR, attr); + ret = ioctl(vcpu->vcpu_fd, KVM_SET_DEVICE_ATTR, &pmu_attr); if (ret) - perror("PMU KVM_SET_DEVICE_ATTR failed"); + die_perror("PMU KVM_SET_DEVICE_ATTR"); } else { - pr_err("Unsupported PMU on vcpu%d\n", vcpu_idx); + die_perror("PMU KVM_HAS_DEVICE_ATTR"); } - - return ret; } void pmu__generate_fdt_nodes(void *fdt, struct kvm *kvm) { const char compatible[] = "arm,armv8-pmuv3"; int irq = KVM_ARM_PMUv3_PPI; - int i, ret; + struct kvm_cpu *vcpu; + int i; u32 cpu_mask = (((1 << kvm->nrcpus) - 1) << GIC_FDT_IRQ_PPI_CPU_SHIFT) \ & GIC_FDT_IRQ_PPI_CPU_MASK; @@ -44,26 +45,9 @@ void pmu__generate_fdt_nodes(void *fdt, struct kvm *kvm) return; for (i = 0; i < kvm->nrcpus; i++) { - struct kvm_device_attr pmu_attr; - - pmu_attr = (struct kvm_device_attr){ - .group = KVM_ARM_VCPU_PMU_V3_CTRL, - .addr = (u64)(unsigned long)&irq, - .attr = KVM_ARM_VCPU_PMU_V3_IRQ, - }; - - ret = set_pmu_attr(kvm, i, &pmu_attr); - if (ret) - return; - - pmu_attr = (struct kvm_device_attr){ - .group = KVM_ARM_VCPU_PMU_V3_CTRL, - .attr = KVM_ARM_VCPU_PMU_V3_INIT, - }; - - ret = set_pmu_attr(kvm, i, &pmu_attr); - if (ret) - return; + vcpu = kvm->cpus[i]; + set_pmu_attr(vcpu, &irq, KVM_ARM_VCPU_PMU_V3_IRQ); + set_pmu_attr(vcpu, NULL, KVM_ARM_VCPU_PMU_V3_INIT); } _FDT(fdt_begin_node(fdt, "pmu")); -- 2.31.1 _______________________________________________ kvmarm mailing list kvmarm@lists.cs.columbia.edu https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
WARNING: multiple messages have this Message-ID (diff)
From: Alexandru Elisei <alexandru.elisei@arm.com> To: will@kernel.org, julien.thierry.kdev@gmail.com, linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, maz@kernel.org, james.morse@arm.com, suzuki.poulose@arm.com, mark.rutland@arm.com, andre.przywara@arm.com Subject: [PATCH v2 kvmtool 06/10] arm64: Rework set_pmu_attr() Date: Thu, 27 Jan 2022 16:20:29 +0000 [thread overview] Message-ID: <20220127162033.54290-7-alexandru.elisei@arm.com> (raw) In-Reply-To: <20220127162033.54290-1-alexandru.elisei@arm.com> By the time kvmtool generates the DTB node for the PMU, the KVM_ARM_VCPU_PMU_V3 VCPU feature is already set by kvm_cpu__arch_init(). KVM refuses to run a VCPU if the PMU hasn't been initialized. A PMU cannot be initialized if the interrupt ID hasn't been set by userspace. As a consequence, kvmtool will get an error if the interrupt ID or if the PMU has not been initialized: KVM_RUN failed: Invalid argument To make debugging easier, exit with an error message as soon as one the PMU ioctls fails, instead of waiting until the VCPU is first run. To avoid the repetition of assigning a new kvm_device_attr struct in the main body of pmu__generate_fdt_nodes(), which hinders readability of the function, move the struct to set_pmu_attr(). Signed-off-by: Alexandru Elisei <alexandru.elisei@arm.com> --- arm/aarch64/pmu.c | 48 ++++++++++++++++------------------------------- 1 file changed, 16 insertions(+), 32 deletions(-) diff --git a/arm/aarch64/pmu.c b/arm/aarch64/pmu.c index 6b190c5e2ae5..ac5b7bcd6ca9 100644 --- a/arm/aarch64/pmu.c +++ b/arm/aarch64/pmu.c @@ -7,30 +7,31 @@ #include "asm/pmu.h" -static int set_pmu_attr(struct kvm *kvm, int vcpu_idx, - struct kvm_device_attr *attr) +static void set_pmu_attr(struct kvm_cpu *vcpu, void *addr, u64 attr) { - int ret, fd; - - fd = kvm->cpus[vcpu_idx]->vcpu_fd; + struct kvm_device_attr pmu_attr = { + .group = KVM_ARM_VCPU_PMU_V3_CTRL, + .addr = (u64)addr, + .attr = attr, + }; + int ret; - ret = ioctl(fd, KVM_HAS_DEVICE_ATTR, attr); + ret = ioctl(vcpu->vcpu_fd, KVM_HAS_DEVICE_ATTR, &pmu_attr); if (!ret) { - ret = ioctl(fd, KVM_SET_DEVICE_ATTR, attr); + ret = ioctl(vcpu->vcpu_fd, KVM_SET_DEVICE_ATTR, &pmu_attr); if (ret) - perror("PMU KVM_SET_DEVICE_ATTR failed"); + die_perror("PMU KVM_SET_DEVICE_ATTR"); } else { - pr_err("Unsupported PMU on vcpu%d\n", vcpu_idx); + die_perror("PMU KVM_HAS_DEVICE_ATTR"); } - - return ret; } void pmu__generate_fdt_nodes(void *fdt, struct kvm *kvm) { const char compatible[] = "arm,armv8-pmuv3"; int irq = KVM_ARM_PMUv3_PPI; - int i, ret; + struct kvm_cpu *vcpu; + int i; u32 cpu_mask = (((1 << kvm->nrcpus) - 1) << GIC_FDT_IRQ_PPI_CPU_SHIFT) \ & GIC_FDT_IRQ_PPI_CPU_MASK; @@ -44,26 +45,9 @@ void pmu__generate_fdt_nodes(void *fdt, struct kvm *kvm) return; for (i = 0; i < kvm->nrcpus; i++) { - struct kvm_device_attr pmu_attr; - - pmu_attr = (struct kvm_device_attr){ - .group = KVM_ARM_VCPU_PMU_V3_CTRL, - .addr = (u64)(unsigned long)&irq, - .attr = KVM_ARM_VCPU_PMU_V3_IRQ, - }; - - ret = set_pmu_attr(kvm, i, &pmu_attr); - if (ret) - return; - - pmu_attr = (struct kvm_device_attr){ - .group = KVM_ARM_VCPU_PMU_V3_CTRL, - .attr = KVM_ARM_VCPU_PMU_V3_INIT, - }; - - ret = set_pmu_attr(kvm, i, &pmu_attr); - if (ret) - return; + vcpu = kvm->cpus[i]; + set_pmu_attr(vcpu, &irq, KVM_ARM_VCPU_PMU_V3_IRQ); + set_pmu_attr(vcpu, NULL, KVM_ARM_VCPU_PMU_V3_INIT); } _FDT(fdt_begin_node(fdt, "pmu")); -- 2.31.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2022-01-27 16:20 UTC|newest] Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top 2022-01-27 16:20 [PATCH v2 kvmtool 00/10] arm64: Improve PMU support on heterogeneous systems Alexandru Elisei 2022-01-27 16:20 ` Alexandru Elisei 2022-01-27 16:20 ` [PATCH v2 kvmtool 01/10] linux/err.h: Add missing stdbool.h include Alexandru Elisei 2022-01-27 16:20 ` Alexandru Elisei 2022-01-27 16:20 ` [PATCH v2 kvmtool 02/10] bitops.h: Include wordsize.h to provide the __WORDSIZE define Alexandru Elisei 2022-01-27 16:20 ` Alexandru Elisei 2022-01-27 16:20 ` [PATCH v2 kvmtool 03/10] arm: Move arch specific VCPU features to the arch specific function Alexandru Elisei 2022-01-27 16:20 ` Alexandru Elisei 2022-01-27 16:20 ` [PATCH v2 kvmtool 04/10] arm: Get rid of the ARM_VCPU_FEATURE_FLAGS() macro Alexandru Elisei 2022-01-27 16:20 ` Alexandru Elisei 2022-01-27 16:20 ` [PATCH v2 kvmtool 05/10] arm: Make the PMUv3 emulation code arm64 specific Alexandru Elisei 2022-01-27 16:20 ` Alexandru Elisei 2022-01-27 16:20 ` Alexandru Elisei [this message] 2022-01-27 16:20 ` [PATCH v2 kvmtool 06/10] arm64: Rework set_pmu_attr() Alexandru Elisei 2022-01-27 16:20 ` [PATCH v2 kvmtool 07/10] Add cpumask functions Alexandru Elisei 2022-01-27 16:20 ` Alexandru Elisei 2022-01-27 16:20 ` [PATCH v2 kvmtool 08/10] update_headers.sh: Sync headers with Linux v5.17-rc1 + SET_PMU attribute Alexandru Elisei 2022-01-27 16:20 ` Alexandru Elisei 2022-01-27 16:20 ` [PATCH v2 kvmtool 09/10] arm64: Add support for KVM_ARM_VCPU_PMU_V3_SET_PMU Alexandru Elisei 2022-01-27 16:20 ` Alexandru Elisei 2022-01-27 16:20 ` [PATCH v2 kvmtool 10/10] arm64: Add --vcpu-affinity command line argument Alexandru Elisei 2022-01-27 16:20 ` Alexandru Elisei 2022-02-14 10:20 ` [PATCH v2 kvmtool 00/10] arm64: Improve PMU support on heterogeneous systems Alexandru Elisei 2022-02-14 10:20 ` Alexandru Elisei
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=20220127162033.54290-7-alexandru.elisei@arm.com \ --to=alexandru.elisei@arm.com \ --cc=andre.przywara@arm.com \ --cc=james.morse@arm.com \ --cc=julien.thierry.kdev@gmail.com \ --cc=kvmarm@lists.cs.columbia.edu \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=mark.rutland@arm.com \ --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: linkBe 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.