stop_machine is the only user left of cpu_relax_yield. Given that it now has special semantics which are tied to stop_machine introduce a weak stop_machine_yield function which architectures can override, and get rid of the generic cpu_relax_yield implementation.
Unified · Split
| @@ -222,12 +222,6 @@ static __no_kasan_or_inline unsigned short stap(void) · 221 unmodified lines | ||
| 222 | 222 | return cpu_address; |
| 223 | 223 | } |
| 224 | 224 | |
| 225 | −/* | |
| 226 | − * Give up the time slice of the virtual PU. | |
| 227 | − */ | |
| 228 | −#define cpu_relax_yield cpu_relax_yield | |
| 229 | −void cpu_relax_yield(const struct cpumask *cpumask); | |
| 230 | − | |
| 231 | 225 | #define cpu_relax() barrier() |
| 232 | 226 | |
| 233 | 227 | #define ECAG_CACHE_ATTRIBUTE 0 |
| @@ -7,6 +7,7 @@ · 6 unmodified lines | ||
| 7 | 7 | #define KMSG_COMPONENT "cpu" |
| 8 | 8 | #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt |
| 9 | 9 | |
| 10 | +#include <linux/stop_machine.h> | |
| 10 | 11 | #include <linux/cpufeature.h> |
| 11 | 12 | #include <linux/bitops.h> |
| 12 | 13 | #include <linux/kernel.h> |
| @@ -59,7 +60,7 @@ void s390_update_cpu_mhz(void) · 46 unmodified lines | ||
| 59 | 60 | on_each_cpu(update_cpu_mhz, NULL, 0); |
| 60 | 61 | } |
| 61 | 62 | |
| 62 | −void notrace cpu_relax_yield(const struct cpumask *cpumask) | |
| 63 | +void notrace stop_machine_yield(const struct cpumask *cpumask) | |
| 63 | 64 | { |
| 64 | 65 | int cpu, this_cpu; |
| 65 | 66 | |
| @@ -73,7 +74,6 @@ void notrace cpu_relax_yield(const struct cpumask *cpumask) · 7 unmodified lines | ||
| 73 | 74 | smp_yield_cpu(cpu); |
| 74 | 75 | } |
| 75 | 76 | } |
| 76 | −EXPORT_SYMBOL(cpu_relax_yield); | |
| 77 | 77 | |
| 78 | 78 | /* |
| 79 | 79 | * cpu_init - initializes state that is per-CPU. |
| @@ -1518,10 +1518,6 @@ static inline int set_cpus_allowed_ptr(struct task_struct *p, const struct cpuma · 1517 unmodified lines | ||
| 1518 | 1518 | } |
| 1519 | 1519 | #endif |
| 1520 | 1520 | |
| 1521 | −#ifndef cpu_relax_yield | |
| 1522 | −#define cpu_relax_yield(cpumask) cpu_relax() | |
| 1523 | −#endif | |
| 1524 | − | |
| 1525 | 1521 | extern int yield_to(struct task_struct *p, bool preempt); |
| 1526 | 1522 | extern void set_user_nice(struct task_struct *p, long nice); |
| 1527 | 1523 | extern int task_prio(const struct task_struct *p); |
| @@ -36,6 +36,7 @@ int stop_cpus(const struct cpumask *cpumask, cpu_stop_fn_t fn, void *arg); · 35 unmodified lines | ||
| 36 | 36 | int try_stop_cpus(const struct cpumask *cpumask, cpu_stop_fn_t fn, void *arg); |
| 37 | 37 | void stop_machine_park(int cpu); |
| 38 | 38 | void stop_machine_unpark(int cpu); |
| 39 | +void stop_machine_yield(const struct cpumask *cpumask); | |
| 39 | 40 | |
| 40 | 41 | #else /* CONFIG_SMP */ |
| 41 | 42 | |
| @@ -177,6 +177,11 @@ static void ack_state(struct multi_stop_data *msdata) · 176 unmodified lines | ||
| 177 | 177 | set_state(msdata, msdata->state + 1); |
| 178 | 178 | } |
| 179 | 179 | |
| 180 | +void __weak stop_machine_yield(const struct cpumask *cpumask) | |
| 181 | +{ | |
| 182 | + cpu_relax(); | |
| 183 | +} | |
| 184 | + | |
| 180 | 185 | /* This is the cpu_stop function which stops the CPU. */ |
| 181 | 186 | static int multi_cpu_stop(void *data) |
| 182 | 187 | { |
| @@ -204,7 +209,7 @@ static int multi_cpu_stop(void *data) · 21 unmodified lines | ||
| 204 | 209 | /* Simple state machine */ |
| 205 | 210 | do { |
| 206 | 211 | /* Chill out and ensure we re-read multi_stop_state. */ |
| 207 | − cpu_relax_yield(cpumask); | |
| 212 | + stop_machine_yield(cpumask); | |
| 208 | 213 | if (msdata->state != curstate) { |
| 209 | 214 | curstate = msdata->state; |
| 210 | 215 | switch (curstate) { |