From: Frederic Weisbecker Date: Mon, 24 Feb 2014 15:39:59 +0000 (+0100) Subject: smp: Move __smp_call_function_single() below its safe version X-Git-Tag: firefly_0821_release~176^2~4189^2~13 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=d7877c03f1b62de06f9c00417952f39f56c1ab00;p=firefly-linux-kernel-4.4.55.git smp: Move __smp_call_function_single() below its safe version Move this function closer to __smp_call_function_single(). These functions have very similar behavior and should be displayed in the same block for clarity. Reviewed-by: Jan Kara Cc: Andrew Morton Cc: Christoph Hellwig Cc: Ingo Molnar Cc: Jan Kara Cc: Jens Axboe Signed-off-by: Frederic Weisbecker Signed-off-by: Jens Axboe --- diff --git a/kernel/smp.c b/kernel/smp.c index 64bb0d48e96f..fa04ab938e52 100644 --- a/kernel/smp.c +++ b/kernel/smp.c @@ -237,6 +237,38 @@ int smp_call_function_single(int cpu, smp_call_func_t func, void *info, } EXPORT_SYMBOL(smp_call_function_single); +/** + * __smp_call_function_single(): Run a function on a specific CPU + * @cpu: The CPU to run on. + * @csd: Pre-allocated and setup data structure + * @wait: If true, wait until function has completed on specified CPU. + * + * Like smp_call_function_single(), but allow caller to pass in a + * pre-allocated data structure. Useful for embedding @data inside + * other structures, for instance. + */ +int __smp_call_function_single(int cpu, struct call_single_data *csd, int wait) +{ + int err = 0; + int this_cpu; + + this_cpu = get_cpu(); + /* + * Can deadlock when called with interrupts disabled. + * We allow cpu's that are not yet online though, as no one else can + * send smp call function interrupt to this cpu and as such deadlocks + * can't happen. + */ + WARN_ON_ONCE(cpu_online(this_cpu) && wait && irqs_disabled() + && !oops_in_progress); + + err = generic_exec_single(cpu, csd, csd->func, csd->info, wait); + put_cpu(); + + return err; +} +EXPORT_SYMBOL_GPL(__smp_call_function_single); + /* * smp_call_function_any - Run a function on any of the given cpus * @mask: The mask of cpus it can run on. @@ -280,38 +312,6 @@ call: } EXPORT_SYMBOL_GPL(smp_call_function_any); -/** - * __smp_call_function_single(): Run a function on a specific CPU - * @cpu: The CPU to run on. - * @csd: Pre-allocated and setup data structure - * @wait: If true, wait until function has completed on specified CPU. - * - * Like smp_call_function_single(), but allow caller to pass in a - * pre-allocated data structure. Useful for embedding @data inside - * other structures, for instance. - */ -int __smp_call_function_single(int cpu, struct call_single_data *csd, int wait) -{ - int err = 0; - int this_cpu; - - this_cpu = get_cpu(); - /* - * Can deadlock when called with interrupts disabled. - * We allow cpu's that are not yet online though, as no one else can - * send smp call function interrupt to this cpu and as such deadlocks - * can't happen. - */ - WARN_ON_ONCE(cpu_online(this_cpu) && wait && irqs_disabled() - && !oops_in_progress); - - err = generic_exec_single(cpu, csd, csd->func, csd->info, wait); - put_cpu(); - - return err; -} -EXPORT_SYMBOL_GPL(__smp_call_function_single); - /** * smp_call_function_many(): Run a function on a set of other CPUs. * @mask: The set of cpus to run on (only runs on online subset).