From: Oleg Nesterov <oleg@redhat.com>
To: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <peterz@infradead.org>,
Stanislaw Gruszka <sgruszka@redhat.com>,
Thomas Gleixner <tglx@linutronix.de>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 6/5] fix the racy usage of thread_group_cputimer() in fastpath_timer_check()
Date: Fri, 11 Jun 2010 20:06:06 +0200 [thread overview]
Message-ID: <20100611180606.GB13025@redhat.com> (raw)
In-Reply-To: <20100611180446.GA13025@redhat.com>
On 06/11, Oleg Nesterov wrote:
>
> fastpath_timer_check()->thread_group_cputimer() is racy and
> unneeded.
Just in case... this fix doesn't depend on other patches I sent.
> It is racy because another thread can clear ->running before
> thread_group_cputimer() takes cputimer->lock. In this case
> thread_group_cputimer() will set ->running = true again and call
> thread_group_cputime(). But since we do not hold tasklist or
> siglock, we can race with fork/exit and copy the wrong results
> into cputimer->cputime.
>
> It is unneeded because if ->running == true we can just use
> the numbers in cputimer->cputime we already have.
>
> Change fastpath_timer_check() to copy cputimer->cputime into
> the local variable under cputimer->lock. We do not re-check
> ->running under cputimer->lock, run_posix_cpu_timers() does
> this check later.
>
> Note: we can add more optimizations on top of this change.
>
> Signed-off-by: Oleg Nesterov <oleg@redhat.com>
> ---
>
> kernel/posix-cpu-timers.c | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
> --- 35-rc2/kernel/posix-cpu-timers.c~6_FPTC_DONT_SET_RUNNING 2010-06-11 01:08:03.000000000 +0200
> +++ 35-rc2/kernel/posix-cpu-timers.c 2010-06-11 19:40:22.000000000 +0200
> @@ -1287,7 +1287,10 @@ static inline int fastpath_timer_check(s
> if (sig->cputimer.running) {
> struct task_cputime group_sample;
>
> - thread_group_cputimer(tsk, &group_sample);
> + spin_lock(&sig->cputimer.lock);
> + group_sample = sig->cputimer.cputime;
> + spin_unlock(&sig->cputimer.lock);
> +
> if (task_cputime_expired(&group_sample, &sig->cputime_expires))
> return 1;
> }
next prev parent reply other threads:[~2010-06-11 18:07 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-06-10 23:10 [PATCH 5/5] run_posix_cpu_timers: don't check ->exit_state, use lock_task_sighand() Oleg Nesterov
2010-06-11 18:04 ` [PATCH 6/5] fix the racy usage of thread_group_cputimer() in fastpath_timer_check() Oleg Nesterov
2010-06-11 18:06 ` Oleg Nesterov [this message]
2010-06-18 10:21 ` [tip:sched/core] sched: Fix " tip-bot for Oleg Nesterov
2010-06-18 10:20 ` [tip:sched/core] sched: run_posix_cpu_timers: Don't check ->exit_state, use lock_task_sighand() tip-bot for Oleg Nesterov
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=20100611180606.GB13025@redhat.com \
--to=oleg@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=peterz@infradead.org \
--cc=sgruszka@redhat.com \
--cc=tglx@linutronix.de \
/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.