smp_call_func_t func, void *info, bool wait,
gfp_t gfp_flags);
-void __smp_call_function_single(int cpuid, struct call_single_data *data,
- int wait);
+int __smp_call_function_single(int cpu, struct call_single_data *csd, int wait);
#ifdef CONFIG_SMP
/**
* __smp_call_function_single(): Run a function on a specific CPU
* @cpu: The CPU to run on.
- * @data: Pre-allocated and setup data structure
+ * @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.
*/
-void __smp_call_function_single(int cpu, struct call_single_data *csd,
- int wait)
+int __smp_call_function_single(int cpu, struct call_single_data *csd, int wait)
{
unsigned int this_cpu;
unsigned long flags;
+ int err = 0;
this_cpu = get_cpu();
/*
local_irq_save(flags);
csd->func(csd->info);
local_irq_restore(flags);
- } else {
+ } else if ((unsigned)cpu < nr_cpu_ids && cpu_online(cpu)) {
csd_lock(csd);
generic_exec_single(cpu, csd, wait);
+ } else {
+ err = -ENXIO; /* CPU not online */
}
put_cpu();
+ return err;
}
EXPORT_SYMBOL_GPL(__smp_call_function_single);
}
EXPORT_SYMBOL(smp_call_function_single);
-void __smp_call_function_single(int cpu, struct call_single_data *csd,
- int wait)
+int __smp_call_function_single(int cpu, struct call_single_data *csd,
+ int wait)
{
unsigned long flags;
local_irq_save(flags);
csd->func(csd->info);
local_irq_restore(flags);
+ return 0;
}
EXPORT_SYMBOL(__smp_call_function_single);