From: Alexandru Elisei <alexandru.elisei@arm.com> To: maz@kernel.org, james.morse@arm.com, suzuki.poulose@arm.com, will@kernel.org, mark.rutland@arm.com, linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu Subject: [PATCH 2/4] KVM: arm64: Keep a list of probed PMUs Date: Mon, 15 Nov 2021 16:50:39 +0000 [thread overview] Message-ID: <20211115165041.194884-3-alexandru.elisei@arm.com> (raw) In-Reply-To: <20211115165041.194884-1-alexandru.elisei@arm.com> The ARM PMU driver calls kvm_host_pmu_init() after probing to tell KVM that a hardware PMU is available for guest emulation. Heterogeneous systems can have more than one PMU present, and the callback gets called multiple times, once for each of them. Keep track of all the PMUs available to KVM, as we're going to need them later. Signed-off-by: Alexandru Elisei <alexandru.elisei@arm.com> --- arch/arm64/kvm/pmu-emul.c | 26 ++++++++++++++++++++++++-- include/kvm/arm_pmu.h | 5 +++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/arch/arm64/kvm/pmu-emul.c b/arch/arm64/kvm/pmu-emul.c index a5e4bbf5e68f..dab335d17409 100644 --- a/arch/arm64/kvm/pmu-emul.c +++ b/arch/arm64/kvm/pmu-emul.c @@ -7,6 +7,7 @@ #include <linux/cpu.h> #include <linux/kvm.h> #include <linux/kvm_host.h> +#include <linux/list.h> #include <linux/perf_event.h> #include <linux/perf/arm_pmu.h> #include <linux/uaccess.h> @@ -14,6 +15,9 @@ #include <kvm/arm_pmu.h> #include <kvm/arm_vgic.h> +static LIST_HEAD(arm_pmus); +static DEFINE_MUTEX(arm_pmus_lock); + static void kvm_pmu_create_perf_event(struct kvm_vcpu *vcpu, u64 select_idx); static void kvm_pmu_update_pmc_chained(struct kvm_vcpu *vcpu, u64 select_idx); static void kvm_pmu_stop_counter(struct kvm_vcpu *vcpu, struct kvm_pmc *pmc); @@ -742,9 +746,27 @@ void kvm_pmu_set_counter_event_type(struct kvm_vcpu *vcpu, u64 data, void kvm_host_pmu_init(struct arm_pmu *pmu) { - if (pmu->pmuver != 0 && pmu->pmuver != ID_AA64DFR0_PMUVER_IMP_DEF && - !kvm_arm_support_pmu_v3() && !is_protected_kvm_enabled()) + struct arm_pmu_entry *entry; + + if (pmu->pmuver == 0 || pmu->pmuver == ID_AA64DFR0_PMUVER_IMP_DEF || + is_protected_kvm_enabled()) + return; + + /* Protect list changes against asynchronous driver probing. */ + mutex_lock(&arm_pmus_lock); + + entry = kmalloc(sizeof(*entry), GFP_KERNEL); + if (!entry) + goto out_unlock; + + if (list_empty(&arm_pmus)) static_branch_enable(&kvm_arm_pmu_available); + + entry->arm_pmu = pmu; + list_add_tail(&entry->entry, &arm_pmus); + +out_unlock: + mutex_unlock(&arm_pmus_lock); } static int kvm_pmu_probe_pmuver(void) diff --git a/include/kvm/arm_pmu.h b/include/kvm/arm_pmu.h index 90f21898aad8..e249c5f172aa 100644 --- a/include/kvm/arm_pmu.h +++ b/include/kvm/arm_pmu.h @@ -36,6 +36,11 @@ struct kvm_pmu { struct irq_work overflow_work; }; +struct arm_pmu_entry { + struct list_head entry; + struct arm_pmu *arm_pmu; +}; + #define kvm_arm_pmu_irq_initialized(v) ((v)->arch.pmu.irq_num >= VGIC_NR_SGIS) u64 kvm_pmu_get_counter_value(struct kvm_vcpu *vcpu, u64 select_idx); void kvm_pmu_set_counter_value(struct kvm_vcpu *vcpu, u64 select_idx, u64 val); -- 2.33.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: maz@kernel.org, james.morse@arm.com, suzuki.poulose@arm.com, will@kernel.org, mark.rutland@arm.com, linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu Cc: peter.maydell@linaro.org Subject: [PATCH 2/4] KVM: arm64: Keep a list of probed PMUs Date: Mon, 15 Nov 2021 16:50:39 +0000 [thread overview] Message-ID: <20211115165041.194884-3-alexandru.elisei@arm.com> (raw) In-Reply-To: <20211115165041.194884-1-alexandru.elisei@arm.com> The ARM PMU driver calls kvm_host_pmu_init() after probing to tell KVM that a hardware PMU is available for guest emulation. Heterogeneous systems can have more than one PMU present, and the callback gets called multiple times, once for each of them. Keep track of all the PMUs available to KVM, as we're going to need them later. Signed-off-by: Alexandru Elisei <alexandru.elisei@arm.com> --- arch/arm64/kvm/pmu-emul.c | 26 ++++++++++++++++++++++++-- include/kvm/arm_pmu.h | 5 +++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/arch/arm64/kvm/pmu-emul.c b/arch/arm64/kvm/pmu-emul.c index a5e4bbf5e68f..dab335d17409 100644 --- a/arch/arm64/kvm/pmu-emul.c +++ b/arch/arm64/kvm/pmu-emul.c @@ -7,6 +7,7 @@ #include <linux/cpu.h> #include <linux/kvm.h> #include <linux/kvm_host.h> +#include <linux/list.h> #include <linux/perf_event.h> #include <linux/perf/arm_pmu.h> #include <linux/uaccess.h> @@ -14,6 +15,9 @@ #include <kvm/arm_pmu.h> #include <kvm/arm_vgic.h> +static LIST_HEAD(arm_pmus); +static DEFINE_MUTEX(arm_pmus_lock); + static void kvm_pmu_create_perf_event(struct kvm_vcpu *vcpu, u64 select_idx); static void kvm_pmu_update_pmc_chained(struct kvm_vcpu *vcpu, u64 select_idx); static void kvm_pmu_stop_counter(struct kvm_vcpu *vcpu, struct kvm_pmc *pmc); @@ -742,9 +746,27 @@ void kvm_pmu_set_counter_event_type(struct kvm_vcpu *vcpu, u64 data, void kvm_host_pmu_init(struct arm_pmu *pmu) { - if (pmu->pmuver != 0 && pmu->pmuver != ID_AA64DFR0_PMUVER_IMP_DEF && - !kvm_arm_support_pmu_v3() && !is_protected_kvm_enabled()) + struct arm_pmu_entry *entry; + + if (pmu->pmuver == 0 || pmu->pmuver == ID_AA64DFR0_PMUVER_IMP_DEF || + is_protected_kvm_enabled()) + return; + + /* Protect list changes against asynchronous driver probing. */ + mutex_lock(&arm_pmus_lock); + + entry = kmalloc(sizeof(*entry), GFP_KERNEL); + if (!entry) + goto out_unlock; + + if (list_empty(&arm_pmus)) static_branch_enable(&kvm_arm_pmu_available); + + entry->arm_pmu = pmu; + list_add_tail(&entry->entry, &arm_pmus); + +out_unlock: + mutex_unlock(&arm_pmus_lock); } static int kvm_pmu_probe_pmuver(void) diff --git a/include/kvm/arm_pmu.h b/include/kvm/arm_pmu.h index 90f21898aad8..e249c5f172aa 100644 --- a/include/kvm/arm_pmu.h +++ b/include/kvm/arm_pmu.h @@ -36,6 +36,11 @@ struct kvm_pmu { struct irq_work overflow_work; }; +struct arm_pmu_entry { + struct list_head entry; + struct arm_pmu *arm_pmu; +}; + #define kvm_arm_pmu_irq_initialized(v) ((v)->arch.pmu.irq_num >= VGIC_NR_SGIS) u64 kvm_pmu_get_counter_value(struct kvm_vcpu *vcpu, u64 select_idx); void kvm_pmu_set_counter_value(struct kvm_vcpu *vcpu, u64 select_idx, u64 val); -- 2.33.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:[~2021-11-15 16:49 UTC|newest] Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-11-15 16:50 [PATCH 0/4] KVM: arm64: Improve PMU support on heterogeneous systems Alexandru Elisei 2021-11-15 16:50 ` Alexandru Elisei 2021-11-15 16:50 ` [PATCH 1/4] perf: Fix wrong name in comment for struct perf_cpu_context Alexandru Elisei 2021-11-15 16:50 ` Alexandru Elisei 2021-11-15 16:50 ` Alexandru Elisei [this message] 2021-11-15 16:50 ` [PATCH 2/4] KVM: arm64: Keep a list of probed PMUs Alexandru Elisei 2021-11-15 16:50 ` [PATCH 3/4] KVM: arm64: Add KVM_ARM_VCPU_PMU_V3_SET_PMU attribute Alexandru Elisei 2021-11-15 16:50 ` Alexandru Elisei 2021-11-21 19:11 ` Marc Zyngier 2021-11-21 19:11 ` Marc Zyngier 2021-11-22 11:29 ` Alexandru Elisei 2021-11-22 11:29 ` Alexandru Elisei 2021-11-15 16:50 ` [PATCH 4/4] KVM: arm64: Refuse to run VCPU if the PMU doesn't match the physical CPU Alexandru Elisei 2021-11-15 16:50 ` Alexandru Elisei 2021-11-21 19:35 ` Marc Zyngier 2021-11-21 19:35 ` Marc Zyngier 2021-11-22 12:12 ` Alexandru Elisei 2021-11-22 12:12 ` Alexandru Elisei 2021-11-22 14:21 ` Marc Zyngier 2021-11-22 14:21 ` Marc Zyngier 2021-11-22 14:43 ` Alexandru Elisei 2021-11-22 14:43 ` Alexandru Elisei 2021-12-06 10:15 ` Marc Zyngier 2021-12-06 10:15 ` Marc Zyngier 2021-12-06 10:26 ` Alexandru Elisei 2021-12-06 10:26 ` 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=20211115165041.194884-3-alexandru.elisei@arm.com \ --to=alexandru.elisei@arm.com \ --cc=james.morse@arm.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.