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 | return cpu_address; | 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 | #define cpu_relax() barrier() | 225 | #define cpu_relax() barrier() |
| 232 | 226 | ||
| 233 | #define ECAG_CACHE_ATTRIBUTE 0 | 227 | #define ECAG_CACHE_ATTRIBUTE 0 |
| @@ -7,6 +7,7 @@ · 6 unmodified lines | |||
| 7 | #define KMSG_COMPONENT "cpu" | 7 | #define KMSG_COMPONENT "cpu" |
| 8 | #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt | 8 | #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt |
| 9 | 9 | ||
| 10 | #include <linux/stop_machine.h> | ||
| 10 | #include <linux/cpufeature.h> | 11 | #include <linux/cpufeature.h> |
| 11 | #include <linux/bitops.h> | 12 | #include <linux/bitops.h> |
| 12 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
| @@ -59,7 +60,7 @@ void s390_update_cpu_mhz(void) · 46 unmodified lines | |||
| 59 | on_each_cpu(update_cpu_mhz, NULL, 0); | 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 | int cpu, this_cpu; | 65 | int cpu, this_cpu; |
| 65 | 66 | ||
| @@ -73,7 +74,6 @@ void notrace cpu_relax_yield(const struct cpumask *cpumask) · 7 unmodified lines | |||
| 73 | smp_yield_cpu(cpu); | 74 | smp_yield_cpu(cpu); |
| 74 | } | 75 | } |
| 75 | } | 76 | } |
| 76 | EXPORT_SYMBOL(cpu_relax_yield); | ||
| 77 | 77 | ||
| 78 | /* | 78 | /* |
| 79 | * cpu_init - initializes state that is per-CPU. | 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 | #endif | 1519 | #endif |
| 1520 | 1520 | ||
| 1521 | #ifndef cpu_relax_yield | ||
| 1522 | #define cpu_relax_yield(cpumask) cpu_relax() | ||
| 1523 | #endif | ||
| 1524 | |||
| 1525 | extern int yield_to(struct task_struct *p, bool preempt); | 1521 | extern int yield_to(struct task_struct *p, bool preempt); |
| 1526 | extern void set_user_nice(struct task_struct *p, long nice); | 1522 | extern void set_user_nice(struct task_struct *p, long nice); |
| 1527 | extern int task_prio(const struct task_struct *p); | 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 | int try_stop_cpus(const struct cpumask *cpumask, cpu_stop_fn_t fn, void *arg); | 36 | int try_stop_cpus(const struct cpumask *cpumask, cpu_stop_fn_t fn, void *arg); |
| 37 | void stop_machine_park(int cpu); | 37 | void stop_machine_park(int cpu); |
| 38 | void stop_machine_unpark(int cpu); | 38 | void stop_machine_unpark(int cpu); |
| 39 | void stop_machine_yield(const struct cpumask *cpumask); | ||
| 39 | 40 | ||
| 40 | #else /* CONFIG_SMP */ | 41 | #else /* CONFIG_SMP */ |
| 41 | 42 | ||
| @@ -177,6 +177,11 @@ static void ack_state(struct multi_stop_data *msdata) · 176 unmodified lines | |||
| 177 | set_state(msdata, msdata->state + 1); | 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 | /* This is the cpu_stop function which stops the CPU. */ | 185 | /* This is the cpu_stop function which stops the CPU. */ |
| 181 | static int multi_cpu_stop(void *data) | 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 | /* Simple state machine */ | 209 | /* Simple state machine */ |
| 205 | do { | 210 | do { |
| 206 | /* Chill out and ensure we re-read multi_stop_state. */ | 211 | /* Chill out and ensure we re-read multi_stop_state. */ |
| 207 | cpu_relax_yield(cpumask); | 212 | stop_machine_yield(cpumask); |
| 208 | if (msdata->state != curstate) { | 213 | if (msdata->state != curstate) { |
| 209 | curstate = msdata->state; | 214 | curstate = msdata->state; |
| 210 | switch (curstate) { | 215 | switch (curstate) { |