From: George Anzinger <george@mvista.com>
To: Christoph Lameter <clameter@sgi.com>
Cc: Ulrich Drepper <drepper@redhat.com>,
johnstul@us.ibm.com, Ulrich.Windl@rz.uni-regensburg.de,
linux-kernel@vger.kernel.org, libc-alpha@sources.redhat.com
Subject: Re: [RFC] Posix compliant behavior of CLOCK_PROCESS/THREAD_CPUTIME_ID
Date: Mon, 27 Sep 2004 15:54:16 -0700 [thread overview]
Message-ID: <41589A18.7050504@mvista.com> (raw)
In-Reply-To: <Pine.LNX.4.58.0409271344220.32308@schroedinger.engr.sgi.com>
Uh, do you have a test program to verify these? I would like to add it to the
support package on sourceforge.
George
Christoph Lameter wrote:
> Attached follows a patch to implement the POSIX clocks according to the
> POSIX standard which states in V3 of the Single Unix Specification:
>
> 1. CLOCK_PROCESS_CPUTIME_ID
>
> Implementations shall also support the special clockid_t value
> CLOCK_PROCESS_CPUTIME_ID, which represents the CPU-time clock of the
> calling process when invoking one of the clock_*() or timer_*()
> functions. For these clock IDs, the values returned by clock_gettime() and specified
> by clock_settime() represent the amount of execution time of the process
> associated with the clock.
>
> 2. CLOCK_THREAD_CPUTIME_ID
>
> Implementations shall also support the special clockid_t value
> CLOCK_THREAD_CPUTIME_ID, which represents the CPU-time clock of the
> calling thread when invoking one of the clock_*() or timer_*()
> functions. For these clock IDs, the values returned by clock_gettime()
> and specified by clock_settime() shall represent the amount of
> execution time of the thread associated with the clock.
>
> These times mentioned are CPU processing times and not the time that has
> passed since the startup of a process. Glibc currently provides its own
> implementation of these two clocks which is designed to return the time
> that passed since the startup of a process or a thread.
>
> Moreover this clock is bound to CPU timers which is problematic when the
> frequency of the clock changes or the process is moved to a different
> processor whose cpu timer may not be fully synchronized to the cpu timer
> of the current CPU.
>
> I would like to have the following patch integrated into the kernel. Glibc
> would need to be modified to simply generate a system call for clock_* without
> doing its own emulation of a clock. CLOCK_PROCESS_CPUTIME_ID and
> CLOCK_THREAD_CPUTIME id were never intended to be used as a means to
> access a time stamp counter on a CPU and it may be better to find another
> means of accesses the cpu time registerss.
>
> The patch is really quite straighforward and only affects one file...
>
> Index: linus/kernel/posix-timers.c
> ===================================================================
> --- linus.orig/kernel/posix-timers.c 2004-09-23 15:12:01.000000000 -0700
> +++ linus/kernel/posix-timers.c 2004-09-27 13:42:40.000000000 -0700
> @@ -10,6 +10,10 @@
> * 2004-06-01 Fix CLOCK_REALTIME clock/timer TIMER_ABSTIME bug.
> * Copyright (C) 2004 Boris Hu
> *
> + * 2004-07-27 Provide POSIX compliant clocks
> + * CLOCK_PROCESS_CPUTIME_ID and CLOCK_THREAD_CPUTIME_ID.
> + * by Christoph Lameter
> + *
> * This program is free software; you can redistribute it and/or modify
> * it under the terms of the GNU General Public License as published by
> * the Free Software Foundation; either version 2 of the License, or (at
> @@ -133,18 +137,10 @@
> * resolution. Here we define the standard CLOCK_REALTIME as a
> * 1/HZ resolution clock.
> *
> - * CPUTIME & THREAD_CPUTIME: We are not, at this time, definding these
> - * two clocks (and the other process related clocks (Std
> - * 1003.1d-1999). The way these should be supported, we think,
> - * is to use large negative numbers for the two clocks that are
> - * pinned to the executing process and to use -pid for clocks
> - * pinned to particular pids. Calls which supported these clock
> - * ids would split early in the function.
> - *
> * RESOLUTION: Clock resolution is used to round up timer and interval
> * times, NOT to report clock times, which are reported with as
> * much resolution as the system can muster. In some cases this
> - * resolution may depend on the underlaying clock hardware and
> + * resolution may depend on the underlying clock hardware and
> * may not be quantifiable until run time, and only then is the
> * necessary code is written. The standard says we should say
> * something about this issue in the documentation...
> @@ -162,7 +158,7 @@
> *
> * At this time all functions EXCEPT clock_nanosleep can be
> * redirected by the CLOCKS structure. Clock_nanosleep is in
> - * there, but the code ignors it.
> + * there, but the code ignores it.
> *
> * Permissions: It is assumed that the clock_settime() function defined
> * for each clock will take care of permission checks. Some
> @@ -198,6 +194,8 @@
> struct timespec *tp, struct timespec *mo);
> int do_posix_clock_monotonic_gettime(struct timespec *tp);
> int do_posix_clock_monotonic_settime(struct timespec *tp);
> +int do_posix_clock_process_gettime(struct timespec *tp);
> +int do_posix_clock_thread_gettime(struct timespec *tp);
> static struct k_itimer *lock_timer(timer_t timer_id, unsigned long *flags);
>
> static inline void unlock_timer(struct k_itimer *timr, unsigned long flags)
> @@ -218,6 +216,14 @@
> .clock_get = do_posix_clock_monotonic_gettime,
> .clock_set = do_posix_clock_monotonic_settime
> };
> + struct k_clock clock_thread = {.res = CLOCK_REALTIME_RES,
> + .abs_struct = NULL,
> + .clock_get = do_posix_clock_thread_gettime
> + };
> + struct k_clock clock_process = {.res = CLOCK_REALTIME_RES,
> + .abs_struct = NULL,
> + .clock_get = do_posix_clock_process_gettime
> + };
You will have to supply functions to return errors for the unimplemented calls.
Otherwise the caller will end up in the CLOCK_REALTIME code which will just
not work.
Also, to trap calls to clock_nanosleep() you will need to start running it
through the same dispatch table. (See notes on this in the comments.).
-g
>
> #ifdef CONFIG_TIME_INTERPOLATION
> /* Clocks are more accurate with time interpolators */
> @@ -226,6 +232,8 @@
>
> register_posix_clock(CLOCK_REALTIME, &clock_realtime);
> register_posix_clock(CLOCK_MONOTONIC, &clock_monotonic);
> + register_posix_clock(CLOCK_PROCESS_CPUTIME_ID, &clock_process);
> + register_posix_clock(CLOCK_THREAD_CPUTIME_ID, &clock_thread);
>
> posix_timers_cache = kmem_cache_create("posix_timers_cache",
> sizeof (struct k_itimer), 0, 0, NULL, NULL);
> @@ -1227,6 +1235,46 @@
> return -EINVAL;
> }
>
> +/*
> + * Single Unix Specification V3:
> + *
> + * Implementations shall also support the special clockid_t value
> + * CLOCK_THREAD_CPUTIME_ID, which represents the CPU-time clock of the calling
> + * thread when invoking one of the clock_*() or timer_*() functions. For these
> + * clock IDs, the values returned by clock_gettime() and specified by
> + * clock_settime() shall represent the amount of execution time of the thread
> + * associated with the clock.
> + */
> +int do_posix_clock_thread_gettime(struct timespec *tp)
> +{
> + jiffies_to_timespec(current->signal->cutime + current->signal->cstime, tp);
> + return 0;
> +}
> +
> +/*
> + * Single Unix Specification V3:
> + *
> + * Implementations shall also support the special clockid_t value
> + * CLOCK_PROCESS_CPUTIME_ID, which represents the CPU-time clock of the
> + * calling process when invoking one of the clock_*() or timer_*() functions.
> + * For these clock IDs, the values returned by clock_gettime() and specified
> + * by clock_settime() represent the amount of execution time of the process
> + * associated with the clock.
> + */
> +int do_posix_clock_process_gettime(struct timespec *tp)
> +{
> + unsigned long ticks = 0;
> + struct task *t;
> +
> + /* Add up the cpu time for all the threads of this process */
> + for (t = current; t != current; t = next_thread(p)) {
> + ticks += t->signal->cutime + t->signal->cstime;
> + }
> +
> + jiffies_to_timespec(ticks, tp);
> + return 0;
> +}
> +
> asmlinkage long
> sys_clock_settime(clockid_t which_clock, const struct timespec __user *tp)
> {
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>
--
George Anzinger george@mvista.com
High-res-timers: http://sourceforge.net/projects/high-res-timers/
Preemption patch: http://www.kernel.org/pub/linux/kernel/people/rml
next prev parent reply other threads:[~2004-09-27 22:56 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <B6E8046E1E28D34EB815A11AC8CA312902CD3264@mtv-atc-605e--n.corp.sgi.com>
2004-09-24 12:16 ` [time] add support for CLOCK_THREAD_CPUTIME_ID and CLOCK_PROCESS_CPUTIME_ID Christoph Lameter
2004-09-25 4:25 ` Ulrich Drepper
2004-09-25 5:25 ` Christoph Lameter
2004-09-25 5:54 ` Christoph Lameter
2004-09-25 6:08 ` Ulrich Drepper
2004-09-25 14:51 ` Christoph Lameter
2004-09-25 15:19 ` Ulrich Drepper
2004-09-27 15:03 ` Christoph Lameter
2004-09-27 15:34 ` Christoph Lameter
[not found] ` <B6E8046E1E28D34EB815A11AC8CA312902CD327E@mtv-atc-605e--n.corp.sgi.com>
2004-09-27 20:58 ` [RFC] Posix compliant behavior of CLOCK_PROCESS/THREAD_CPUTIME_ID Christoph Lameter
2004-09-27 22:54 ` George Anzinger [this message]
2004-09-28 19:18 ` Ulrich Drepper
2004-09-28 19:25 ` Christoph Lameter
2004-09-29 3:25 ` Posix compliant CLOCK_PROCESS/THREAD_CPUTIME_ID V4 Christoph Lameter
2004-09-29 17:45 ` George Anzinger
2004-09-29 18:14 ` Christoph Lameter
2004-09-29 19:27 ` George Anzinger
2004-09-29 19:34 ` Christoph Lameter
2004-09-29 19:52 ` Jesper Juhl
2004-09-30 0:14 ` patches inline in mail George Anzinger
2004-09-30 3:24 ` Paul Jackson
2004-10-01 5:29 ` Andrew Morton
2004-10-01 12:28 ` Alan Cox
2004-10-01 13:42 ` Paul Fulghum
2004-10-01 19:53 ` Lee Revell
2004-10-01 21:58 ` George Anzinger
2004-10-02 15:52 ` Olaf Dietsche
2004-10-02 15:20 ` Alan Cox
2004-10-03 21:01 ` [OT] " Guennadi Liakhovetski
2004-10-03 23:18 ` Jesper Juhl
2004-10-04 6:20 ` Paul Jackson
2004-10-04 19:11 ` Guennadi Liakhovetski
2004-10-04 7:26 ` Ulrich Windl
2004-10-03 21:35 ` George Anzinger
2004-10-04 3:00 ` Jim Nelson
2004-10-01 9:04 ` Jesper Juhl
2004-09-29 19:32 ` Posix compliant CLOCK_PROCESS/THREAD_CPUTIME_ID V5 Christoph Lameter
2004-10-01 19:57 ` Posix compliant cpu clocks V6 [0/3]: Rationale and test program Christoph Lameter
[not found] ` <B6E8046E1E28D34EB815A11AC8CA31290322B307@mtv-atc-605e--n.corp.sgi.com>
2004-10-01 19:59 ` Posix compliant cpu clocks V6 [1/3]: Generic Kernel patch Christoph Lameter
2004-10-01 21:03 ` Andrew Morton
2004-10-01 20:01 ` Posix compliant cpu clocks V6 [2/3]: Glibc patch Christoph Lameter
2004-10-02 5:32 ` Ulrich Drepper
2004-10-04 15:04 ` Christoph Lameter
2004-10-04 16:27 ` Christoph Lameter
2004-10-06 13:53 ` Martijn Sipkema
2004-10-01 20:02 ` Posix compliant cpu clocks V6 [3/3]: mmtimer provides CLOCK_SGI_CYCLE Christoph Lameter
2004-10-07 4:56 ` Posix compliant cpu clocks V7 [0/2]: Rationale and test program Christoph Lameter
2004-10-12 20:19 ` Periodic posix timer support broke between 2.6.9-rc1 and 2.6.9-rc1-bk17 Christoph Lameter
2004-10-12 22:24 ` George Anzinger
2004-10-13 18:08 ` Alexander Nyberg
2004-10-13 18:11 ` Christoph Lameter
[not found] ` <B6E8046E1E28D34EB815A11AC8CA31290322B331@mtv-atc-605e--n.corp.sgi.com>
2004-10-07 4:57 ` Posix compliant cpu clocks V7 [1/2]: Kernel Patch Christoph Lameter
2004-10-07 4:59 ` Posix compliant cpu clocks V7 [2/2]: Glibc patch Christoph Lameter
2004-10-21 19:32 ` Posix compliant process clock patch for the linux arch in glibc Christoph Lameter
2004-10-01 21:57 ` [RFC] Posix compliant behavior of CLOCK_PROCESS/THREAD_CPUTIME_ID Roland McGrath
2004-10-01 23:30 ` Christoph Lameter
2004-10-04 18:48 ` RFC: Posix compliant clock_getclockcpuid(pid) to access other processes clocks Christoph Lameter
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=41589A18.7050504@mvista.com \
--to=george@mvista.com \
--cc=Ulrich.Windl@rz.uni-regensburg.de \
--cc=clameter@sgi.com \
--cc=drepper@redhat.com \
--cc=johnstul@us.ibm.com \
--cc=libc-alpha@sources.redhat.com \
--cc=linux-kernel@vger.kernel.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
Powered by JetHome