blob: 8455a53465af8c0fb3aeabd8e44e7b72ad647c9b [file] [log] [blame]
Thomas Gleixner457c8992019-05-19 13:08:55 +01001// SPDX-License-Identifier: GPL-2.0-only
Jens Axboe3d442232008-06-26 11:21:34 +02002/*
3 * Generic helpers for smp ipi calls
4 *
5 * (C) Jens Axboe <jens.axboe@oracle.com> 2008
Jens Axboe3d442232008-06-26 11:21:34 +02006 */
Michael Ellermanca7dfdb2016-10-26 16:37:53 +11007
8#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
9
Frederic Weisbecker47885012014-05-08 01:37:48 +020010#include <linux/irq_work.h>
Jens Axboe3d442232008-06-26 11:21:34 +020011#include <linux/rcupdate.h>
Linus Torvalds59190f4212008-07-15 14:02:33 -070012#include <linux/rculist.h>
Ingo Molnar641cd4c2009-03-13 10:47:34 +010013#include <linux/kernel.h>
Paul Gortmaker9984de12011-05-23 14:51:41 -040014#include <linux/export.h>
Ingo Molnar0b13fda2009-02-25 16:52:11 +010015#include <linux/percpu.h>
16#include <linux/init.h>
Sebastian Andrzej Siewiorf9d34592021-01-23 21:10:25 +010017#include <linux/interrupt.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090018#include <linux/gfp.h>
Jens Axboe3d442232008-06-26 11:21:34 +020019#include <linux/smp.h>
Peter Zijlstra8969a5e2009-02-25 13:59:47 +010020#include <linux/cpu.h>
Chuansheng Liuc6f44592014-09-04 15:17:54 +080021#include <linux/sched.h>
Ingo Molnar4c822692017-02-01 16:36:40 +010022#include <linux/sched/idle.h>
Juergen Gross47ae4b02016-08-29 08:48:43 +020023#include <linux/hypervisor.h>
Paul E. McKenney35feb602020-06-30 13:22:54 -070024#include <linux/sched/clock.h>
25#include <linux/nmi.h>
26#include <linux/sched/debug.h>
Juergen Gross8d0968c2021-03-01 11:13:34 +010027#include <linux/jump_label.h>
Jens Axboe3d442232008-06-26 11:21:34 +020028
Valentin Schneidercc9cb0a2023-03-07 14:35:53 +000029#include <trace/events/ipi.h>
Leonardo Bras949fa3f2023-06-15 03:59:45 -030030#define CREATE_TRACE_POINTS
31#include <trace/events/csd.h>
32#undef CREATE_TRACE_POINTS
Valentin Schneidercc9cb0a2023-03-07 14:35:53 +000033
Suresh Siddha3bb5d2e2012-04-20 17:08:50 -070034#include "smpboot.h"
Ingo Molnar1f8db412020-05-28 11:01:34 +020035#include "sched/smp.h"
Suresh Siddha3bb5d2e2012-04-20 17:08:50 -070036
Peter Zijlstra545b8c82020-06-15 11:29:31 +020037#define CSD_TYPE(_csd) ((_csd)->node.u_flags & CSD_FLAG_TYPE_MASK)
Jens Axboe3d442232008-06-26 11:21:34 +020038
39struct call_function_data {
Paul E. McKenney6366d062023-03-20 17:55:15 -070040 call_single_data_t __percpu *csd;
Ingo Molnar0b13fda2009-02-25 16:52:11 +010041 cpumask_var_t cpumask;
Aaron Lu3fc5b3b2017-05-19 15:53:31 +080042 cpumask_var_t cpumask_ipi;
Jens Axboe3d442232008-06-26 11:21:34 +020043};
44
Nadav Amita22793c2019-06-12 23:48:11 -070045static DEFINE_PER_CPU_ALIGNED(struct call_function_data, cfd_data);
Milton Millere03bcb62010-01-18 13:00:51 +110046
Christoph Hellwig6897fc222014-01-30 15:45:47 -080047static DEFINE_PER_CPU_SHARED_ALIGNED(struct llist_head, call_single_queue);
Peter Zijlstra8969a5e2009-02-25 13:59:47 +010048
Imran Khan0d3a00b2023-05-09 08:31:24 +100049static DEFINE_PER_CPU(atomic_t, trigger_backtrace) = ATOMIC_INIT(1);
50
Thomas Gleixner16bf5a52022-04-13 15:31:03 +020051static void __flush_smp_call_function_queue(bool warn_cpu_offline);
Srivatsa S. Bhat8d056c42014-06-23 13:22:02 -070052
Richard Weinberger31487f82016-07-13 17:17:01 +000053int smpcfd_prepare_cpu(unsigned int cpu)
Peter Zijlstra8969a5e2009-02-25 13:59:47 +010054{
Peter Zijlstra8969a5e2009-02-25 13:59:47 +010055 struct call_function_data *cfd = &per_cpu(cfd_data, cpu);
56
Richard Weinberger31487f82016-07-13 17:17:01 +000057 if (!zalloc_cpumask_var_node(&cfd->cpumask, GFP_KERNEL,
58 cpu_to_node(cpu)))
59 return -ENOMEM;
Aaron Lu3fc5b3b2017-05-19 15:53:31 +080060 if (!zalloc_cpumask_var_node(&cfd->cpumask_ipi, GFP_KERNEL,
61 cpu_to_node(cpu))) {
62 free_cpumask_var(cfd->cpumask);
63 return -ENOMEM;
64 }
Paul E. McKenney6366d062023-03-20 17:55:15 -070065 cfd->csd = alloc_percpu(call_single_data_t);
66 if (!cfd->csd) {
Peter Zijlstra8969a5e2009-02-25 13:59:47 +010067 free_cpumask_var(cfd->cpumask);
Aaron Lu3fc5b3b2017-05-19 15:53:31 +080068 free_cpumask_var(cfd->cpumask_ipi);
Richard Weinberger31487f82016-07-13 17:17:01 +000069 return -ENOMEM;
70 }
Srivatsa S. Bhat8d056c42014-06-23 13:22:02 -070071
Richard Weinberger31487f82016-07-13 17:17:01 +000072 return 0;
Peter Zijlstra8969a5e2009-02-25 13:59:47 +010073}
74
Richard Weinberger31487f82016-07-13 17:17:01 +000075int smpcfd_dead_cpu(unsigned int cpu)
76{
77 struct call_function_data *cfd = &per_cpu(cfd_data, cpu);
78
79 free_cpumask_var(cfd->cpumask);
Aaron Lu3fc5b3b2017-05-19 15:53:31 +080080 free_cpumask_var(cfd->cpumask_ipi);
Paul E. McKenney6366d062023-03-20 17:55:15 -070081 free_percpu(cfd->csd);
Richard Weinberger31487f82016-07-13 17:17:01 +000082 return 0;
83}
84
85int smpcfd_dying_cpu(unsigned int cpu)
86{
87 /*
88 * The IPIs for the smp-call-function callbacks queued by other
89 * CPUs might arrive late, either due to hardware latencies or
90 * because this CPU disabled interrupts (inside stop-machine)
91 * before the IPIs were sent. So flush out any pending callbacks
92 * explicitly (without waiting for the IPIs to arrive), to
93 * ensure that the outgoing CPU doesn't go offline with work
94 * still pending.
95 */
Thomas Gleixner16bf5a52022-04-13 15:31:03 +020096 __flush_smp_call_function_queue(false);
Peter Zijlstraafaa6532020-05-26 18:11:00 +020097 irq_work_run();
Richard Weinberger31487f82016-07-13 17:17:01 +000098 return 0;
99}
Peter Zijlstra8969a5e2009-02-25 13:59:47 +0100100
Takao Indohd8ad7d12011-03-29 12:35:04 -0400101void __init call_function_init(void)
Jens Axboe3d442232008-06-26 11:21:34 +0200102{
103 int i;
104
Christoph Hellwig6897fc222014-01-30 15:45:47 -0800105 for_each_possible_cpu(i)
106 init_llist_head(&per_cpu(call_single_queue, i));
Peter Zijlstra8969a5e2009-02-25 13:59:47 +0100107
Richard Weinberger31487f82016-07-13 17:17:01 +0000108 smpcfd_prepare_cpu(smp_processor_id());
Jens Axboe3d442232008-06-26 11:21:34 +0200109}
110
Valentin Schneider08407b52023-03-07 14:35:54 +0000111static __always_inline void
Peter Zijlstra5c312492023-03-22 14:58:36 +0100112send_call_function_single_ipi(int cpu)
Valentin Schneider08407b52023-03-07 14:35:54 +0000113{
Valentin Schneider68f4ff02023-03-07 14:35:58 +0000114 if (call_function_single_prep_ipi(cpu)) {
Peter Zijlstra5c312492023-03-22 14:58:36 +0100115 trace_ipi_send_cpu(cpu, _RET_IP_,
116 generic_smp_call_function_single_interrupt);
Valentin Schneider68f4ff02023-03-07 14:35:58 +0000117 arch_send_call_function_single_ipi(cpu);
118 }
119}
120
121static __always_inline void
Peter Zijlstra5c312492023-03-22 14:58:36 +0100122send_call_function_ipi_mask(struct cpumask *mask)
Valentin Schneider68f4ff02023-03-07 14:35:58 +0000123{
Peter Zijlstra5c312492023-03-22 14:58:36 +0100124 trace_ipi_send_cpumask(mask, _RET_IP_,
125 generic_smp_call_function_single_interrupt);
Valentin Schneider08407b52023-03-07 14:35:54 +0000126 arch_send_call_function_ipi_mask(mask);
127}
128
Leonardo Bras949fa3f2023-06-15 03:59:45 -0300129static __always_inline void
130csd_do_func(smp_call_func_t func, void *info, struct __call_single_data *csd)
131{
132 trace_csd_function_entry(func, csd);
133 func(info);
134 trace_csd_function_exit(func, csd);
135}
136
Paul E. McKenney35feb602020-06-30 13:22:54 -0700137#ifdef CONFIG_CSD_LOCK_WAIT_DEBUG
138
Paul E. McKenneyc5219862023-03-20 17:55:13 -0700139static DEFINE_STATIC_KEY_MAYBE(CONFIG_CSD_LOCK_WAIT_DEBUG_DEFAULT, csdlock_debug_enabled);
Juergen Gross8d0968c2021-03-01 11:13:34 +0100140
Paul E. McKenney17712572023-03-20 17:55:14 -0700141/*
142 * Parse the csdlock_debug= kernel boot parameter.
143 *
144 * If you need to restore the old "ext" value that once provided
145 * additional debugging information, reapply the following commits:
146 *
147 * de7b09ef658d ("locking/csd_lock: Prepare more CSD lock debugging")
148 * a5aabace5fb8 ("locking/csd_lock: Add more data to CSD lock debugging")
149 */
Juergen Gross8d0968c2021-03-01 11:13:34 +0100150static int __init csdlock_debug(char *str)
151{
Paul E. McKenney203e4352023-03-20 17:55:16 -0700152 int ret;
Juergen Gross8d0968c2021-03-01 11:13:34 +0100153 unsigned int val = 0;
154
Paul E. McKenney203e4352023-03-20 17:55:16 -0700155 ret = get_option(&str, &val);
156 if (ret) {
157 if (val)
158 static_branch_enable(&csdlock_debug_enabled);
159 else
160 static_branch_disable(&csdlock_debug_enabled);
161 }
Juergen Gross8d0968c2021-03-01 11:13:34 +0100162
Chen Zhongjin9c9b26b2022-05-10 17:46:39 +0800163 return 1;
Juergen Gross8d0968c2021-03-01 11:13:34 +0100164}
Chen Zhongjin9c9b26b2022-05-10 17:46:39 +0800165__setup("csdlock_debug=", csdlock_debug);
Juergen Gross8d0968c2021-03-01 11:13:34 +0100166
Paul E. McKenney35feb602020-06-30 13:22:54 -0700167static DEFINE_PER_CPU(call_single_data_t *, cur_csd);
168static DEFINE_PER_CPU(smp_call_func_t, cur_csd_func);
169static DEFINE_PER_CPU(void *, cur_csd_info);
170
Paul E. McKenney3791a222022-02-28 18:08:33 -0800171static ulong csd_lock_timeout = 5000; /* CSD lock timeout in milliseconds. */
172module_param(csd_lock_timeout, ulong, 0444);
173
Wei Yongjun2b722162020-07-06 21:49:41 +0800174static atomic_t csd_bug_count = ATOMIC_INIT(0);
Paul E. McKenney35feb602020-06-30 13:22:54 -0700175
176/* Record current CSD work for current CPU, NULL to erase. */
Arnd Bergmann1139aeb2021-05-05 23:12:42 +0200177static void __csd_lock_record(struct __call_single_data *csd)
Paul E. McKenney35feb602020-06-30 13:22:54 -0700178{
179 if (!csd) {
180 smp_mb(); /* NULL cur_csd after unlock. */
181 __this_cpu_write(cur_csd, NULL);
182 return;
183 }
184 __this_cpu_write(cur_csd_func, csd->func);
185 __this_cpu_write(cur_csd_info, csd->info);
186 smp_wmb(); /* func and info before csd. */
187 __this_cpu_write(cur_csd, csd);
188 smp_mb(); /* Update cur_csd before function call. */
189 /* Or before unlock, as the case may be. */
190}
191
Arnd Bergmann1139aeb2021-05-05 23:12:42 +0200192static __always_inline void csd_lock_record(struct __call_single_data *csd)
Juergen Gross8d0968c2021-03-01 11:13:34 +0100193{
194 if (static_branch_unlikely(&csdlock_debug_enabled))
195 __csd_lock_record(csd);
196}
197
Arnd Bergmann1139aeb2021-05-05 23:12:42 +0200198static int csd_lock_wait_getcpu(struct __call_single_data *csd)
Paul E. McKenney35feb602020-06-30 13:22:54 -0700199{
200 unsigned int csd_type;
201
202 csd_type = CSD_TYPE(csd);
203 if (csd_type == CSD_TYPE_ASYNC || csd_type == CSD_TYPE_SYNC)
Ingo Molnara787bda2020-11-27 11:09:57 +0100204 return csd->node.dst; /* Other CSD_TYPE_ values might not have ->dst. */
Paul E. McKenney35feb602020-06-30 13:22:54 -0700205 return -1;
206}
207
208/*
209 * Complain if too much time spent waiting. Note that only
210 * the CSD_TYPE_SYNC/ASYNC types provide the destination CPU,
211 * so waiting on other types gets much less information.
212 */
Arnd Bergmann1139aeb2021-05-05 23:12:42 +0200213static bool csd_lock_wait_toolong(struct __call_single_data *csd, u64 ts0, u64 *ts1, int *bug_id)
Paul E. McKenney35feb602020-06-30 13:22:54 -0700214{
215 int cpu = -1;
216 int cpux;
217 bool firsttime;
218 u64 ts2, ts_delta;
219 call_single_data_t *cpu_cur_csd;
Peter Zijlstra545b8c82020-06-15 11:29:31 +0200220 unsigned int flags = READ_ONCE(csd->node.u_flags);
Paul E. McKenney3791a222022-02-28 18:08:33 -0800221 unsigned long long csd_lock_timeout_ns = csd_lock_timeout * NSEC_PER_MSEC;
Paul E. McKenney35feb602020-06-30 13:22:54 -0700222
223 if (!(flags & CSD_FLAG_LOCK)) {
224 if (!unlikely(*bug_id))
225 return true;
226 cpu = csd_lock_wait_getcpu(csd);
227 pr_alert("csd: CSD lock (#%d) got unstuck on CPU#%02d, CPU#%02d released the lock.\n",
228 *bug_id, raw_smp_processor_id(), cpu);
229 return true;
230 }
231
232 ts2 = sched_clock();
233 ts_delta = ts2 - *ts1;
Paul E. McKenney3791a222022-02-28 18:08:33 -0800234 if (likely(ts_delta <= csd_lock_timeout_ns || csd_lock_timeout_ns == 0))
Paul E. McKenney35feb602020-06-30 13:22:54 -0700235 return false;
236
237 firsttime = !*bug_id;
238 if (firsttime)
239 *bug_id = atomic_inc_return(&csd_bug_count);
240 cpu = csd_lock_wait_getcpu(csd);
241 if (WARN_ONCE(cpu < 0 || cpu >= nr_cpu_ids, "%s: cpu = %d\n", __func__, cpu))
242 cpux = 0;
243 else
244 cpux = cpu;
245 cpu_cur_csd = smp_load_acquire(&per_cpu(cur_csd, cpux)); /* Before func and info. */
246 pr_alert("csd: %s non-responsive CSD lock (#%d) on CPU#%d, waiting %llu ns for CPU#%02d %pS(%ps).\n",
247 firsttime ? "Detected" : "Continued", *bug_id, raw_smp_processor_id(), ts2 - ts0,
248 cpu, csd->func, csd->info);
249 if (cpu_cur_csd && csd != cpu_cur_csd) {
250 pr_alert("\tcsd: CSD lock (#%d) handling prior %pS(%ps) request.\n",
251 *bug_id, READ_ONCE(per_cpu(cur_csd_func, cpux)),
252 READ_ONCE(per_cpu(cur_csd_info, cpux)));
253 } else {
254 pr_alert("\tcsd: CSD lock (#%d) %s.\n",
255 *bug_id, !cpu_cur_csd ? "unresponsive" : "handling this request");
256 }
257 if (cpu >= 0) {
Imran Khan0d3a00b2023-05-09 08:31:24 +1000258 if (atomic_cmpxchg_acquire(&per_cpu(trigger_backtrace, cpu), 1, 0))
259 dump_cpu_task(cpu);
Paul E. McKenney35feb602020-06-30 13:22:54 -0700260 if (!cpu_cur_csd) {
261 pr_alert("csd: Re-sending CSD lock (#%d) IPI from CPU#%02d to CPU#%02d\n", *bug_id, raw_smp_processor_id(), cpu);
262 arch_send_call_function_single_ipi(cpu);
263 }
264 }
Imran Khan5bd00f62023-05-09 08:31:23 +1000265 if (firsttime)
266 dump_stack();
Paul E. McKenney35feb602020-06-30 13:22:54 -0700267 *ts1 = ts2;
268
269 return false;
270}
271
Peter Zijlstra8969a5e2009-02-25 13:59:47 +0100272/*
Peter Zijlstra8969a5e2009-02-25 13:59:47 +0100273 * csd_lock/csd_unlock used to serialize access to per-cpu csd resources
274 *
Ingo Molnar0b13fda2009-02-25 16:52:11 +0100275 * For non-synchronous ipi calls the csd can still be in use by the
276 * previous function call. For multi-cpu calls its even more interesting
277 * as we'll have to ensure no other cpu is observing our csd.
Peter Zijlstra8969a5e2009-02-25 13:59:47 +0100278 */
Arnd Bergmann1139aeb2021-05-05 23:12:42 +0200279static void __csd_lock_wait(struct __call_single_data *csd)
Peter Zijlstra8969a5e2009-02-25 13:59:47 +0100280{
Paul E. McKenney35feb602020-06-30 13:22:54 -0700281 int bug_id = 0;
282 u64 ts0, ts1;
283
284 ts1 = ts0 = sched_clock();
285 for (;;) {
286 if (csd_lock_wait_toolong(csd, ts0, &ts1, &bug_id))
287 break;
288 cpu_relax();
289 }
290 smp_acquire__after_ctrl_dep();
291}
292
Arnd Bergmann1139aeb2021-05-05 23:12:42 +0200293static __always_inline void csd_lock_wait(struct __call_single_data *csd)
Juergen Gross8d0968c2021-03-01 11:13:34 +0100294{
295 if (static_branch_unlikely(&csdlock_debug_enabled)) {
296 __csd_lock_wait(csd);
297 return;
298 }
299
300 smp_cond_load_acquire(&csd->node.u_flags, !(VAL & CSD_FLAG_LOCK));
301}
Paul E. McKenney35feb602020-06-30 13:22:54 -0700302#else
Arnd Bergmann1139aeb2021-05-05 23:12:42 +0200303static void csd_lock_record(struct __call_single_data *csd)
Paul E. McKenney35feb602020-06-30 13:22:54 -0700304{
305}
306
Arnd Bergmann1139aeb2021-05-05 23:12:42 +0200307static __always_inline void csd_lock_wait(struct __call_single_data *csd)
Paul E. McKenney35feb602020-06-30 13:22:54 -0700308{
Peter Zijlstra545b8c82020-06-15 11:29:31 +0200309 smp_cond_load_acquire(&csd->node.u_flags, !(VAL & CSD_FLAG_LOCK));
Peter Zijlstra6e275632009-02-25 13:59:48 +0100310}
Paul E. McKenney35feb602020-06-30 13:22:54 -0700311#endif
Peter Zijlstra6e275632009-02-25 13:59:48 +0100312
Arnd Bergmann1139aeb2021-05-05 23:12:42 +0200313static __always_inline void csd_lock(struct __call_single_data *csd)
Peter Zijlstra6e275632009-02-25 13:59:48 +0100314{
Andrew Mortone1d12f32013-04-30 15:27:28 -0700315 csd_lock_wait(csd);
Peter Zijlstra545b8c82020-06-15 11:29:31 +0200316 csd->node.u_flags |= CSD_FLAG_LOCK;
Peter Zijlstra8969a5e2009-02-25 13:59:47 +0100317
318 /*
Ingo Molnar0b13fda2009-02-25 16:52:11 +0100319 * prevent CPU from reordering the above assignment
320 * to ->flags with any subsequent assignments to other
Ying Huang966a9672017-08-08 12:30:00 +0800321 * fields of the specified call_single_data_t structure:
Peter Zijlstra8969a5e2009-02-25 13:59:47 +0100322 */
Linus Torvalds80538712015-02-11 12:42:10 -0800323 smp_wmb();
Peter Zijlstra8969a5e2009-02-25 13:59:47 +0100324}
325
Arnd Bergmann1139aeb2021-05-05 23:12:42 +0200326static __always_inline void csd_unlock(struct __call_single_data *csd)
Peter Zijlstra8969a5e2009-02-25 13:59:47 +0100327{
Peter Zijlstra545b8c82020-06-15 11:29:31 +0200328 WARN_ON(!(csd->node.u_flags & CSD_FLAG_LOCK));
Ingo Molnar0b13fda2009-02-25 16:52:11 +0100329
Peter Zijlstra8969a5e2009-02-25 13:59:47 +0100330 /*
Ingo Molnar0b13fda2009-02-25 16:52:11 +0100331 * ensure we're all done before releasing data:
Peter Zijlstra8969a5e2009-02-25 13:59:47 +0100332 */
Peter Zijlstra545b8c82020-06-15 11:29:31 +0200333 smp_store_release(&csd->node.u_flags, 0);
Jens Axboe3d442232008-06-26 11:21:34 +0200334}
335
Valentin Schneider68f4ff02023-03-07 14:35:58 +0000336static DEFINE_PER_CPU_SHARED_ALIGNED(call_single_data_t, csd_data);
337
338void __smp_call_single_queue(int cpu, struct llist_node *node)
339{
340 /*
341 * We have to check the type of the CSD before queueing it, because
342 * once queued it can have its flags cleared by
343 * flush_smp_call_function_queue()
344 * even if we haven't sent the smp_call IPI yet (e.g. the stopper
345 * executes migration_cpu_stop() on the remote CPU).
346 */
Leonardo Brasbf5a8c22023-06-15 03:59:47 -0300347 if (trace_csd_queue_cpu_enabled()) {
Valentin Schneider68f4ff02023-03-07 14:35:58 +0000348 call_single_data_t *csd;
349 smp_call_func_t func;
350
351 csd = container_of(node, call_single_data_t, node.llist);
352 func = CSD_TYPE(csd) == CSD_TYPE_TTWU ?
353 sched_ttwu_pending : csd->func;
354
Leonardo Brasbf5a8c22023-06-15 03:59:47 -0300355 trace_csd_queue_cpu(cpu, _RET_IP_, func, csd);
Valentin Schneider68f4ff02023-03-07 14:35:58 +0000356 }
Peter Zijlstra5c312492023-03-22 14:58:36 +0100357
358 /*
359 * The list addition should be visible to the target CPU when it pops
360 * the head of the list to pull the entry off it in the IPI handler
361 * because of normal cache coherency rules implied by the underlying
362 * llist ops.
363 *
364 * If IPIs can go out of order to the cache coherency protocol
365 * in an architecture, sufficient synchronisation should be added
366 * to arch code to make it appear to obey cache coherency WRT
367 * locking and barrier primitives. Generic code isn't really
368 * equipped to do the right thing...
369 */
370 if (llist_add(node, &per_cpu(call_single_queue, cpu)))
371 send_call_function_single_ipi(cpu);
Peter Zijlstra4b44a212020-05-26 18:11:02 +0200372}
373
Jens Axboe3d442232008-06-26 11:21:34 +0200374/*
Ying Huang966a9672017-08-08 12:30:00 +0800375 * Insert a previously allocated call_single_data_t element
Ingo Molnar0b13fda2009-02-25 16:52:11 +0100376 * for execution on the given CPU. data must already have
377 * ->func, ->info, and ->flags set.
Jens Axboe3d442232008-06-26 11:21:34 +0200378 */
Arnd Bergmann1139aeb2021-05-05 23:12:42 +0200379static int generic_exec_single(int cpu, struct __call_single_data *csd)
Jens Axboe3d442232008-06-26 11:21:34 +0200380{
Frederic Weisbecker8b284992014-02-24 16:39:58 +0100381 if (cpu == smp_processor_id()) {
Peter Zijlstra4b44a212020-05-26 18:11:02 +0200382 smp_call_func_t func = csd->func;
383 void *info = csd->info;
Linus Torvalds80538712015-02-11 12:42:10 -0800384 unsigned long flags;
385
386 /*
387 * We can unlock early even for the synchronous on-stack case,
388 * since we're doing this from the same CPU..
389 */
Paul E. McKenney35feb602020-06-30 13:22:54 -0700390 csd_lock_record(csd);
Linus Torvalds80538712015-02-11 12:42:10 -0800391 csd_unlock(csd);
Frederic Weisbecker8b284992014-02-24 16:39:58 +0100392 local_irq_save(flags);
Leonardo Bras949fa3f2023-06-15 03:59:45 -0300393 csd_do_func(func, info, NULL);
Paul E. McKenney35feb602020-06-30 13:22:54 -0700394 csd_lock_record(NULL);
Frederic Weisbecker8b284992014-02-24 16:39:58 +0100395 local_irq_restore(flags);
396 return 0;
397 }
398
Linus Torvalds5224b962015-04-19 04:56:03 -0400399 if ((unsigned)cpu >= nr_cpu_ids || !cpu_online(cpu)) {
400 csd_unlock(csd);
Frederic Weisbecker8b284992014-02-24 16:39:58 +0100401 return -ENXIO;
Linus Torvalds5224b962015-04-19 04:56:03 -0400402 }
Frederic Weisbecker8b284992014-02-24 16:39:58 +0100403
Peter Zijlstra545b8c82020-06-15 11:29:31 +0200404 __smp_call_single_queue(cpu, &csd->node.llist);
Jens Axboe3d442232008-06-26 11:21:34 +0200405
Frederic Weisbecker8b284992014-02-24 16:39:58 +0100406 return 0;
Jens Axboe3d442232008-06-26 11:21:34 +0200407}
408
Srivatsa S. Bhat8d056c42014-06-23 13:22:02 -0700409/**
410 * generic_smp_call_function_single_interrupt - Execute SMP IPI callbacks
411 *
412 * Invoked by arch to handle an IPI for call function single.
413 * Must be called with interrupts disabled.
Jens Axboe3d442232008-06-26 11:21:34 +0200414 */
415void generic_smp_call_function_single_interrupt(void)
416{
Thomas Gleixner16bf5a52022-04-13 15:31:03 +0200417 __flush_smp_call_function_queue(true);
Srivatsa S. Bhat8d056c42014-06-23 13:22:02 -0700418}
419
420/**
Thomas Gleixner16bf5a52022-04-13 15:31:03 +0200421 * __flush_smp_call_function_queue - Flush pending smp-call-function callbacks
Srivatsa S. Bhat8d056c42014-06-23 13:22:02 -0700422 *
423 * @warn_cpu_offline: If set to 'true', warn if callbacks were queued on an
424 * offline CPU. Skip this check if set to 'false'.
425 *
426 * Flush any pending smp-call-function callbacks queued on this CPU. This is
427 * invoked by the generic IPI handler, as well as by a CPU about to go offline,
428 * to ensure that all pending IPI callbacks are run before it goes completely
429 * offline.
430 *
431 * Loop through the call_single_queue and run all the queued callbacks.
432 * Must be called with interrupts disabled.
433 */
Thomas Gleixner16bf5a52022-04-13 15:31:03 +0200434static void __flush_smp_call_function_queue(bool warn_cpu_offline)
Srivatsa S. Bhat8d056c42014-06-23 13:22:02 -0700435{
Ying Huang966a9672017-08-08 12:30:00 +0800436 call_single_data_t *csd, *csd_next;
Peter Zijlstra52103be2020-05-26 18:10:59 +0200437 struct llist_node *entry, *prev;
438 struct llist_head *head;
Srivatsa S. Bhata219ccf2014-06-06 14:37:05 -0700439 static bool warned;
Imran Khan0d3a00b2023-05-09 08:31:24 +1000440 atomic_t *tbt;
Srivatsa S. Bhata219ccf2014-06-06 14:37:05 -0700441
Frederic Weisbecker83efcbd2017-11-06 16:01:22 +0100442 lockdep_assert_irqs_disabled();
Srivatsa S. Bhat8d056c42014-06-23 13:22:02 -0700443
Imran Khan0d3a00b2023-05-09 08:31:24 +1000444 /* Allow waiters to send backtrace NMI from here onwards */
445 tbt = this_cpu_ptr(&trigger_backtrace);
446 atomic_set_release(tbt, 1);
447
Christoph Lameterbb964a92014-08-17 12:30:24 -0500448 head = this_cpu_ptr(&call_single_queue);
Srivatsa S. Bhat8d056c42014-06-23 13:22:02 -0700449 entry = llist_del_all(head);
Srivatsa S. Bhata219ccf2014-06-06 14:37:05 -0700450 entry = llist_reverse_order(entry);
Jens Axboe3d442232008-06-26 11:21:34 +0200451
Srivatsa S. Bhat8d056c42014-06-23 13:22:02 -0700452 /* There shouldn't be any pending callbacks on an offline CPU. */
453 if (unlikely(warn_cpu_offline && !cpu_online(smp_processor_id()) &&
Nadav Amit9e949a32022-03-19 00:20:15 -0700454 !warned && entry != NULL)) {
Srivatsa S. Bhata219ccf2014-06-06 14:37:05 -0700455 warned = true;
456 WARN(1, "IPI on offline CPU %d\n", smp_processor_id());
Suresh Siddha269c8612009-08-19 18:05:35 -0700457
Srivatsa S. Bhata219ccf2014-06-06 14:37:05 -0700458 /*
459 * We don't have to use the _safe() variant here
460 * because we are not invoking the IPI handlers yet.
461 */
Peter Zijlstra545b8c82020-06-15 11:29:31 +0200462 llist_for_each_entry(csd, entry, node.llist) {
Peter Zijlstra4b44a212020-05-26 18:11:02 +0200463 switch (CSD_TYPE(csd)) {
464 case CSD_TYPE_ASYNC:
465 case CSD_TYPE_SYNC:
466 case CSD_TYPE_IRQ_WORK:
467 pr_warn("IPI callback %pS sent to offline CPU\n",
468 csd->func);
469 break;
Jens Axboe3d442232008-06-26 11:21:34 +0200470
Peter Zijlstraa14886642020-05-26 18:11:04 +0200471 case CSD_TYPE_TTWU:
472 pr_warn("IPI task-wakeup sent to offline CPU\n");
473 break;
Linus Torvalds80538712015-02-11 12:42:10 -0800474
Peter Zijlstra4b44a212020-05-26 18:11:02 +0200475 default:
476 pr_warn("IPI callback, unknown type %d, sent to offline CPU\n",
477 CSD_TYPE(csd));
478 break;
479 }
Linus Torvalds80538712015-02-11 12:42:10 -0800480 }
Jens Axboe3d442232008-06-26 11:21:34 +0200481 }
Frederic Weisbecker47885012014-05-08 01:37:48 +0200482
483 /*
Peter Zijlstra52103be2020-05-26 18:10:59 +0200484 * First; run all SYNC callbacks, people are waiting for us.
Frederic Weisbecker47885012014-05-08 01:37:48 +0200485 */
Peter Zijlstra52103be2020-05-26 18:10:59 +0200486 prev = NULL;
Peter Zijlstra545b8c82020-06-15 11:29:31 +0200487 llist_for_each_entry_safe(csd, csd_next, entry, node.llist) {
Jens Axboe3d442232008-06-26 11:21:34 +0200488 /* Do we wait until *after* callback? */
Peter Zijlstra4b44a212020-05-26 18:11:02 +0200489 if (CSD_TYPE(csd) == CSD_TYPE_SYNC) {
490 smp_call_func_t func = csd->func;
491 void *info = csd->info;
492
Peter Zijlstra52103be2020-05-26 18:10:59 +0200493 if (prev) {
Peter Zijlstra545b8c82020-06-15 11:29:31 +0200494 prev->next = &csd_next->node.llist;
Peter Zijlstra52103be2020-05-26 18:10:59 +0200495 } else {
Peter Zijlstra545b8c82020-06-15 11:29:31 +0200496 entry = &csd_next->node.llist;
Peter Zijlstra52103be2020-05-26 18:10:59 +0200497 }
Peter Zijlstra4b44a212020-05-26 18:11:02 +0200498
Paul E. McKenney35feb602020-06-30 13:22:54 -0700499 csd_lock_record(csd);
Leonardo Bras949fa3f2023-06-15 03:59:45 -0300500 csd_do_func(func, info, csd);
Jens Axboe3d442232008-06-26 11:21:34 +0200501 csd_unlock(csd);
Paul E. McKenney35feb602020-06-30 13:22:54 -0700502 csd_lock_record(NULL);
Jens Axboe3d442232008-06-26 11:21:34 +0200503 } else {
Peter Zijlstra545b8c82020-06-15 11:29:31 +0200504 prev = &csd->node.llist;
Jens Axboe3d442232008-06-26 11:21:34 +0200505 }
506 }
Frederic Weisbecker47885012014-05-08 01:37:48 +0200507
Paul E. McKenney17712572023-03-20 17:55:14 -0700508 if (!entry)
Peter Zijlstraa14886642020-05-26 18:11:04 +0200509 return;
510
Frederic Weisbecker47885012014-05-08 01:37:48 +0200511 /*
Peter Zijlstra52103be2020-05-26 18:10:59 +0200512 * Second; run all !SYNC callbacks.
513 */
Peter Zijlstraa14886642020-05-26 18:11:04 +0200514 prev = NULL;
Peter Zijlstra545b8c82020-06-15 11:29:31 +0200515 llist_for_each_entry_safe(csd, csd_next, entry, node.llist) {
Peter Zijlstra4b44a212020-05-26 18:11:02 +0200516 int type = CSD_TYPE(csd);
Peter Zijlstra52103be2020-05-26 18:10:59 +0200517
Peter Zijlstraa14886642020-05-26 18:11:04 +0200518 if (type != CSD_TYPE_TTWU) {
519 if (prev) {
Peter Zijlstra545b8c82020-06-15 11:29:31 +0200520 prev->next = &csd_next->node.llist;
Peter Zijlstraa14886642020-05-26 18:11:04 +0200521 } else {
Peter Zijlstra545b8c82020-06-15 11:29:31 +0200522 entry = &csd_next->node.llist;
Peter Zijlstraa14886642020-05-26 18:11:04 +0200523 }
Peter Zijlstra4b44a212020-05-26 18:11:02 +0200524
Peter Zijlstraa14886642020-05-26 18:11:04 +0200525 if (type == CSD_TYPE_ASYNC) {
526 smp_call_func_t func = csd->func;
527 void *info = csd->info;
528
Paul E. McKenney35feb602020-06-30 13:22:54 -0700529 csd_lock_record(csd);
Peter Zijlstraa14886642020-05-26 18:11:04 +0200530 csd_unlock(csd);
Leonardo Bras949fa3f2023-06-15 03:59:45 -0300531 csd_do_func(func, info, csd);
Paul E. McKenney35feb602020-06-30 13:22:54 -0700532 csd_lock_record(NULL);
Peter Zijlstraa14886642020-05-26 18:11:04 +0200533 } else if (type == CSD_TYPE_IRQ_WORK) {
534 irq_work_single(csd);
535 }
536
537 } else {
Peter Zijlstra545b8c82020-06-15 11:29:31 +0200538 prev = &csd->node.llist;
Peter Zijlstra4b44a212020-05-26 18:11:02 +0200539 }
Peter Zijlstra52103be2020-05-26 18:10:59 +0200540 }
Peter Zijlstraa14886642020-05-26 18:11:04 +0200541
542 /*
543 * Third; only CSD_TYPE_TTWU is left, issue those.
544 */
Leonardo Bras949fa3f2023-06-15 03:59:45 -0300545 if (entry) {
546 csd = llist_entry(entry, typeof(*csd), node.llist);
547 csd_do_func(sched_ttwu_pending, entry, csd);
548 }
Jens Axboe3d442232008-06-26 11:21:34 +0200549}
550
Thomas Gleixner16bf5a52022-04-13 15:31:03 +0200551
552/**
553 * flush_smp_call_function_queue - Flush pending smp-call-function callbacks
554 * from task context (idle, migration thread)
555 *
556 * When TIF_POLLING_NRFLAG is supported and a CPU is in idle and has it
557 * set, then remote CPUs can avoid sending IPIs and wake the idle CPU by
558 * setting TIF_NEED_RESCHED. The idle task on the woken up CPU has to
559 * handle queued SMP function calls before scheduling.
560 *
561 * The migration thread has to ensure that an eventually pending wakeup has
562 * been handled before it migrates a task.
563 */
564void flush_smp_call_function_queue(void)
Peter Zijlstrab2a02fc2020-05-26 18:11:01 +0200565{
Sebastian Andrzej Siewior1a90bfd2022-04-13 15:31:05 +0200566 unsigned int was_pending;
Peter Zijlstrab2a02fc2020-05-26 18:11:01 +0200567 unsigned long flags;
568
569 if (llist_empty(this_cpu_ptr(&call_single_queue)))
570 return;
571
572 local_irq_save(flags);
Sebastian Andrzej Siewior1a90bfd2022-04-13 15:31:05 +0200573 /* Get the already pending soft interrupts for RT enabled kernels */
574 was_pending = local_softirq_pending();
Thomas Gleixner16bf5a52022-04-13 15:31:03 +0200575 __flush_smp_call_function_queue(true);
Sebastian Andrzej Siewiorf9d34592021-01-23 21:10:25 +0100576 if (local_softirq_pending())
Sebastian Andrzej Siewior1a90bfd2022-04-13 15:31:05 +0200577 do_softirq_post_smp_call_flush(was_pending);
Sebastian Andrzej Siewiorf9d34592021-01-23 21:10:25 +0100578
Peter Zijlstrab2a02fc2020-05-26 18:11:01 +0200579 local_irq_restore(flags);
Jens Axboe3d442232008-06-26 11:21:34 +0200580}
581
582/*
583 * smp_call_function_single - Run a function on a specific CPU
584 * @func: The function to run. This must be fast and non-blocking.
585 * @info: An arbitrary pointer to pass to the function.
586 * @wait: If true, wait until function has completed on other CPUs.
587 *
Sheng Yang72f279b2009-10-22 19:19:34 +0800588 * Returns 0 on success, else a negative status code.
Jens Axboe3d442232008-06-26 11:21:34 +0200589 */
David Howells3a5f65df2010-10-27 17:28:36 +0100590int smp_call_function_single(int cpu, smp_call_func_t func, void *info,
Jens Axboe8691e5a2008-06-06 11:18:06 +0200591 int wait)
Jens Axboe3d442232008-06-26 11:21:34 +0200592{
Ying Huang966a9672017-08-08 12:30:00 +0800593 call_single_data_t *csd;
594 call_single_data_t csd_stack = {
Peter Zijlstra545b8c82020-06-15 11:29:31 +0200595 .node = { .u_flags = CSD_FLAG_LOCK | CSD_TYPE_SYNC, },
Ying Huang966a9672017-08-08 12:30:00 +0800596 };
Ingo Molnar0b13fda2009-02-25 16:52:11 +0100597 int this_cpu;
Frederic Weisbecker8b284992014-02-24 16:39:58 +0100598 int err;
Jens Axboe3d442232008-06-26 11:21:34 +0200599
Ingo Molnar0b13fda2009-02-25 16:52:11 +0100600 /*
601 * prevent preemption and reschedule on another processor,
602 * as well as CPU removal
603 */
604 this_cpu = get_cpu();
605
Suresh Siddha269c8612009-08-19 18:05:35 -0700606 /*
607 * Can deadlock when called with interrupts disabled.
608 * We allow cpu's that are not yet online though, as no one else can
609 * send smp call function interrupt to this cpu and as such deadlocks
610 * can't happen.
611 */
612 WARN_ON_ONCE(cpu_online(this_cpu) && irqs_disabled()
613 && !oops_in_progress);
Jens Axboe3d442232008-06-26 11:21:34 +0200614
Peter Zijlstra19dbdcb2019-07-18 11:20:09 +0200615 /*
616 * When @wait we can deadlock when we interrupt between llist_add() and
617 * arch_send_call_function_ipi*(); when !@wait we can deadlock due to
618 * csd_lock() on because the interrupt context uses the same csd
619 * storage.
620 */
621 WARN_ON_ONCE(!in_task());
622
Linus Torvalds80538712015-02-11 12:42:10 -0800623 csd = &csd_stack;
624 if (!wait) {
625 csd = this_cpu_ptr(&csd_data);
626 csd_lock(csd);
627 }
628
Peter Zijlstra4b44a212020-05-26 18:11:02 +0200629 csd->func = func;
630 csd->info = info;
Paul E. McKenney35feb602020-06-30 13:22:54 -0700631#ifdef CONFIG_CSD_LOCK_WAIT_DEBUG
Peter Zijlstra545b8c82020-06-15 11:29:31 +0200632 csd->node.src = smp_processor_id();
633 csd->node.dst = cpu;
Paul E. McKenneye48c15b2020-06-29 17:21:32 -0700634#endif
Peter Zijlstra4b44a212020-05-26 18:11:02 +0200635
636 err = generic_exec_single(cpu, csd);
Linus Torvalds80538712015-02-11 12:42:10 -0800637
638 if (wait)
639 csd_lock_wait(csd);
Jens Axboe3d442232008-06-26 11:21:34 +0200640
641 put_cpu();
Ingo Molnar0b13fda2009-02-25 16:52:11 +0100642
H. Peter Anvinf73be6de2008-08-25 17:07:14 -0700643 return err;
Jens Axboe3d442232008-06-26 11:21:34 +0200644}
645EXPORT_SYMBOL(smp_call_function_single);
646
Frederic Weisbeckerd7877c02014-02-24 16:39:59 +0100647/**
Randy Dunlap49b3bd22021-08-10 15:50:51 -0700648 * smp_call_function_single_async() - Run an asynchronous function on a
Frederic Weisbeckerc46fff22014-02-24 16:40:02 +0100649 * specific CPU.
Frederic Weisbeckerd7877c02014-02-24 16:39:59 +0100650 * @cpu: The CPU to run on.
651 * @csd: Pre-allocated and setup data structure
Frederic Weisbeckerd7877c02014-02-24 16:39:59 +0100652 *
Frederic Weisbeckerc46fff22014-02-24 16:40:02 +0100653 * Like smp_call_function_single(), but the call is asynchonous and
654 * can thus be done from contexts with disabled interrupts.
655 *
656 * The caller passes his own pre-allocated data structure
657 * (ie: embedded in an object) and is responsible for synchronizing it
658 * such that the IPIs performed on the @csd are strictly serialized.
659 *
Peter Xu5a18cec2019-12-16 16:31:23 -0500660 * If the function is called with one csd which has not yet been
661 * processed by previous call to smp_call_function_single_async(), the
662 * function will return immediately with -EBUSY showing that the csd
663 * object is still in progress.
664 *
Frederic Weisbeckerc46fff22014-02-24 16:40:02 +0100665 * NOTE: Be careful, there is unfortunately no current debugging facility to
666 * validate the correctness of this serialization.
Randy Dunlap49b3bd22021-08-10 15:50:51 -0700667 *
668 * Return: %0 on success or negative errno value on error
Frederic Weisbeckerd7877c02014-02-24 16:39:59 +0100669 */
Arnd Bergmann1139aeb2021-05-05 23:12:42 +0200670int smp_call_function_single_async(int cpu, struct __call_single_data *csd)
Frederic Weisbeckerd7877c02014-02-24 16:39:59 +0100671{
672 int err = 0;
Frederic Weisbeckerd7877c02014-02-24 16:39:59 +0100673
Frederic Weisbeckerfce8ad12014-02-24 16:40:01 +0100674 preempt_disable();
Linus Torvalds80538712015-02-11 12:42:10 -0800675
Peter Zijlstra545b8c82020-06-15 11:29:31 +0200676 if (csd->node.u_flags & CSD_FLAG_LOCK) {
Peter Xu5a18cec2019-12-16 16:31:23 -0500677 err = -EBUSY;
678 goto out;
679 }
Linus Torvalds80538712015-02-11 12:42:10 -0800680
Peter Zijlstra545b8c82020-06-15 11:29:31 +0200681 csd->node.u_flags = CSD_FLAG_LOCK;
Linus Torvalds80538712015-02-11 12:42:10 -0800682 smp_wmb();
683
Peter Zijlstra4b44a212020-05-26 18:11:02 +0200684 err = generic_exec_single(cpu, csd);
Peter Xu5a18cec2019-12-16 16:31:23 -0500685
686out:
Frederic Weisbeckerfce8ad12014-02-24 16:40:01 +0100687 preempt_enable();
Frederic Weisbeckerd7877c02014-02-24 16:39:59 +0100688
689 return err;
690}
Frederic Weisbeckerc46fff22014-02-24 16:40:02 +0100691EXPORT_SYMBOL_GPL(smp_call_function_single_async);
Frederic Weisbeckerd7877c02014-02-24 16:39:59 +0100692
Rusty Russell2ea6dec2009-11-17 14:27:27 -0800693/*
694 * smp_call_function_any - Run a function on any of the given cpus
695 * @mask: The mask of cpus it can run on.
696 * @func: The function to run. This must be fast and non-blocking.
697 * @info: An arbitrary pointer to pass to the function.
698 * @wait: If true, wait until function has completed.
699 *
700 * Returns 0 on success, else a negative status code (if no cpus were online).
Rusty Russell2ea6dec2009-11-17 14:27:27 -0800701 *
702 * Selection preference:
703 * 1) current cpu if in @mask
704 * 2) any cpu of current node if in @mask
705 * 3) any other online cpu in @mask
706 */
707int smp_call_function_any(const struct cpumask *mask,
David Howells3a5f65df2010-10-27 17:28:36 +0100708 smp_call_func_t func, void *info, int wait)
Rusty Russell2ea6dec2009-11-17 14:27:27 -0800709{
710 unsigned int cpu;
711 const struct cpumask *nodemask;
712 int ret;
713
714 /* Try for same CPU (cheapest) */
715 cpu = get_cpu();
716 if (cpumask_test_cpu(cpu, mask))
717 goto call;
718
719 /* Try for same node. */
David Johnaf2422c2010-01-15 17:01:23 -0800720 nodemask = cpumask_of_node(cpu_to_node(cpu));
Rusty Russell2ea6dec2009-11-17 14:27:27 -0800721 for (cpu = cpumask_first_and(nodemask, mask); cpu < nr_cpu_ids;
722 cpu = cpumask_next_and(cpu, nodemask, mask)) {
723 if (cpu_online(cpu))
724 goto call;
725 }
726
727 /* Any online will do: smp_call_function_single handles nr_cpu_ids. */
728 cpu = cpumask_any_and(mask, cpu_online_mask);
729call:
730 ret = smp_call_function_single(cpu, func, info, wait);
731 put_cpu();
732 return ret;
733}
734EXPORT_SYMBOL_GPL(smp_call_function_any);
735
Nadav Amita32a4d82021-02-20 15:17:04 -0800736/*
737 * Flags to be used as scf_flags argument of smp_call_function_many_cond().
738 *
739 * %SCF_WAIT: Wait until function execution is completed
740 * %SCF_RUN_LOCAL: Run also locally if local cpu is set in cpumask
741 */
742#define SCF_WAIT (1U << 0)
743#define SCF_RUN_LOCAL (1U << 1)
744
Sebastian Andrzej Siewior67719ef2020-01-17 10:01:36 +0100745static void smp_call_function_many_cond(const struct cpumask *mask,
746 smp_call_func_t func, void *info,
Nadav Amita32a4d82021-02-20 15:17:04 -0800747 unsigned int scf_flags,
748 smp_cond_func_t cond_func)
Jens Axboe3d442232008-06-26 11:21:34 +0200749{
Nadav Amita32a4d82021-02-20 15:17:04 -0800750 int cpu, last_cpu, this_cpu = smp_processor_id();
Andrew Mortone1d12f32013-04-30 15:27:28 -0700751 struct call_function_data *cfd;
Nadav Amita32a4d82021-02-20 15:17:04 -0800752 bool wait = scf_flags & SCF_WAIT;
Leonardo Brasbf5a8c22023-06-15 03:59:47 -0300753 int nr_cpus = 0;
Nadav Amita32a4d82021-02-20 15:17:04 -0800754 bool run_remote = false;
755 bool run_local = false;
Nadav Amita32a4d82021-02-20 15:17:04 -0800756
757 lockdep_assert_preemption_disabled();
Jens Axboe3d442232008-06-26 11:21:34 +0200758
Suresh Siddha269c8612009-08-19 18:05:35 -0700759 /*
760 * Can deadlock when called with interrupts disabled.
761 * We allow cpu's that are not yet online though, as no one else can
762 * send smp call function interrupt to this cpu and as such deadlocks
763 * can't happen.
764 */
Nadav Amita32a4d82021-02-20 15:17:04 -0800765 if (cpu_online(this_cpu) && !oops_in_progress &&
766 !early_boot_irqs_disabled)
767 lockdep_assert_irqs_enabled();
Jens Axboe3d442232008-06-26 11:21:34 +0200768
Peter Zijlstra19dbdcb2019-07-18 11:20:09 +0200769 /*
770 * When @wait we can deadlock when we interrupt between llist_add() and
771 * arch_send_call_function_ipi*(); when !@wait we can deadlock due to
772 * csd_lock() on because the interrupt context uses the same csd
773 * storage.
774 */
775 WARN_ON_ONCE(!in_task());
776
Nadav Amita32a4d82021-02-20 15:17:04 -0800777 /* Check if we need local execution. */
778 if ((scf_flags & SCF_RUN_LOCAL) && cpumask_test_cpu(this_cpu, mask))
779 run_local = true;
780
781 /* Check if we need remote execution, i.e., any CPU excluding this one. */
Rusty Russell54b11e62008-12-30 09:05:16 +1030782 cpu = cpumask_first_and(mask, cpu_online_mask);
Ingo Molnar0b13fda2009-02-25 16:52:11 +0100783 if (cpu == this_cpu)
Rusty Russell54b11e62008-12-30 09:05:16 +1030784 cpu = cpumask_next_and(cpu, mask, cpu_online_mask);
Nadav Amita32a4d82021-02-20 15:17:04 -0800785 if (cpu < nr_cpu_ids)
786 run_remote = true;
Ingo Molnar0b13fda2009-02-25 16:52:11 +0100787
Nadav Amita32a4d82021-02-20 15:17:04 -0800788 if (run_remote) {
789 cfd = this_cpu_ptr(&cfd_data);
790 cpumask_and(cfd->cpumask, mask, cpu_online_mask);
791 __cpumask_clear_cpu(this_cpu, cfd->cpumask);
Jens Axboe3d442232008-06-26 11:21:34 +0200792
Nadav Amita32a4d82021-02-20 15:17:04 -0800793 cpumask_clear(cfd->cpumask_ipi);
794 for_each_cpu(cpu, cfd->cpumask) {
Paul E. McKenney6366d062023-03-20 17:55:15 -0700795 call_single_data_t *csd = per_cpu_ptr(cfd->csd, cpu);
Rusty Russell54b11e62008-12-30 09:05:16 +1030796
Peter Zijlstra5c312492023-03-22 14:58:36 +0100797 if (cond_func && !cond_func(cpu, info)) {
798 __cpumask_clear_cpu(cpu, cfd->cpumask);
Nadav Amita32a4d82021-02-20 15:17:04 -0800799 continue;
Peter Zijlstra5c312492023-03-22 14:58:36 +0100800 }
Jens Axboe3d442232008-06-26 11:21:34 +0200801
Nadav Amita32a4d82021-02-20 15:17:04 -0800802 csd_lock(csd);
803 if (wait)
804 csd->node.u_flags |= CSD_TYPE_SYNC;
805 csd->func = func;
806 csd->info = info;
Paul E. McKenney35feb602020-06-30 13:22:54 -0700807#ifdef CONFIG_CSD_LOCK_WAIT_DEBUG
Nadav Amita32a4d82021-02-20 15:17:04 -0800808 csd->node.src = smp_processor_id();
809 csd->node.dst = cpu;
Paul E. McKenneye48c15b2020-06-29 17:21:32 -0700810#endif
Leonardo Brasbf5a8c22023-06-15 03:59:47 -0300811 trace_csd_queue_cpu(cpu, _RET_IP_, func, csd);
812
Nadav Amita32a4d82021-02-20 15:17:04 -0800813 if (llist_add(&csd->node.llist, &per_cpu(call_single_queue, cpu))) {
814 __cpumask_set_cpu(cpu, cfd->cpumask_ipi);
815 nr_cpus++;
816 last_cpu = cpu;
817 }
818 }
819
820 /*
821 * Choose the most efficient way to send an IPI. Note that the
822 * number of CPUs might be zero due to concurrent changes to the
823 * provided mask.
824 */
825 if (nr_cpus == 1)
Peter Zijlstra5c312492023-03-22 14:58:36 +0100826 send_call_function_single_ipi(last_cpu);
Nadav Amita32a4d82021-02-20 15:17:04 -0800827 else if (likely(nr_cpus > 1))
Peter Zijlstra5c312492023-03-22 14:58:36 +0100828 send_call_function_ipi_mask(cfd->cpumask_ipi);
Shaohua Li9a46ad62013-02-21 16:43:03 -0800829 }
Suresh Siddha561920a02008-10-30 18:28:41 +0100830
Nadav Amita32a4d82021-02-20 15:17:04 -0800831 if (run_local && (!cond_func || cond_func(this_cpu, info))) {
832 unsigned long flags;
Jens Axboe3d442232008-06-26 11:21:34 +0200833
Nadav Amita32a4d82021-02-20 15:17:04 -0800834 local_irq_save(flags);
Leonardo Bras949fa3f2023-06-15 03:59:45 -0300835 csd_do_func(func, info, NULL);
Nadav Amita32a4d82021-02-20 15:17:04 -0800836 local_irq_restore(flags);
837 }
838
839 if (run_remote && wait) {
Andrew Mortone1d12f32013-04-30 15:27:28 -0700840 for_each_cpu(cpu, cfd->cpumask) {
Ying Huang966a9672017-08-08 12:30:00 +0800841 call_single_data_t *csd;
Andrew Mortone1d12f32013-04-30 15:27:28 -0700842
Paul E. McKenney6366d062023-03-20 17:55:15 -0700843 csd = per_cpu_ptr(cfd->csd, cpu);
Shaohua Li9a46ad62013-02-21 16:43:03 -0800844 csd_lock_wait(csd);
845 }
846 }
Jens Axboe3d442232008-06-26 11:21:34 +0200847}
Sebastian Andrzej Siewior67719ef2020-01-17 10:01:36 +0100848
849/**
Nadav Amita32a4d82021-02-20 15:17:04 -0800850 * smp_call_function_many(): Run a function on a set of CPUs.
Sebastian Andrzej Siewior67719ef2020-01-17 10:01:36 +0100851 * @mask: The set of cpus to run on (only runs on online subset).
852 * @func: The function to run. This must be fast and non-blocking.
853 * @info: An arbitrary pointer to pass to the function.
Randy Dunlap49b3bd22021-08-10 15:50:51 -0700854 * @wait: Bitmask that controls the operation. If %SCF_WAIT is set, wait
Nadav Amita32a4d82021-02-20 15:17:04 -0800855 * (atomically) until function has completed on other CPUs. If
856 * %SCF_RUN_LOCAL is set, the function will also be run locally
857 * if the local CPU is set in the @cpumask.
Sebastian Andrzej Siewior67719ef2020-01-17 10:01:36 +0100858 *
859 * If @wait is true, then returns once @func has returned.
860 *
861 * You must not call this function with disabled interrupts or from a
862 * hardware interrupt handler or from a bottom half handler. Preemption
863 * must be disabled when calling this function.
864 */
865void smp_call_function_many(const struct cpumask *mask,
866 smp_call_func_t func, void *info, bool wait)
867{
Nadav Amita32a4d82021-02-20 15:17:04 -0800868 smp_call_function_many_cond(mask, func, info, wait * SCF_WAIT, NULL);
Sebastian Andrzej Siewior67719ef2020-01-17 10:01:36 +0100869}
Rusty Russell54b11e62008-12-30 09:05:16 +1030870EXPORT_SYMBOL(smp_call_function_many);
Jens Axboe3d442232008-06-26 11:21:34 +0200871
872/**
873 * smp_call_function(): Run a function on all other CPUs.
874 * @func: The function to run. This must be fast and non-blocking.
875 * @info: An arbitrary pointer to pass to the function.
Ingo Molnar0b13fda2009-02-25 16:52:11 +0100876 * @wait: If true, wait (atomically) until function has completed
877 * on other CPUs.
Jens Axboe3d442232008-06-26 11:21:34 +0200878 *
Rusty Russell54b11e62008-12-30 09:05:16 +1030879 * Returns 0.
Jens Axboe3d442232008-06-26 11:21:34 +0200880 *
881 * If @wait is true, then returns once @func has returned; otherwise
Sheng Yang72f279b2009-10-22 19:19:34 +0800882 * it returns just before the target cpu calls @func.
Jens Axboe3d442232008-06-26 11:21:34 +0200883 *
884 * You must not call this function with disabled interrupts or from a
885 * hardware interrupt handler or from a bottom half handler.
886 */
Nadav Amitcaa75932019-06-12 23:48:05 -0700887void smp_call_function(smp_call_func_t func, void *info, int wait)
Jens Axboe3d442232008-06-26 11:21:34 +0200888{
Jens Axboe3d442232008-06-26 11:21:34 +0200889 preempt_disable();
Rusty Russell54b11e62008-12-30 09:05:16 +1030890 smp_call_function_many(cpu_online_mask, func, info, wait);
Jens Axboe3d442232008-06-26 11:21:34 +0200891 preempt_enable();
Jens Axboe3d442232008-06-26 11:21:34 +0200892}
893EXPORT_SYMBOL(smp_call_function);
Amerigo Wang351f8f82011-01-12 16:59:39 -0800894
Amerigo Wang34db18a02011-03-22 16:34:06 -0700895/* Setup configured maximum number of CPUs to activate */
896unsigned int setup_max_cpus = NR_CPUS;
897EXPORT_SYMBOL(setup_max_cpus);
898
899
900/*
901 * Setup routine for controlling SMP activation
902 *
903 * Command-line option of "nosmp" or "maxcpus=0" will disable SMP
904 * activation entirely (the MPS table probe still happens, though).
905 *
906 * Command-line option of "maxcpus=<NUM>", where <NUM> is an integer
907 * greater than 0, limits the maximum number of CPUs activated in
908 * SMP mode to <NUM>.
909 */
910
Thomas Gleixnerba831b72023-05-12 23:07:00 +0200911void __weak __init arch_disable_smp_support(void) { }
Amerigo Wang34db18a02011-03-22 16:34:06 -0700912
913static int __init nosmp(char *str)
914{
915 setup_max_cpus = 0;
916 arch_disable_smp_support();
917
918 return 0;
919}
920
921early_param("nosmp", nosmp);
922
923/* this is hard limit */
924static int __init nrcpus(char *str)
925{
926 int nr_cpus;
927
Muchun Song58934352020-07-16 15:04:57 +0800928 if (get_option(&str, &nr_cpus) && nr_cpus > 0 && nr_cpus < nr_cpu_ids)
Yury Norov38bef8e2022-09-05 16:08:17 -0700929 set_nr_cpu_ids(nr_cpus);
Amerigo Wang34db18a02011-03-22 16:34:06 -0700930
931 return 0;
932}
933
934early_param("nr_cpus", nrcpus);
935
936static int __init maxcpus(char *str)
937{
938 get_option(&str, &setup_max_cpus);
939 if (setup_max_cpus == 0)
940 arch_disable_smp_support();
941
942 return 0;
943}
944
945early_param("maxcpus", maxcpus);
946
Yury Norov6f9c07b2022-09-05 16:08:20 -0700947#if (NR_CPUS > 1) && !defined(CONFIG_FORCE_NR_CPUS)
Amerigo Wang34db18a02011-03-22 16:34:06 -0700948/* Setup number of possible processor ids */
Alexey Dobriyan9b130ad2017-09-08 16:14:18 -0700949unsigned int nr_cpu_ids __read_mostly = NR_CPUS;
Amerigo Wang34db18a02011-03-22 16:34:06 -0700950EXPORT_SYMBOL(nr_cpu_ids);
Yury Norov53fc1902022-09-05 16:08:16 -0700951#endif
Amerigo Wang34db18a02011-03-22 16:34:06 -0700952
953/* An arch may set nr_cpu_ids earlier if needed, so this would be redundant */
954void __init setup_nr_cpu_ids(void)
955{
Yury Norov38bef8e2022-09-05 16:08:17 -0700956 set_nr_cpu_ids(find_last_bit(cpumask_bits(cpu_possible_mask), NR_CPUS) + 1);
Amerigo Wang34db18a02011-03-22 16:34:06 -0700957}
958
959/* Called by boot processor to activate the rest. */
960void __init smp_init(void)
961{
Michael Ellerman92b23272016-10-26 16:37:54 +1100962 int num_nodes, num_cpus;
Amerigo Wang34db18a02011-03-22 16:34:06 -0700963
Suresh Siddha3bb5d2e2012-04-20 17:08:50 -0700964 idle_threads_init();
Thomas Gleixner4cb28ce2016-02-26 18:43:38 +0000965 cpuhp_threads_init();
Suresh Siddha3bb5d2e2012-04-20 17:08:50 -0700966
Michael Ellerman51111dc2016-10-26 16:37:55 +1100967 pr_info("Bringing up secondary CPUs ...\n");
968
Qais Yousefb99a2652020-03-23 13:51:09 +0000969 bringup_nonboot_cpus(setup_max_cpus);
Amerigo Wang34db18a02011-03-22 16:34:06 -0700970
Michael Ellerman92b23272016-10-26 16:37:54 +1100971 num_nodes = num_online_nodes();
972 num_cpus = num_online_cpus();
973 pr_info("Brought up %d node%s, %d CPU%s\n",
974 num_nodes, (num_nodes > 1 ? "s" : ""),
975 num_cpus, (num_cpus > 1 ? "s" : ""));
976
Amerigo Wang34db18a02011-03-22 16:34:06 -0700977 /* Any cleanup work */
Amerigo Wang34db18a02011-03-22 16:34:06 -0700978 smp_cpus_done(setup_max_cpus);
979}
980
Amerigo Wang351f8f82011-01-12 16:59:39 -0800981/*
Gilad Ben-Yossefb3a7e982012-03-28 14:42:43 -0700982 * on_each_cpu_cond(): Call a function on each processor for which
983 * the supplied function cond_func returns true, optionally waiting
984 * for all the required CPUs to finish. This may include the local
985 * processor.
986 * @cond_func: A callback function that is passed a cpu id and
Randy Dunlap7b7b8a22020-10-15 20:10:28 -0700987 * the info parameter. The function is called
Gilad Ben-Yossefb3a7e982012-03-28 14:42:43 -0700988 * with preemption disabled. The function should
989 * return a blooean value indicating whether to IPI
990 * the specified CPU.
991 * @func: The function to run on all applicable CPUs.
992 * This must be fast and non-blocking.
993 * @info: An arbitrary pointer to pass to both functions.
994 * @wait: If true, wait (atomically) until function has
995 * completed on other CPUs.
Gilad Ben-Yossefb3a7e982012-03-28 14:42:43 -0700996 *
997 * Preemption is disabled to protect against CPUs going offline but not online.
998 * CPUs going online during the call will not be seen or sent an IPI.
999 *
1000 * You must not call this function with disabled interrupts or
1001 * from a hardware interrupt handler or from a bottom half handler.
1002 */
Sebastian Andrzej Siewior5671d812020-01-17 10:01:35 +01001003void on_each_cpu_cond_mask(smp_cond_func_t cond_func, smp_call_func_t func,
Sebastian Andrzej Siewiorcb923152020-01-17 10:01:37 +01001004 void *info, bool wait, const struct cpumask *mask)
Gilad Ben-Yossefb3a7e982012-03-28 14:42:43 -07001005{
Nadav Amita32a4d82021-02-20 15:17:04 -08001006 unsigned int scf_flags = SCF_RUN_LOCAL;
Gilad Ben-Yossefb3a7e982012-03-28 14:42:43 -07001007
Nadav Amita32a4d82021-02-20 15:17:04 -08001008 if (wait)
1009 scf_flags |= SCF_WAIT;
Gilad Ben-Yossefb3a7e982012-03-28 14:42:43 -07001010
Nadav Amita32a4d82021-02-20 15:17:04 -08001011 preempt_disable();
1012 smp_call_function_many_cond(mask, func, info, scf_flags, cond_func);
1013 preempt_enable();
Gilad Ben-Yossefb3a7e982012-03-28 14:42:43 -07001014}
Rik van Riel7d49b282018-09-25 23:58:41 -04001015EXPORT_SYMBOL(on_each_cpu_cond_mask);
1016
Thomas Gleixnerf37f4352012-05-07 17:59:48 +00001017static void do_nothing(void *unused)
1018{
1019}
1020
1021/**
1022 * kick_all_cpus_sync - Force all cpus out of idle
1023 *
1024 * Used to synchronize the update of pm_idle function pointer. It's
1025 * called after the pointer is updated and returns after the dummy
1026 * callback function has been executed on all cpus. The execution of
1027 * the function can only happen on the remote cpus after they have
1028 * left the idle function which had been called via pm_idle function
1029 * pointer. So it's guaranteed that nothing uses the previous pointer
1030 * anymore.
1031 */
1032void kick_all_cpus_sync(void)
1033{
1034 /* Make sure the change is visible before we kick the cpus */
1035 smp_mb();
1036 smp_call_function(do_nothing, NULL, 1);
1037}
1038EXPORT_SYMBOL_GPL(kick_all_cpus_sync);
Chuansheng Liuc6f44592014-09-04 15:17:54 +08001039
1040/**
1041 * wake_up_all_idle_cpus - break all cpus out of idle
1042 * wake_up_all_idle_cpus try to break all cpus which is in idle state even
1043 * including idle polling cpus, for non-idle cpus, we will do nothing
1044 * for them.
1045 */
1046void wake_up_all_idle_cpus(void)
1047{
1048 int cpu;
1049
Peter Zijlstra96611c22021-10-18 16:41:05 +02001050 for_each_possible_cpu(cpu) {
1051 preempt_disable();
1052 if (cpu != smp_processor_id() && cpu_online(cpu))
1053 wake_up_if_idle(cpu);
1054 preempt_enable();
Chuansheng Liuc6f44592014-09-04 15:17:54 +08001055 }
Chuansheng Liuc6f44592014-09-04 15:17:54 +08001056}
1057EXPORT_SYMBOL_GPL(wake_up_all_idle_cpus);
Juergen Grossdf8ce9d2016-08-29 08:48:44 +02001058
1059/**
Randy Dunlap49b3bd22021-08-10 15:50:51 -07001060 * struct smp_call_on_cpu_struct - Call a function on a specific CPU
1061 * @work: &work_struct
1062 * @done: &completion to signal
1063 * @func: function to call
1064 * @data: function's data argument
1065 * @ret: return value from @func
1066 * @cpu: target CPU (%-1 for any CPU)
Juergen Grossdf8ce9d2016-08-29 08:48:44 +02001067 *
1068 * Used to call a function on a specific cpu and wait for it to return.
1069 * Optionally make sure the call is done on a specified physical cpu via vcpu
1070 * pinning in order to support virtualized environments.
1071 */
1072struct smp_call_on_cpu_struct {
1073 struct work_struct work;
1074 struct completion done;
1075 int (*func)(void *);
1076 void *data;
1077 int ret;
1078 int cpu;
1079};
1080
1081static void smp_call_on_cpu_callback(struct work_struct *work)
1082{
1083 struct smp_call_on_cpu_struct *sscs;
1084
1085 sscs = container_of(work, struct smp_call_on_cpu_struct, work);
1086 if (sscs->cpu >= 0)
1087 hypervisor_pin_vcpu(sscs->cpu);
1088 sscs->ret = sscs->func(sscs->data);
1089 if (sscs->cpu >= 0)
1090 hypervisor_pin_vcpu(-1);
1091
1092 complete(&sscs->done);
1093}
1094
1095int smp_call_on_cpu(unsigned int cpu, int (*func)(void *), void *par, bool phys)
1096{
1097 struct smp_call_on_cpu_struct sscs = {
Juergen Grossdf8ce9d2016-08-29 08:48:44 +02001098 .done = COMPLETION_INITIALIZER_ONSTACK(sscs.done),
1099 .func = func,
1100 .data = par,
1101 .cpu = phys ? cpu : -1,
1102 };
1103
Peter Zijlstra8db54942016-09-11 10:36:26 +02001104 INIT_WORK_ONSTACK(&sscs.work, smp_call_on_cpu_callback);
1105
Juergen Grossdf8ce9d2016-08-29 08:48:44 +02001106 if (cpu >= nr_cpu_ids || !cpu_online(cpu))
1107 return -ENXIO;
1108
1109 queue_work_on(cpu, system_wq, &sscs.work);
1110 wait_for_completion(&sscs.done);
1111
1112 return sscs.ret;
1113}
1114EXPORT_SYMBOL_GPL(smp_call_on_cpu);