aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederic Weisbecker <fweisbec@gmail.com>2014-02-24 10:40:02 -0500
committerJens Axboe <axboe@fb.com>2014-02-24 17:47:15 -0500
commitc46fff2a3b29794b35d717b5680a27f31a6a6bc0 (patch)
tree753afca11aeb7dd9b4f70b02a4905f5687e26af3
parentfce8ad1568c57e7f334018dec4fa1744c926c135 (diff)
smp: Rename __smp_call_function_single() to smp_call_function_single_async()
The name __smp_call_function_single() doesn't tell much about the properties of this function, especially when compared to smp_call_function_single(). The comments above the implementation are also misleading. The main point of this function is actually not to be able to embed the csd in an object. This is actually a requirement that result from the purpose of this function which is to raise an IPI asynchronously. As such it can be called with interrupts disabled. And this feature comes at the cost of the caller who then needs to serialize the IPIs on this csd. Lets rename the function and enhance the comments so that they reflect these properties. Suggested-by: Christoph Hellwig <hch@infradead.org> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Christoph Hellwig <hch@infradead.org> Cc: Ingo Molnar <mingo@kernel.org> Cc: Jan Kara <jack@suse.cz> Cc: Jens Axboe <axboe@fb.com> Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Signed-off-by: Jens Axboe <axboe@fb.com>
-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 }