Re: [PATCH v1 3/6] workqueue: introduce schedule_on_each_cpu_cond
From: Srivatsa S. Bhat <hidden>
Date: 2012-05-04 05:10:57
Also in:
lkml
On 05/03/2012 08:25 PM, Gilad Ben-Yossef wrote:
Introduce the schedule_on_each_cpu_cond() function that schedules a work item on each online CPU for which the supplied condition function returns true. This function should be used instead of schedule_on_each_cpu() when only some of the CPUs have actual work to do and a predicate function can tell if a certain CPU does or does not have work to do, thus saving unneeded wakeups and schedules. Signed-off-by: Gilad Ben-Yossef <gilad@benyossef.com> ---
quoted hunk ↗ jump to hunk
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 1c9782b..3322d30 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c@@ -2828,6 +2828,43 @@ int schedule_on_each_cpu_mask(work_func_t func, const struct cpumask *mask) } /** + * schedule_on_each_cpu_cond - execute a function synchronously on each + * online CPU for which the supplied condition function returns true + * @func: the function to run on the selected CPUs + * @cond_func: the function to call to select the CPUs + * + * schedule_on_each_cpu_cond() executes @func on each online CPU for + * @cond_func returns true using the system workqueue and blocks until
^^^
(for) which
Regards,
Srivatsa S. Bhat
+ * all CPUs have completed.
+ * schedule_on_each_cpu_cond() is very slow.
+ *
+ * RETURNS:
+ * 0 on success, -errno on failure.
+ */
+int schedule_on_each_cpu_cond(work_func_t func, bool (*cond_func)(int cpu))
+{
+ int cpu, ret;
+ cpumask_var_t mask;
+
+ if (unlikely(!zalloc_cpumask_var(&mask, GFP_KERNEL)))
+ return -ENOMEM;
+
+ get_online_cpus();
+
+ for_each_online_cpu(cpu)
+ if (cond_func(cpu))
+ cpumask_set_cpu(cpu, mask);
+
+ ret = schedule_on_each_cpu_mask(func, mask);
+
+ put_online_cpus();
+
+ free_cpumask_var(mask);
+
+ return ret;-- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>