From: Peter Zijlstra <peterz@infradead.org>
To: Vincent Guittot <vincent.guittot@linaro.org>
Cc: linux-kernel@vger.kernel.org, linaro-kernel@lists.linaro.org,
mingo@kernel.org, fweisbec@gmail.com, pjt@google.com,
rostedt@goodmis.org, efault@gmx.de
Subject: Re: [PATCH v7] sched: fix init NOHZ_IDLE flag
Date: Mon, 22 Apr 2013 22:10:37 +0200 [thread overview]
Message-ID: <1366661437.6454.20.camel@laptop> (raw)
In-Reply-To: <1366645086-20345-1-git-send-email-vincent.guittot@linaro.org>
On Mon, 2013-04-22 at 17:38 +0200, Vincent Guittot wrote:
> ---
> include/linux/sched.h | 1 +
> kernel/sched/fair.c | 34 ++++++++++++++++++++++++----------
> 2 files changed, 25 insertions(+), 10 deletions(-)
>
> diff --git a/include/linux/sched.h b/include/linux/sched.h
> index d35d2b6..cde4f7f 100644
> --- a/include/linux/sched.h
> +++ b/include/linux/sched.h
> @@ -899,6 +899,7 @@ struct sched_domain {
> unsigned int wake_idx;
> unsigned int forkexec_idx;
> unsigned int smt_gain;
> + unsigned long nohz_flags; /* NOHZ_IDLE flag status */
> int flags; /* See SD_* */
> int level;
There was a 4 byte hole here, I'm assuming you used unsigned long and
not utilized the hole because of the whole atomic bitop interface
taking unsigned long?
Bit wasteful but ok..
So we're only pulling NOHZ_IDLE out of nohz_flags()? Should we then not
also amend the rq_nohz_flag_bits enum? And it seems pointless to me to
set bit 2 our nohz_flags word if all other bits are unused.
>
> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> index 7a33e59..09e440f 100644
> --- a/kernel/sched/fair.c
> +++ b/kernel/sched/fair.c
> @@ -5394,14 +5394,21 @@ static inline void set_cpu_sd_state_busy(void)
> {
> struct sched_domain *sd;
> int cpu = smp_processor_id();
> -
> - if (!test_bit(NOHZ_IDLE, nohz_flags(cpu)))
> - return;
> - clear_bit(NOHZ_IDLE, nohz_flags(cpu));
> + int first_nohz_idle = 1;
>
> rcu_read_lock();
> - for_each_domain(cpu, sd)
> + for_each_domain(cpu, sd) {
> + if (first_nohz_idle) {
> + if (!test_bit(NOHZ_IDLE, &sd->nohz_flags))
> + goto unlock;
> +
> + clear_bit(NOHZ_IDLE, &sd->nohz_flags);
> + first_nohz_idle = 0;
> + }
> +
> atomic_inc(&sd->groups->sgp->nr_busy_cpus);
> + }
the mind boggles... what's wrong with something like:
static inline unsigned long *rq_nohz_flags(int cpu)
{
return rcu_dereference(cpu_rq(cpu)->sd)->nohz_flags;
}
if (!test_bit(0, rq_nohz_flags(cpu)))
return;
clear_bit(0, rq_nohz_flags(cpu));
> +unlock:
> rcu_read_unlock();
> }
>
> @@ -5409,14 +5416,21 @@ void set_cpu_sd_state_idle(void)
> {
> struct sched_domain *sd;
> int cpu = smp_processor_id();
> -
> - if (test_bit(NOHZ_IDLE, nohz_flags(cpu)))
> - return;
> - set_bit(NOHZ_IDLE, nohz_flags(cpu));
> + int first_nohz_idle = 1;
>
> rcu_read_lock();
> - for_each_domain(cpu, sd)
> + for_each_domain(cpu, sd) {
> + if (first_nohz_idle) {
> + if (test_bit(NOHZ_IDLE, &sd->nohz_flags))
> + goto unlock;
> +
> + set_bit(NOHZ_IDLE, &sd->nohz_flags);
> + first_nohz_idle = 0;
> + }
> +
> atomic_dec(&sd->groups->sgp->nr_busy_cpus);
> + }
> +unlock:
Same here, .. why on earth do it for every sched_domain for that cpu?
> rcu_read_unlock();
> }
>
And since its now only a single bit in a single word, we can easily
change it to something like:
if (*rq_nohz_idle(cpu))
return;
xchg(rq_nohz_idle(cpu), 1); /* set; use 0 for clear */
which drops the unsigned long nonsense..
Or am I completely missing something obvious here?
next prev parent reply other threads:[~2013-04-22 20:10 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-22 15:38 Vincent Guittot
2013-04-22 20:10 ` Peter Zijlstra [this message]
2013-04-23 7:52 ` Vincent Guittot
2013-04-23 8:50 ` Peter Zijlstra
2013-04-23 9:01 ` Vincent Guittot
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=1366661437.6454.20.camel@laptop \
--to=peterz@infradead.org \
--cc=efault@gmx.de \
--cc=fweisbec@gmail.com \
--cc=linaro-kernel@lists.linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=pjt@google.com \
--cc=rostedt@goodmis.org \
--cc=vincent.guittot@linaro.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®