diff options
-rw-r--r-- | block/blk-mq.c | 2 | ||||
-rw-r--r-- | block/blk-softirq.c | 2 | ||||
-rw-r--r-- | drivers/cpuidle/coupled.c | 2 | ||||
-rw-r--r-- | include/linux/smp.h | 2 | ||||
-rw-r--r-- | kernel/sched/core.c | 2 | ||||
-rw-r--r-- | kernel/smp.c | 19 | ||||
-rw-r--r-- | kernel/up.c | 4 | ||||
-rw-r--r-- | net/core/dev.c | 2 |
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 | ||
53 | int __smp_call_function_single(int cpu, struct call_single_data *csd); | 53 | int 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, | |||
238 | EXPORT_SYMBOL(smp_call_function_single); | 238 | EXPORT_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 | */ |
249 | int __smp_call_function_single(int cpu, struct call_single_data *csd) | 256 | int 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 | } |
259 | EXPORT_SYMBOL_GPL(__smp_call_function_single); | 266 | EXPORT_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 | } |
23 | EXPORT_SYMBOL(smp_call_function_single); | 23 | EXPORT_SYMBOL(smp_call_function_single); |
24 | 24 | ||
25 | int __smp_call_function_single(int cpu, struct call_single_data *csd) | 25 | int 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 | } |
34 | EXPORT_SYMBOL(__smp_call_function_single); | 34 | EXPORT_SYMBOL(smp_call_function_single_async); |
35 | 35 | ||
36 | int on_each_cpu(smp_call_func_t func, void *info, int wait) | 36 | int 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 | } |