From: Oleg Nesterov <oleg@redhat.com>
To: Dario Faggioli <raistlin@linux.it>
Cc: Thomas Gleixner <tglx@linutronix.de>,
linux-kernel <linux-kernel@vger.kernel.org>,
torbenh <torbenh@gmx.de>,
john.stultz@linaro.org, roland@redhat.com,
Ingo Molnar <mingo@elte.hu>,
Peter Zijlstra <peterz@infradead.org>,
Stanislaw Gruszka <sgruszka@redhat.com>,
Dhaval Giani <dhaval.giani@gmail.com>,
Randy Dunlap <rdunlap@xenotime.net>
Subject: Re: [PATCH resend] Reading POSIX CPU timer from outside the process.
Date: Tue, 28 Dec 2010 17:38:29 +0100 [thread overview]
Message-ID: <20101228163829.GA26533@redhat.com> (raw)
In-Reply-To: <1293533742.2899.1028.camel@Palantir>
This patch doesn't look right,
On 12/28, Dario Faggioli wrote:
>
> Trying to call clock_getcpuclockid (and then clock_gettime) on a thread
> from outside the process that spawned it results in this:
> ### Testing tid 24207: CPU-time clock for PID 24207 is 1.132371729 seconds
> ### Testing tid 24209: clock_getcpuclockid: Success
>
> OTOH, if full-fledged processes are involved, the behaviour is this:
> ### Testing tid 24218: CPU-time clock for PID 24218 is 0.001059305 seconds
> ### Testing tid 24220: CPU-time clock for PID 24220 is 1.044057391 seconds
>
> Test programs available here: http://gitorious.org/clockid
>
> All that because clock_getcpuclockid forbids accessing thread
> specific CPU-time clocks from outside the thread group,
First of all, linux has no clock_getcpuclockid() system call, so
the changelog looks confusing.
glibc implements clock_getcpuclockid() via clock_getres(), that
is why the change in check_clock() can help.
> Therefore, this commit makes clock_getcpuclockid behave as follows:
> - if it's called on a tid which is also a PID (i.e., the thread is
> a thread group leader), it returns the CLOCK_PROCESS_CPUTIME_ID of
> the process;
> - if it's called on a tid of a non-group leader, it returns the
> CLOCK_THREAD_CPUTIME_ID of such specific thread.
And both changes look wrong to me.
> --- a/kernel/posix-cpu-timers.c
> +++ b/kernel/posix-cpu-timers.c
> @@ -39,10 +39,9 @@ static int check_clock(const clockid_t which_clock)
>
> rcu_read_lock();
> p = find_task_by_vpid(pid);
> - if (!p || !(CPUCLOCK_PERTHREAD(which_clock) ?
> - same_thread_group(p, current) : has_group_leader_pid(p))) {
> + if (!p || (CPUCLOCK_PERTHREAD(which_clock) &&
> + same_thread_group(p, current) && !has_group_leader_pid(p)))
> error = -EINVAL;
> - }
> rcu_read_unlock();
How so? For example, with this change
clock_getres(MAKE_THREAD_CPUCLOCK(pid_of_sub_thread)) won't work, no?
> @@ -349,11 +348,9 @@ int posix_cpu_clock_get(const clockid_t which_clock, struct timespec *tp)
> rcu_read_lock();
> p = find_task_by_vpid(pid);
> if (p) {
> - if (CPUCLOCK_PERTHREAD(which_clock)) {
> - if (same_thread_group(p, current)) {
> - error = cpu_clock_sample(which_clock,
> - p, &rtn);
> - }
> + if (CPUCLOCK_PERTHREAD(which_clock) ||
> + !thread_group_leader(p)) {
> + error = cpu_clock_sample(which_clock, p, &rtn);
IOW, we ignore CPUCLOCK_PERTHREAD() if !thread_group_leader(),
this can't be right.
I think, if we want to remove this limitation, we need something
like the patch below. If it doesn't help, we should fix glibc.
Oleg.
--- x/kernel/posix-cpu-timers.c
+++ x/kernel/posix-cpu-timers.c
@@ -39,10 +39,8 @@ static int check_clock(const clockid_t w
rcu_read_lock();
p = find_task_by_vpid(pid);
- if (!p || !(CPUCLOCK_PERTHREAD(which_clock) ?
- same_thread_group(p, current) : has_group_leader_pid(p))) {
+ if (!p || !(CPUCLOCK_PERTHREAD(which_clock) || has_group_leader_pid(p)))
error = -EINVAL;
- }
rcu_read_unlock();
return error;
@@ -350,10 +348,7 @@ int posix_cpu_clock_get(const clockid_t
p = find_task_by_vpid(pid);
if (p) {
if (CPUCLOCK_PERTHREAD(which_clock)) {
- if (same_thread_group(p, current)) {
- error = cpu_clock_sample(which_clock,
- p, &rtn);
- }
+ error = cpu_clock_sample(which_clock, p, &rtn);
} else {
read_lock(&tasklist_lock);
if (thread_group_leader(p) && p->sighand) {
next prev parent reply other threads:[~2010-12-28 16:46 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-23 16:21 [PATCH] Read THREAD_CPUTIME clock from other processes Dario Faggioli
2010-12-23 16:44 ` Oleg Nesterov
2010-12-23 17:38 ` Dario Faggioli
2010-12-23 18:12 ` Oleg Nesterov
2010-12-24 11:36 ` Dario Faggioli
2010-12-23 17:21 ` Randy Dunlap
2010-12-23 17:43 ` Dario Faggioli
2010-12-28 10:55 ` [PATCH resend] Reading POSIX CPU timer from outside the process Dario Faggioli
2010-12-28 16:38 ` Oleg Nesterov [this message]
2010-12-28 21:38 ` Dario Faggioli
2010-12-29 13:21 ` Oleg Nesterov
2010-12-29 14:10 ` Dario Faggioli
2010-12-29 18:30 ` Oleg Nesterov
2010-12-30 17:45 ` torbenh
2011-01-04 11:01 ` Dario Faggioli
2011-01-06 16:06 ` torbenh
2011-01-07 19:28 ` [PATCH] Read THREAD_CPUTIME clock from other processes Roland McGrath
2011-01-07 19:35 ` Oleg Nesterov
2011-01-07 19:50 ` Roland McGrath
2011-01-07 19:49 ` Oleg Nesterov
2011-01-07 19:58 ` Roland McGrath
2011-01-07 19:56 ` Peter Zijlstra
2011-01-08 11:12 ` Dario Faggioli
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=20101228163829.GA26533@redhat.com \
--to=oleg@redhat.com \
--cc=dhaval.giani@gmail.com \
--cc=john.stultz@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=peterz@infradead.org \
--cc=raistlin@linux.it \
--cc=rdunlap@xenotime.net \
--cc=roland@redhat.com \
--cc=sgruszka@redhat.com \
--cc=tglx@linutronix.de \
--cc=torbenh@gmx.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.