lkml.org 
[lkml]   [2020]   [Jun]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 7/7] arm_pmu: arm64: Use NMIs for PMU
    Date
    From: Julien Thierry <julien.thierry@arm.com>

    Add required PMU interrupt operations for NMIs. Request interrupt lines as
    NMIs when possible, otherwise fall back to normal interrupts.

    NMIs are only supported on the arm64 architecture with a GICv3 irqchip.

    Cc: Julien Thierry <julien.thierry.kdev@gmail.com>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Signed-off-by: Julien Thierry <julien.thierry@arm.com>
    [Added that NMIs only work on arm64 + GICv3]
    Signed-off-by: Alexandru Elisei <alexandru.elisei@arm.com>
    ---
    drivers/perf/arm_pmu.c | 62 ++++++++++++++++++++++++++++++++++++++----
    1 file changed, 56 insertions(+), 6 deletions(-)

    diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c
    index 17e5952d21e4..dd9d7f61ee29 100644
    --- a/drivers/perf/arm_pmu.c
    +++ b/drivers/perf/arm_pmu.c
    @@ -45,6 +45,17 @@ static const struct pmu_irq_ops pmuirq_ops = {
    .free_pmuirq = armpmu_free_pmuirq
    };

    +static void armpmu_free_pmunmi(unsigned int irq, int cpu, void __percpu *devid)
    +{
    + free_nmi(irq, per_cpu_ptr(devid, cpu));
    +}
    +
    +static const struct pmu_irq_ops pmunmi_ops = {
    + .enable_pmuirq = enable_nmi,
    + .disable_pmuirq = disable_nmi_nosync,
    + .free_pmuirq = armpmu_free_pmunmi
    +};
    +
    static void armpmu_enable_percpu_pmuirq(unsigned int irq)
    {
    enable_percpu_irq(irq, IRQ_TYPE_NONE);
    @@ -63,6 +74,31 @@ static const struct pmu_irq_ops percpu_pmuirq_ops = {
    .free_pmuirq = armpmu_free_percpu_pmuirq
    };

    +static void armpmu_enable_percpu_pmunmi(unsigned int irq)
    +{
    + if (!prepare_percpu_nmi(irq))
    + enable_percpu_nmi(irq, IRQ_TYPE_NONE);
    +}
    +
    +static void armpmu_disable_percpu_pmunmi(unsigned int irq)
    +{
    + disable_percpu_nmi(irq);
    + teardown_percpu_nmi(irq);
    +}
    +
    +static void armpmu_free_percpu_pmunmi(unsigned int irq, int cpu,
    + void __percpu *devid)
    +{
    + if (armpmu_count_irq_users(irq) == 1)
    + free_percpu_nmi(irq, devid);
    +}
    +
    +static const struct pmu_irq_ops percpu_pmunmi_ops = {
    + .enable_pmuirq = armpmu_enable_percpu_pmunmi,
    + .disable_pmuirq = armpmu_disable_percpu_pmunmi,
    + .free_pmuirq = armpmu_free_percpu_pmunmi
    +};
    +
    static DEFINE_PER_CPU(struct arm_pmu *, cpu_armpmu);
    static DEFINE_PER_CPU(int, cpu_irq);
    static DEFINE_PER_CPU(const struct pmu_irq_ops *, cpu_irq_ops);
    @@ -633,15 +669,29 @@ int armpmu_request_irq(int irq, int cpu)
    IRQF_NO_THREAD;

    irq_set_status_flags(irq, IRQ_NOAUTOEN);
    - err = request_irq(irq, handler, irq_flags, "arm-pmu",
    +
    + err = request_nmi(irq, handler, irq_flags, "arm-pmu",
    per_cpu_ptr(&cpu_armpmu, cpu));

    - irq_ops = &pmuirq_ops;
    + /* If cannot get an NMI, get a normal interrupt */
    + if (err) {
    + err = request_irq(irq, handler, irq_flags, "arm-pmu",
    + per_cpu_ptr(&cpu_armpmu, cpu));
    + irq_ops = &pmuirq_ops;
    + } else {
    + irq_ops = &pmunmi_ops;
    + }
    } else if (armpmu_count_irq_users(irq) == 0) {
    - err = request_percpu_irq(irq, handler, "arm-pmu",
    - &cpu_armpmu);
    -
    - irq_ops = &percpu_pmuirq_ops;
    + err = request_percpu_nmi(irq, handler, "arm-pmu", &cpu_armpmu);
    +
    + /* If cannot get an NMI, get a normal interrupt */
    + if (err) {
    + err = request_percpu_irq(irq, handler, "arm-pmu",
    + &cpu_armpmu);
    + irq_ops = &percpu_pmuirq_ops;
    + } else {
    + irq_ops = &percpu_pmunmi_ops;
    + }
    } else {
    /* Per cpudevid irq was already requested by another CPU */
    irq_ops = armpmu_find_irq_ops(irq);
    --
    2.27.0
    \
     
     \ /
      Last update: 2020-06-17 13:39    [W:2.993 / U:0.196 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site