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: [PATCH 6/5] fix the racy usage of thread_group_cputimer() in fastpath_timer_check()
Date: Fri, 11 Jun 2010 20:04:46 +0200 [thread overview]
Message-ID: <20100611180446.GA13025@redhat.com> (raw)
In-Reply-To: <20100610231018.GA25942@redhat.com>
fastpath_timer_check()->thread_group_cputimer() is racy and
unneeded.
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:06 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 ` Oleg Nesterov [this message]
2010-06-11 18:06 ` [PATCH 6/5] fix the racy usage of thread_group_cputimer() in fastpath_timer_check() Oleg Nesterov
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=20100611180446.GA13025@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.