From: "Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com>
To: Gilad Ben-Yossef <gilad@benyossef.com>
Cc: linux-kernel@vger.kernel.org,
Thomas Gleixner <tglx@linutronix.de>, Tejun Heo <tj@kernel.org>,
John Stultz <johnstul@us.ibm.com>,
Andrew Morton <akpm@linux-foundation.org>,
KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
Mel Gorman <mel@csn.ul.ie>, Mike Frysinger <vapier@gentoo.org>,
David Rientjes <rientjes@google.com>,
Hugh Dickins <hughd@google.com>,
Minchan Kim <minchan.kim@gmail.com>,
Konstantin Khlebnikov <khlebnikov@openvz.org>,
Christoph Lameter <cl@linux.com>,
Chris Metcalf <cmetcalf@tilera.com>,
Hakan Akkan <hakanakkan@gmail.com>,
Max Krasnyansky <maxk@qualcomm.com>,
Frederic Weisbecker <fweisbec@gmail.com>,
linux-mm@kvack.org
Subject: Re: [PATCH v1 2/6] workqueue: introduce schedule_on_each_cpu_mask
Date: Fri, 04 May 2012 10:14:56 +0530 [thread overview]
Message-ID: <4FA35EC8.5090804@linux.vnet.ibm.com> (raw)
In-Reply-To: <1336056962-10465-3-git-send-email-gilad@benyossef.com>
On 05/03/2012 08:25 PM, Gilad Ben-Yossef wrote:
> Introduce schedule_on_each_cpu_mask function to schedule a work
> item on each online CPU which is included in the mask provided.
>
> Then re-implement schedule_on_each_cpu on top of the new function.
>
> This function should be prefered to schedule_on_each_cpu in
> any case where some of the CPUs, especially on a big multi-core
> system, might not have actual work to perform in order to save
> needless wakeups and schedules.
>
> Signed-off-by: Gilad Ben-Yossef <gilad@benyossef.com>
> /**
> - * schedule_on_each_cpu - execute a function synchronously on each online CPU
> + * schedule_on_each_cpu_mask - execute a function synchronously on each
> + * online CPU which is specified in the supplied cpumask
> * @func: the function to call
> + * @mask: the cpu mask
> *
> - * schedule_on_each_cpu() executes @func on each online CPU using the
> - * system workqueue and blocks until all CPUs have completed.
> - * schedule_on_each_cpu() is very slow.
> + * schedule_on_each_cpu_mask() executes @func on each online CPU which
> + * is part of the @mask using the * system workqueue and blocks until
^^^
stray character?
> + * all CPUs have completed
> + * schedule_on_each_cpu_mask() is very slow.
> *
> * RETURNS:
> * 0 on success, -errno on failure.
> */
> -int schedule_on_each_cpu(work_func_t func)
> +int schedule_on_each_cpu_mask(work_func_t func, const struct cpumask *mask)
> {
> int cpu;
> struct work_struct __percpu *works;
>
> works = alloc_percpu(struct work_struct);
> - if (!works)
> + if (unlikely(!works))
> return -ENOMEM;
>
> get_online_cpus();
>
> - for_each_online_cpu(cpu) {
> + for_each_cpu_and(cpu, mask, cpu_online_mask) {
> struct work_struct *work = per_cpu_ptr(works, cpu);
>
> INIT_WORK(work, func);
> schedule_work_on(cpu, work);
> }
>
> - for_each_online_cpu(cpu)
> + for_each_cpu_and(cpu, mask, cpu_online_mask)
> flush_work(per_cpu_ptr(works, cpu));
>
Given that cpu hotplug is not a frequent operation, I think mask will be
a subset of cpu_online_mask most of the time (also, one example is from
schedule_on_each_cpu_cond() introduced in 3/6, which is already under
get/put_online_cpus(). So can we optimize something (the 'and' operations
perhaps) based on that?
May be something by using:
if (likely(cpumask_subset(mask, cpu_online_mask))
> put_online_cpus();
> free_percpu(works);
> +
> return 0;
> }
>
Regards,
Srivatsa S. Bhat
--
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>
WARNING: multiple messages have this Message-ID (diff)
From: "Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com>
To: Gilad Ben-Yossef <gilad@benyossef.com>
Cc: linux-kernel@vger.kernel.org,
Thomas Gleixner <tglx@linutronix.de>, Tejun Heo <tj@kernel.org>,
John Stultz <johnstul@us.ibm.com>,
Andrew Morton <akpm@linux-foundation.org>,
KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
Mel Gorman <mel@csn.ul.ie>, Mike Frysinger <vapier@gentoo.org>,
David Rientjes <rientjes@google.com>,
Hugh Dickins <hughd@google.com>,
Minchan Kim <minchan.kim@gmail.com>,
Konstantin Khlebnikov <khlebnikov@openvz.org>,
Christoph Lameter <cl@linux.com>,
Chris Metcalf <cmetcalf@tilera.com>,
Hakan Akkan <hakanakkan@gmail.com>,
Max Krasnyansky <maxk@qualcomm.com>,
Frederic Weisbecker <fweisbec@gmail.com>,
linux-mm@kvack.org
Subject: Re: [PATCH v1 2/6] workqueue: introduce schedule_on_each_cpu_mask
Date: Fri, 04 May 2012 10:14:56 +0530 [thread overview]
Message-ID: <4FA35EC8.5090804@linux.vnet.ibm.com> (raw)
In-Reply-To: <1336056962-10465-3-git-send-email-gilad@benyossef.com>
On 05/03/2012 08:25 PM, Gilad Ben-Yossef wrote:
> Introduce schedule_on_each_cpu_mask function to schedule a work
> item on each online CPU which is included in the mask provided.
>
> Then re-implement schedule_on_each_cpu on top of the new function.
>
> This function should be prefered to schedule_on_each_cpu in
> any case where some of the CPUs, especially on a big multi-core
> system, might not have actual work to perform in order to save
> needless wakeups and schedules.
>
> Signed-off-by: Gilad Ben-Yossef <gilad@benyossef.com>
> /**
> - * schedule_on_each_cpu - execute a function synchronously on each online CPU
> + * schedule_on_each_cpu_mask - execute a function synchronously on each
> + * online CPU which is specified in the supplied cpumask
> * @func: the function to call
> + * @mask: the cpu mask
> *
> - * schedule_on_each_cpu() executes @func on each online CPU using the
> - * system workqueue and blocks until all CPUs have completed.
> - * schedule_on_each_cpu() is very slow.
> + * schedule_on_each_cpu_mask() executes @func on each online CPU which
> + * is part of the @mask using the * system workqueue and blocks until
^^^
stray character?
> + * all CPUs have completed
> + * schedule_on_each_cpu_mask() is very slow.
> *
> * RETURNS:
> * 0 on success, -errno on failure.
> */
> -int schedule_on_each_cpu(work_func_t func)
> +int schedule_on_each_cpu_mask(work_func_t func, const struct cpumask *mask)
> {
> int cpu;
> struct work_struct __percpu *works;
>
> works = alloc_percpu(struct work_struct);
> - if (!works)
> + if (unlikely(!works))
> return -ENOMEM;
>
> get_online_cpus();
>
> - for_each_online_cpu(cpu) {
> + for_each_cpu_and(cpu, mask, cpu_online_mask) {
> struct work_struct *work = per_cpu_ptr(works, cpu);
>
> INIT_WORK(work, func);
> schedule_work_on(cpu, work);
> }
>
> - for_each_online_cpu(cpu)
> + for_each_cpu_and(cpu, mask, cpu_online_mask)
> flush_work(per_cpu_ptr(works, cpu));
>
Given that cpu hotplug is not a frequent operation, I think mask will be
a subset of cpu_online_mask most of the time (also, one example is from
schedule_on_each_cpu_cond() introduced in 3/6, which is already under
get/put_online_cpus(). So can we optimize something (the 'and' operations
perhaps) based on that?
May be something by using:
if (likely(cpumask_subset(mask, cpu_online_mask))
> put_online_cpus();
> free_percpu(works);
> +
> return 0;
> }
>
Regards,
Srivatsa S. Bhat
next prev parent reply other threads:[~2012-05-04 4:45 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-03 14:55 [PATCH v1 0/6] reduce workqueue and timer noise Gilad Ben-Yossef
2012-05-03 14:55 ` Gilad Ben-Yossef
2012-05-03 14:55 ` [PATCH v1 1/6] timer: make __next_timer_interrupt explicit about no future event Gilad Ben-Yossef
2012-05-03 14:55 ` Gilad Ben-Yossef
2012-05-04 12:04 ` Frederic Weisbecker
2012-05-04 12:04 ` Frederic Weisbecker
2012-05-04 12:20 ` Frederic Weisbecker
2012-05-04 12:20 ` Frederic Weisbecker
2012-05-25 20:48 ` Thomas Gleixner
2012-05-25 20:48 ` Thomas Gleixner
2012-05-25 20:56 ` Chris Metcalf
2012-05-25 20:56 ` Chris Metcalf
2012-05-25 21:04 ` Thomas Gleixner
2012-05-25 21:04 ` Thomas Gleixner
2012-05-03 14:55 ` [PATCH v1 2/6] workqueue: introduce schedule_on_each_cpu_mask Gilad Ben-Yossef
2012-05-03 14:55 ` Gilad Ben-Yossef
2012-05-04 4:44 ` Srivatsa S. Bhat [this message]
2012-05-04 4:44 ` Srivatsa S. Bhat
2012-05-03 14:55 ` [PATCH v1 3/6] workqueue: introduce schedule_on_each_cpu_cond Gilad Ben-Yossef
2012-05-03 14:55 ` Gilad Ben-Yossef
2012-05-03 15:39 ` Tejun Heo
2012-05-03 15:39 ` Tejun Heo
2012-05-06 13:15 ` Gilad Ben-Yossef
2012-05-06 13:15 ` Gilad Ben-Yossef
2012-05-07 17:17 ` Tejun Heo
2012-05-07 17:17 ` Tejun Heo
2012-05-09 14:26 ` Gilad Ben-Yossef
2012-05-09 14:26 ` Gilad Ben-Yossef
2012-05-04 4:51 ` Srivatsa S. Bhat
2012-05-04 4:51 ` Srivatsa S. Bhat
2012-05-06 13:16 ` Gilad Ben-Yossef
2012-05-06 13:16 ` Gilad Ben-Yossef
2012-05-03 14:56 ` [PATCH v1 4/6] mm: make lru_drain selective where it schedules work Gilad Ben-Yossef
2012-05-03 14:56 ` Gilad Ben-Yossef
2012-05-03 14:56 ` [PATCH v1 5/6] mm: make vmstat_update periodic run conditional Gilad Ben-Yossef
2012-05-03 14:56 ` Gilad Ben-Yossef
2012-05-07 15:29 ` Christoph Lameter
2012-05-07 15:29 ` Christoph Lameter
2012-05-07 19:33 ` KOSAKI Motohiro
2012-05-07 19:33 ` KOSAKI Motohiro
2012-05-07 19:40 ` Christoph Lameter
2012-05-07 19:40 ` Christoph Lameter
2012-05-08 15:25 ` Gilad Ben-Yossef
2012-05-08 15:25 ` Gilad Ben-Yossef
2012-05-08 15:34 ` Christoph Lameter
2012-05-08 15:34 ` Christoph Lameter
2012-05-09 14:26 ` Gilad Ben-Yossef
2012-05-09 14:26 ` Gilad Ben-Yossef
2012-05-08 15:22 ` Gilad Ben-Yossef
2012-05-08 15:22 ` Gilad Ben-Yossef
2012-05-08 15:18 ` Gilad Ben-Yossef
2012-05-08 15:18 ` Gilad Ben-Yossef
2012-05-08 15:24 ` Christoph Lameter
2012-05-08 15:24 ` Christoph Lameter
2012-05-03 14:56 ` [PATCH v1 6/6] x86: make clocksource watchdog configurable (not for mainline) Gilad Ben-Yossef
2012-05-03 14:56 ` Gilad Ben-Yossef
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4FA35EC8.5090804@linux.vnet.ibm.com \
--to=srivatsa.bhat@linux.vnet.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=cl@linux.com \
--cc=cmetcalf@tilera.com \
--cc=fweisbec@gmail.com \
--cc=gilad@benyossef.com \
--cc=hakanakkan@gmail.com \
--cc=hughd@google.com \
--cc=johnstul@us.ibm.com \
--cc=khlebnikov@openvz.org \
--cc=kosaki.motohiro@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=maxk@qualcomm.com \
--cc=mel@csn.ul.ie \
--cc=minchan.kim@gmail.com \
--cc=rientjes@google.com \
--cc=tglx@linutronix.de \
--cc=tj@kernel.org \
--cc=vapier@gentoo.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.