135 lines
4.5 KiB
Diff
135 lines
4.5 KiB
Diff
From b5fad44d7353231e773cce3b45f37c4bf932b7de Mon Sep 17 00:00:00 2001
|
|
From: Thomas Gleixner <tglx@linutronix.de>
|
|
Date: Fri, 30 Jul 2021 15:44:10 +0800
|
|
Subject: [PATCH 05/19] genirq: Export affinity setter for modules
|
|
|
|
mainline inclusion
|
|
from mainline-v5.14-rc1
|
|
commit 4d80d6ca5d77fde9880da8466e5b64f250e5bf82
|
|
category: feature
|
|
bugzilla: https://gitee.com/openeuler/kernel/issues/I5RP8T
|
|
CVE: NA
|
|
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4d80d6ca5d77fde9880da8466e5b64f250e5bf82
|
|
|
|
------------------------------------------------------------------------
|
|
|
|
Perf modules abuse irq_set_affinity_hint() to set the affinity of system
|
|
PMU interrupts just because irq_set_affinity() was not exported.
|
|
|
|
The fact that irq_set_affinity_hint() actually sets the affinity is a
|
|
non-documented side effect and the name is clearly saying it's a hint.
|
|
|
|
To clean this up, export the real affinity setter.
|
|
|
|
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|
Acked-by: Mark Rutland <mark.rutland@arm.com>
|
|
Link: https://lore.kernel.org/r/20210518093117.968251441@linutronix.de
|
|
Reviewed-by: Shaokun Zhang <zhangshaokun@hisilicon.com>
|
|
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
|
Signed-off-by: YunYi Yang <yangyunyi2@huawei.com>
|
|
---
|
|
include/linux/interrupt.h | 35 ++---------------------------------
|
|
kernel/irq/manage.c | 33 ++++++++++++++++++++++++++++++++-
|
|
2 files changed, 34 insertions(+), 34 deletions(-)
|
|
|
|
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
|
|
index 97de36a38770..9c60dc87963a 100644
|
|
--- a/include/linux/interrupt.h
|
|
+++ b/include/linux/interrupt.h
|
|
@@ -277,39 +277,8 @@ struct irq_affinity {
|
|
|
|
extern cpumask_var_t irq_default_affinity;
|
|
|
|
-/* Internal implementation. Use the helpers below */
|
|
-extern int __irq_set_affinity(unsigned int irq, const struct cpumask *cpumask,
|
|
- bool force);
|
|
-
|
|
-/**
|
|
- * irq_set_affinity - Set the irq affinity of a given irq
|
|
- * @irq: Interrupt to set affinity
|
|
- * @cpumask: cpumask
|
|
- *
|
|
- * Fails if cpumask does not contain an online CPU
|
|
- */
|
|
-static inline int
|
|
-irq_set_affinity(unsigned int irq, const struct cpumask *cpumask)
|
|
-{
|
|
- return __irq_set_affinity(irq, cpumask, false);
|
|
-}
|
|
-
|
|
-/**
|
|
- * irq_force_affinity - Force the irq affinity of a given irq
|
|
- * @irq: Interrupt to set affinity
|
|
- * @cpumask: cpumask
|
|
- *
|
|
- * Same as irq_set_affinity, but without checking the mask against
|
|
- * online cpus.
|
|
- *
|
|
- * Solely for low level cpu hotplug code, where we need to make per
|
|
- * cpu interrupts affine before the cpu becomes online.
|
|
- */
|
|
-static inline int
|
|
-irq_force_affinity(unsigned int irq, const struct cpumask *cpumask)
|
|
-{
|
|
- return __irq_set_affinity(irq, cpumask, true);
|
|
-}
|
|
+extern int irq_set_affinity(unsigned int irq, const struct cpumask *cpumask);
|
|
+extern int irq_force_affinity(unsigned int irq, const struct cpumask *cpumask);
|
|
|
|
extern int irq_can_set_affinity(unsigned int irq);
|
|
extern int irq_select_affinity(unsigned int irq);
|
|
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
|
|
index 163712c76520..f4c0e509d74f 100644
|
|
--- a/kernel/irq/manage.c
|
|
+++ b/kernel/irq/manage.c
|
|
@@ -331,7 +331,8 @@ int irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask,
|
|
return ret;
|
|
}
|
|
|
|
-int __irq_set_affinity(unsigned int irq, const struct cpumask *mask, bool force)
|
|
+static int __irq_set_affinity(unsigned int irq, const struct cpumask *mask,
|
|
+ bool force)
|
|
{
|
|
struct irq_desc *desc = irq_to_desc(irq);
|
|
unsigned long flags;
|
|
@@ -346,6 +347,36 @@ int __irq_set_affinity(unsigned int irq, const struct cpumask *mask, bool force)
|
|
return ret;
|
|
}
|
|
|
|
+/**
|
|
+ * irq_set_affinity - Set the irq affinity of a given irq
|
|
+ * @irq: Interrupt to set affinity
|
|
+ * @cpumask: cpumask
|
|
+ *
|
|
+ * Fails if cpumask does not contain an online CPU
|
|
+ */
|
|
+int irq_set_affinity(unsigned int irq, const struct cpumask *cpumask)
|
|
+{
|
|
+ return __irq_set_affinity(irq, cpumask, false);
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(irq_set_affinity);
|
|
+
|
|
+/**
|
|
+ * irq_force_affinity - Force the irq affinity of a given irq
|
|
+ * @irq: Interrupt to set affinity
|
|
+ * @cpumask: cpumask
|
|
+ *
|
|
+ * Same as irq_set_affinity, but without checking the mask against
|
|
+ * online cpus.
|
|
+ *
|
|
+ * Solely for low level cpu hotplug code, where we need to make per
|
|
+ * cpu interrupts affine before the cpu becomes online.
|
|
+ */
|
|
+int irq_force_affinity(unsigned int irq, const struct cpumask *cpumask)
|
|
+{
|
|
+ return __irq_set_affinity(irq, cpumask, true);
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(irq_force_affinity);
|
|
+
|
|
int irq_set_affinity_hint(unsigned int irq, const struct cpumask *m)
|
|
{
|
|
unsigned long flags;
|
|
--
|
|
2.27.0
|
|
|