aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--block/blk-mq.c2
-rw-r--r--block/blk-softirq.c2
-rw-r--r--drivers/cpuidle/coupled.c2
-rw-r--r--include/linux/smp.h2
-rw-r--r--kernel/sched/core.c2
-rw-r--r--kernel/smp.c19
-rw-r--r--kernel/up.c4
-rw-r--r--net/core/dev.c2
8 files changed, 21 insertions, 14 deletions
diff --git a/block/blk-mq.c b/block/blk-mq.c
index 62154edf1489..6468a715a0e4 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -353,7 +353,7 @@ void __blk_mq_complete_request(struct request *rq)
353 rq->csd.func = __blk_mq_complete_request_remote; 353 rq->csd.func = __blk_mq_complete_request_remote;
354 rq->csd.info = rq; 354 rq->csd.info = rq;
355 rq->csd.flags = 0; 355 rq->csd.flags = 0;
356 __smp_call_function_single(ctx->cpu, &rq->csd); 356 smp_call_function_single_async(ctx->cpu, &rq->csd);
357 } else { 357 } else {
358 rq->q->softirq_done_fn(rq); 358 rq->q->softirq_done_fn(rq);
359 } 359 }
diff --git a/block/blk-softirq.c b/block/blk-softirq.c
index 6345b7ebd0df..ebd6b6f1bdeb 100644
--- a/block/blk-softirq.c
+++ b/block/blk-softirq.c
@@ -70,7 +70,7 @@ static int raise_blk_irq(int cpu, struct request *rq)
70 data->info = rq; 70 data->info = rq;
71 data->flags = 0; 71 data->flags = 0;
72 72
73 __smp_call_function_single(cpu, data); 73 smp_call_function_single_async(cpu, data);
74 return 0; 74 return 0;
75 } 75 }
76 76
diff --git a/drivers/cpuidle/coupled.c b/drivers/cpuidle/coupled.c
index 04115947accc..cb6654bfad77 100644
--- a/drivers/cpuidle/coupled.c
+++ b/drivers/cpuidle/coupled.c
@@ -323,7 +323,7 @@ static void cpuidle_coupled_poke(int cpu)
323 struct call_single_data *csd = &per_cpu(cpuidle_coupled_poke_cb, cpu); 323 struct call_single_data *csd = &per_cpu(cpuidle_coupled_poke_cb, cpu);
324 324
325 if (!cpumask_test_and_set_cpu(cpu, &cpuidle_coupled_poke_pending)) 325 if (!cpumask_test_and_set_cpu(cpu, &cpuidle_coupled_poke_pending))
326 __smp_call_function_single(cpu, csd); 326 smp_call_function_single_async(cpu, csd);
327} 327}
328 328
329/** 329/**
diff --git a/include/linux/smp.h b/include/linux/smp.h
index b410a1f23281..633f5edd7470 100644
--- a/include/linux/smp.h
+++ b/include/linux/smp.h
@@ -50,7 +50,7 @@ void on_each_cpu_cond(bool (*cond_func)(int cpu, void *info),
50 smp_call_func_t func, void *info, bool wait, 50 smp_call_func_t func, void *info, bool wait,
51 gfp_t gfp_flags); 51 gfp_t gfp_flags);
52 52
53int __smp_call_function_single(int cpu, struct call_single_data *csd); 53int smp_call_function_single_async(int cpu, struct call_single_data *csd);
54 54
55#ifdef CONFIG_SMP 55#ifdef CONFIG_SMP
56 56
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index eba3d84765f3..0cca04a53de0 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -432,7 +432,7 @@ void hrtick_start(struct rq *rq, u64 delay)
432 if (rq == this_rq()) { 432 if (rq == this_rq()) {
433 __hrtick_restart(rq); 433 __hrtick_restart(rq);
434 } else if (!rq->hrtick_csd_pending) { 434 } else if (!rq->hrtick_csd_pending) {
435 __smp_call_function_single(cpu_of(rq), &rq->hrtick_csd); 435 smp_call_function_single_async(cpu_of(rq), &rq->hrtick_csd);
436 rq->hrtick_csd_pending = 1; 436 rq->hrtick_csd_pending = 1;
437 } 437 }
438} 438}
diff --git a/kernel/smp.c b/kernel/smp.c
index b76763189752..06d574e42c72 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -238,15 +238,22 @@ int smp_call_function_single(int cpu, smp_call_func_t func, void *info,
238EXPORT_SYMBOL(smp_call_function_single); 238EXPORT_SYMBOL(smp_call_function_single);
239 239
240/** 240/**
241 * __smp_call_function_single(): Run a function on a specific CPU 241 * smp_call_function_single_async(): Run an asynchronous function on a
242 * specific CPU.
242 * @cpu: The CPU to run on. 243 * @cpu: The CPU to run on.
243 * @csd: Pre-allocated and setup data structure 244 * @csd: Pre-allocated and setup data structure
244 * 245 *
245 * Like smp_call_function_single(), but allow caller to pass in a 246 * Like smp_call_function_single(), but the call is asynchonous and
246 * pre-allocated data structure. Useful for embedding @data inside 247 * can thus be done from contexts with disabled interrupts.
247 * other structures, for instance. 248 *
249 * The caller passes his own pre-allocated data structure
250 * (ie: embedded in an object) and is responsible for synchronizing it
251 * such that the IPIs performed on the @csd are strictly serialized.
252 *
253 * NOTE: Be careful, there is unfortunately no current debugging facility to
254 * validate the correctness of this serialization.
248 */ 255 */
249int __smp_call_function_single(int cpu, struct call_single_data *csd) 256int smp_call_function_single_async(int cpu, struct call_single_data *csd)
250{ 257{
251 int err = 0; 258 int err = 0;
252 259
@@ -256,7 +263,7 @@ int __smp_call_function_single(int cpu, struct call_single_data *csd)
256 263
257 return err; 264 return err;
258} 265}
259EXPORT_SYMBOL_GPL(__smp_call_function_single); 266EXPORT_SYMBOL_GPL(smp_call_function_single_async);
260 267
261/* 268/*
262 * smp_call_function_any - Run a function on any of the given cpus 269 * smp_call_function_any - Run a function on any of the given cpus
diff --git a/kernel/up.c b/kernel/up.c
index 4e199d4cef8e..1760bf3d1463 100644
--- a/kernel/up.c
+++ b/kernel/up.c
@@ -22,7 +22,7 @@ int smp_call_function_single(int cpu, void (*func) (void *info), void *info,
22} 22}
23EXPORT_SYMBOL(smp_call_function_single); 23EXPORT_SYMBOL(smp_call_function_single);
24 24
25int __smp_call_function_single(int cpu, struct call_single_data *csd) 25int smp_call_function_single_async(int cpu, struct call_single_data *csd)
26{ 26{
27 unsigned long flags; 27 unsigned long flags;
28 28
@@ -31,7 +31,7 @@ int __smp_call_function_single(int cpu, struct call_single_data *csd)
31 local_irq_restore(flags); 31 local_irq_restore(flags);
32 return 0; 32 return 0;
33} 33}
34EXPORT_SYMBOL(__smp_call_function_single); 34EXPORT_SYMBOL(smp_call_function_single_async);
35 35
36int on_each_cpu(smp_call_func_t func, void *info, int wait) 36int on_each_cpu(smp_call_func_t func, void *info, int wait)
37{ 37{
diff --git a/net/core/dev.c b/net/core/dev.c
index d1298128bff4..ac7a2abb7f1a 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -4128,7 +4128,7 @@ static void net_rps_action_and_irq_enable(struct softnet_data *sd)
4128 struct softnet_data *next = remsd->rps_ipi_next; 4128 struct softnet_data *next = remsd->rps_ipi_next;
4129 4129
4130 if (cpu_online(remsd->cpu)) 4130 if (cpu_online(remsd->cpu))
4131 __smp_call_function_single(remsd->cpu, 4131 smp_call_function_single_async(remsd->cpu,
4132 &remsd->csd); 4132 &remsd->csd);
4133 remsd = next; 4133 remsd = next;
4134 } 4134 }