public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* linux missing support for _POSIX_THREAD_CPUTIME?
@ 2009-05-27 16:46 Chris Friesen
  2009-05-27 16:56 ` Thomas Gleixner
  2009-05-27 17:00 ` linux missing support for _POSIX_THREAD_CPUTIME ? Chris Friesen
  0 siblings, 2 replies; 7+ messages in thread
From: Chris Friesen @ 2009-05-27 16:46 UTC (permalink / raw)
  To: linux-kernel, tglx

Hi all,

POSIX defines optional support for clock ID values obtained by invoking
pthread_getcpuclockid().  When passed to clock_gettime(), this allows
the caller to request the CPU-time clock of an arbitrary thread within
the same process as the caller.

It appears that linux doesn't support this functionality--is that
correct?  Is there any plan to enable this?

Is there any current way to obtain the runtime of a particular thread
without knowing its tid (since the thread_id to tid mapping is known
only to glibc)?

Thanks,

Chris

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: linux missing support for _POSIX_THREAD_CPUTIME?
  2009-05-27 16:46 linux missing support for _POSIX_THREAD_CPUTIME? Chris Friesen
@ 2009-05-27 16:56 ` Thomas Gleixner
  2009-05-27 17:14   ` Chris Friesen
  2009-05-27 17:49   ` Roland McGrath
  2009-05-27 17:00 ` linux missing support for _POSIX_THREAD_CPUTIME ? Chris Friesen
  1 sibling, 2 replies; 7+ messages in thread
From: Thomas Gleixner @ 2009-05-27 16:56 UTC (permalink / raw)
  To: Chris Friesen; +Cc: LKML, Ulrich Drepper, Roland McGrath

On Wed, 27 May 2009, Chris Friesen wrote:

That's more a question for the glibc folks. CC'ed.

> Hi all,
> 
> POSIX defines optional support for clock ID values obtained by invoking
> pthread_getcpuclockid().  When passed to clock_gettime(), this allows
> the caller to request the CPU-time clock of an arbitrary thread within
> the same process as the caller.
> 
> It appears that linux doesn't support this functionality--is that
> correct?  Is there any plan to enable this?
> 
> Is there any current way to obtain the runtime of a particular thread
> without knowing its tid (since the thread_id to tid mapping is known
> only to glibc)?
> 
> Thanks,
> 
> Chris
> 

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: linux missing support for _POSIX_THREAD_CPUTIME ?
  2009-05-27 16:46 linux missing support for _POSIX_THREAD_CPUTIME? Chris Friesen
  2009-05-27 16:56 ` Thomas Gleixner
@ 2009-05-27 17:00 ` Chris Friesen
  1 sibling, 0 replies; 7+ messages in thread
From: Chris Friesen @ 2009-05-27 17:00 UTC (permalink / raw)
  To: tglx; +Cc: linux-kernel

Chris Friesen wrote:

> It appears that linux doesn't support this functionality--is that
> correct?  Is there any plan to enable this?

In particular, it seems to fail the invalid_clockid() test.  Is that
function expecting the clock ID to be negative for this case?

Thanks,

Chris

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: linux missing support for _POSIX_THREAD_CPUTIME?
  2009-05-27 16:56 ` Thomas Gleixner
@ 2009-05-27 17:14   ` Chris Friesen
  2009-05-27 17:36     ` Thomas Gleixner
  2009-05-27 17:49   ` Roland McGrath
  1 sibling, 1 reply; 7+ messages in thread
From: Chris Friesen @ 2009-05-27 17:14 UTC (permalink / raw)
  To: Thomas Gleixner; +Cc: LKML, Ulrich Drepper, Roland McGrath

Thomas Gleixner wrote:
> On Wed, 27 May 2009, Chris Friesen wrote:
> 
> That's more a question for the glibc folks. CC'ed.

Actually, I'm looking at the kernel code here.  It looks like
posix_cpu_clock_get() should be able to handle a per-task cpu clock for
another thread within the same process.  However, it's only ever called
by thread_cpu_clock_get(), which hardcodes a clock_id of THREAD_CLOCK,
which corresponds to the current thread.

Similarly, invalid_clockid() will say that the clock_id is invalid if
it's positive but greater than 15.  If my math is right, this means that
any pid > 2 will result in invalid_clockid() failing.

Chris

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: linux missing support for _POSIX_THREAD_CPUTIME?
  2009-05-27 17:14   ` Chris Friesen
@ 2009-05-27 17:36     ` Thomas Gleixner
  2009-05-27 20:00       ` Chris Friesen
  0 siblings, 1 reply; 7+ messages in thread
From: Thomas Gleixner @ 2009-05-27 17:36 UTC (permalink / raw)
  To: Chris Friesen; +Cc: LKML, Ulrich Drepper, Roland McGrath

On Wed, 27 May 2009, Chris Friesen wrote:

> Thomas Gleixner wrote:
> > On Wed, 27 May 2009, Chris Friesen wrote:
> > 
> > That's more a question for the glibc folks. CC'ed.
> 
> Actually, I'm looking at the kernel code here.  It looks like
> posix_cpu_clock_get() should be able to handle a per-task cpu clock for
> another thread within the same process.  However, it's only ever called
> by thread_cpu_clock_get(), which hardcodes a clock_id of THREAD_CLOCK,
> which corresponds to the current thread.

No, it's also called via the CLOCK_DISPATCH magic in posix_timers.c
 
> Similarly, invalid_clockid() will say that the clock_id is invalid if
> it's positive but greater than 15.  If my math is right, this means that
> any pid > 2 will result in invalid_clockid() failing.

posix_cpu_clock_get() does:

  const pid_t pid = CPUCLOCK_PID(which_clock);

CPUCLOCK_PID is defined as:

#define CPUCLOCK_PID(clock)  ((pid_t) ~((clock) >> 3))

include/linux/posix-timers.h has the helper macros to build the
clock_id value for posix_cpu_clock_get()

#define MAKE_PROCESS_CPUCLOCK(pid, clock) \
        ((~(clockid_t) (pid) << 3) | (clockid_t) (clock))
#define MAKE_THREAD_CPUCLOCK(tid, clock) \
        MAKE_PROCESS_CPUCLOCK((tid), (clock) | CPUCLOCK_PERTHREAD_MASK)

Hope that helps,

     tglx

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: linux missing support for _POSIX_THREAD_CPUTIME?
  2009-05-27 16:56 ` Thomas Gleixner
  2009-05-27 17:14   ` Chris Friesen
@ 2009-05-27 17:49   ` Roland McGrath
  1 sibling, 0 replies; 7+ messages in thread
From: Roland McGrath @ 2009-05-27 17:49 UTC (permalink / raw)
  To: Thomas Gleixner; +Cc: Chris Friesen, LKML, Ulrich Drepper

> POSIX defines optional support for clock ID values obtained by invoking
> pthread_getcpuclockid().  When passed to clock_gettime(), this allows
> the caller to request the CPU-time clock of an arbitrary thread within
> the same process as the caller.
> 
> It appears that linux doesn't support this functionality--is that
> correct?  Is there any plan to enable this?

glibc does implement pthread_getcpuclockid using the kernel support for it.
It uses MAKE_THREAD_CPUCLOCK(tid, CPUCLOCK_SCHED) (see linux/posix-timers.h).

> Is there any current way to obtain the runtime of a particular thread
> without knowing its tid (since the thread_id to tid mapping is known
> only to glibc)?

You need a tid to construct the clock ID with MAKE_THREAD_CPUCLOCK().
The pthread_getcpuclockid function exists to do this for you when you are
using pthreads.  If you are not using pthreads, then certainly you have to
figure out what a thread's tid is yourself.


Thanks,
Roland

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: linux missing support for _POSIX_THREAD_CPUTIME?
  2009-05-27 17:36     ` Thomas Gleixner
@ 2009-05-27 20:00       ` Chris Friesen
  0 siblings, 0 replies; 7+ messages in thread
From: Chris Friesen @ 2009-05-27 20:00 UTC (permalink / raw)
  To: Thomas Gleixner; +Cc: LKML, Ulrich Drepper, Roland McGrath

Thomas Gleixner wrote:
> On Wed, 27 May 2009, Chris Friesen wrote:
> 
> 
>>Thomas Gleixner wrote:
>>
>>>On Wed, 27 May 2009, Chris Friesen wrote:
>>>
>>>That's more a question for the glibc folks. CC'ed.
>>
>>Actually, I'm looking at the kernel code here.  It looks like
>>posix_cpu_clock_get() should be able to handle a per-task cpu clock for
>>another thread within the same process.  However, it's only ever called
>>by thread_cpu_clock_get(), which hardcodes a clock_id of THREAD_CLOCK,
>>which corresponds to the current thread.
> 
> 
> No, it's also called via the CLOCK_DISPATCH magic in posix_timers.c

>>Similarly, invalid_clockid() will say that the clock_id is invalid if
>>it's positive but greater than 15.  If my math is right, this means that
>>any pid > 2 will result in invalid_clockid() failing.

Both invalid_clockid() and CLOCK_DISPATCH assume that the clock_id will
be negative in order to call posix_cpu_clock_get().

In pthread_getcpuclockid() in glibc, I couldn't see how we were ending
up with a negative clock_id.  However, I finally clued in to the fact
that there are multiple implementations of this function, and in one
code path in one of the implementations we call MAKE_THREAD_CPUCLOCK()
which can result in a negative clock_id.

Thanks for the help.

Chris

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2009-05-27 20:00 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-05-27 16:46 linux missing support for _POSIX_THREAD_CPUTIME? Chris Friesen
2009-05-27 16:56 ` Thomas Gleixner
2009-05-27 17:14   ` Chris Friesen
2009-05-27 17:36     ` Thomas Gleixner
2009-05-27 20:00       ` Chris Friesen
2009-05-27 17:49   ` Roland McGrath
2009-05-27 17:00 ` linux missing support for _POSIX_THREAD_CPUTIME ? Chris Friesen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox