diff options
Diffstat (limited to 'meta-arm/meta-arm-bsp/recipes-kernel/linux/linux-arm64-ack-5.10/tc/0017-perf-arm-cmn-Use-irq_set_affinity.patch')
-rw-r--r-- | meta-arm/meta-arm-bsp/recipes-kernel/linux/linux-arm64-ack-5.10/tc/0017-perf-arm-cmn-Use-irq_set_affinity.patch | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/meta-arm/meta-arm-bsp/recipes-kernel/linux/linux-arm64-ack-5.10/tc/0017-perf-arm-cmn-Use-irq_set_affinity.patch b/meta-arm/meta-arm-bsp/recipes-kernel/linux/linux-arm64-ack-5.10/tc/0017-perf-arm-cmn-Use-irq_set_affinity.patch new file mode 100644 index 0000000000..e8674c33ea --- /dev/null +++ b/meta-arm/meta-arm-bsp/recipes-kernel/linux/linux-arm64-ack-5.10/tc/0017-perf-arm-cmn-Use-irq_set_affinity.patch @@ -0,0 +1,74 @@ +From ad3c5d9224ffcd7b2e083f03441c6188d2bbef67 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner <tglx@linutronix.de> +Date: Tue, 18 May 2021 11:17:28 +0200 +Subject: [PATCH 01/14] perf/arm-cmn: Use irq_set_affinity() + +The driver uses irq_set_affinity_hint() to set the affinity for the PMU +interrupts, which relies on the undocumented side effect that this function +actually sets the affinity under the hood. + +Setting an hint is clearly not a guarantee and for these PMU interrupts an +affinity hint, which is supposed to guide userspace for setting affinity, +is beyond pointless, because the affinity of these interrupts cannot be +modified from user space. + +Aside of that the error checks are bogus because the only error which is +returned from irq_set_affinity_hint() is when there is no irq descriptor +for the interrupt number, but not when the affinity set fails. That's on +purpose because the hint can point to an offline CPU. + +Replace the mindless abuse with irq_set_affinity(). + +Signed-off-by: Thomas Gleixner <tglx@linutronix.de> + +Link: https://lore.kernel.org/r/20210518093118.277228577@linutronix.de +Signed-off-by: Will Deacon <will@kernel.org> + +Upstream-Status: Backport [https://lore.kernel.org/r/20210518093118.277228577@linutronix.de] +Signed-off-by: Rupinderjit Singh <rupinderjit.singh@arm.com> +--- + drivers/perf/arm-cmn.c | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +diff --git a/drivers/perf/arm-cmn.c b/drivers/perf/arm-cmn.c +index 46defb1dcf86..38fa6f89d0bc 100644 +--- a/drivers/perf/arm-cmn.c ++++ b/drivers/perf/arm-cmn.c +@@ -1162,7 +1162,7 @@ static int arm_cmn_pmu_offline_cpu(unsigned int cpu, struct hlist_node *node) + + perf_pmu_migrate_context(&cmn->pmu, cpu, target); + for (i = 0; i < cmn->num_dtcs; i++) +- irq_set_affinity_hint(cmn->dtc[i].irq, cpumask_of(target)); ++ irq_set_affinity(cmn->dtc[i].irq, cpumask_of(target)); + cmn->cpu = target; + return 0; + } +@@ -1222,7 +1222,7 @@ static int arm_cmn_init_irqs(struct arm_cmn *cmn) + if (err) + return err; + +- err = irq_set_affinity_hint(irq, cpumask_of(cmn->cpu)); ++ err = irq_set_affinity(irq, cpumask_of(cmn->cpu)); + if (err) + return err; + next: +@@ -1568,16 +1568,11 @@ static int arm_cmn_probe(struct platform_device *pdev) + static int arm_cmn_remove(struct platform_device *pdev) + { + struct arm_cmn *cmn = platform_get_drvdata(pdev); +- int i; + + writel_relaxed(0, cmn->dtc[0].base + CMN_DT_DTC_CTL); + + perf_pmu_unregister(&cmn->pmu); + cpuhp_state_remove_instance(arm_cmn_hp_state, &cmn->cpuhp_node); +- +- for (i = 0; i < cmn->num_dtcs; i++) +- irq_set_affinity_hint(cmn->dtc[i].irq, NULL); +- + return 0; + } + +-- +2.25.1 + |