|
@@ -4735,6 +4735,29 @@ long work_on_cpu(int cpu, long (*fn)(void *), void *arg)
|
|
return wfc.ret;
|
|
return wfc.ret;
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(work_on_cpu);
|
|
EXPORT_SYMBOL_GPL(work_on_cpu);
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * work_on_cpu_safe - run a function in thread context on a particular cpu
|
|
|
|
+ * @cpu: the cpu to run on
|
|
|
|
+ * @fn: the function to run
|
|
|
|
+ * @arg: the function argument
|
|
|
|
+ *
|
|
|
|
+ * Disables CPU hotplug and calls work_on_cpu(). The caller must not hold
|
|
|
|
+ * any locks which would prevent @fn from completing.
|
|
|
|
+ *
|
|
|
|
+ * Return: The value @fn returns.
|
|
|
|
+ */
|
|
|
|
+long work_on_cpu_safe(int cpu, long (*fn)(void *), void *arg)
|
|
|
|
+{
|
|
|
|
+ long ret = -ENODEV;
|
|
|
|
+
|
|
|
|
+ get_online_cpus();
|
|
|
|
+ if (cpu_online(cpu))
|
|
|
|
+ ret = work_on_cpu(cpu, fn, arg);
|
|
|
|
+ put_online_cpus();
|
|
|
|
+ return ret;
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL_GPL(work_on_cpu_safe);
|
|
#endif /* CONFIG_SMP */
|
|
#endif /* CONFIG_SMP */
|
|
|
|
|
|
#ifdef CONFIG_FREEZER
|
|
#ifdef CONFIG_FREEZER
|