mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
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


  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