aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
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 /kernel
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>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/sched/core.c2
-rw-r--r--kernel/smp.c19
-rw-r--r--kernel/up.c4
3 files changed, 16 insertions, 9 deletions
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{