unofficial mirror of libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
To: libc-alpha@sourceware.org
Subject: Re: [PATCH v2 1/6] nptl: Remove pthread_clock_gettime pthread_clock_settime
Date: Tue, 19 Mar 2019 14:23:59 -0300	[thread overview]
Message-ID: <5a213c63-a2ef-9d43-bdd3-95608fd0db68@linaro.org> (raw)
In-Reply-To: <20190218211128.1869-1-adhemerval.zanella@linaro.org>

Ping.

On 18/02/2019 18:11, Adhemerval Zanella wrote:
> This patch removes CLOCK_THREAD_CPUTIME_ID and CLOCK_PROCESS_CPUTIME_ID support
> from clock_gettime and clock_settime generic implementation.  For Linux, kernel
> already provides supports through the syscall and Hurd HTL lacks
> __pthread_clock_gettime and __pthread_clock_settime internal implementation.
> 
> As described in clock_gettime man-page [1] on 'Historical note for SMP
> system', implementing CLOCK_{THREAD,PROCESS}_CPUTIME_ID with timer registers
> is error-prone and susceptible to timing and accurary issues that the libc
> can not deal without kernel support.
> 
> This allows removes unused code which, however, still incur in some runtime
> overhead in thread creation (the struct pthread cpuclock_offset
> initialization).
> 
> If hurd eventually wants to support them it should either either implement as
> a kernel facility (or something related due its architecture) or in system
> specific implementation.
> 
> Checked on aarch64-linux-gnu, x86_64-linux-gnu, and i686-linux-gnu. I also
> checked on a i686-gnu build.
> 
> 	* nptl/Makefile (libpthread-routines): Remove pthread_clock_gettime and
> 	pthread_clock_settime.
> 	* nptl/pthreadP.h (__find_thread_by_id): Remove prototype.
> 	* elf/dl-support.c [!HP_TIMING_NOAVAIL] (_dl_cpuclock_offset): Remove.
> 	(_dl_non_dynamic_init): Remove _dl_cpuclock_offset setting.
> 	* elf/rtld.c (_dl_start_final): Likewise.
> 	* nptl/allocatestack.c (__find_thread_by_id): Remove function.
> 	* sysdeps/generic/ldsodefs.h [!HP_TIMING_NOAVAIL] (_dl_cpuclock_offset):
> 	Remove.
> 	* sysdeps/mach/hurd/dl-sysdep.c [!HP_TIMING_NOAVAIL]
> 	(_dl_cpuclock_offset): Remove.
> 	* nptl/descr.h (struct pthread): Rename cpuclock_offset to
> 	cpuclock_offset_ununsed.
> 	* nptl/nptl-init.c (__pthread_initialize_minimal_internal): Remove
> 	cpuclock_offset set.
> 	* nptl/pthread_create.c (START_THREAD_DEFN): Likewise.
> 	* sysdeps/nptl/fork.c (__libc_fork): Likewise.
> 	* nptl/pthread_clock_gettime.c: Remove file.
> 	* nptl/pthread_clock_settime.c: Likewise.
> 	* sysdeps/unix/clock_gettime.c (hp_timing_gettime): Remove function.
> 	[HP_TIMING_AVAIL] (realtime_gettime): Remove CLOCK_THREAD_CPUTIME_ID
> 	and CLOCK_PROCESS_CPUTIME_ID support.
> 	* sysdeps/unix/clock_settime.c (hp_timing_gettime): Likewise.
> 	[HP_TIMING_AVAIL] (realtime_gettime): Likewise.
> 	* sysdeps/posix/clock_getres.c (hp_timing_getres): Likewise.
> 	[HP_TIMING_AVAIL] (__clock_getres): Likewise.
> 	* sysdeps/unix/clock_nanosleep.c (CPUCLOCK_P, INVALID_CLOCK_P):
> 	Likewise.
> 	(__clock_nanosleep): Remove CPUCLOCK_P and INVALID_CLOCK_P usage.
> 
> [1] http://man7.org/linux/man-pages/man2/clock_gettime.2.html
> ---
>  elf/dl-support.c               |  8 ----
>  elf/rtld.c                     |  2 -
>  nptl/Makefile                  |  1 -
>  nptl/allocatestack.c           | 48 ------------------------
>  nptl/descr.h                   |  3 +-
>  nptl/nptl-init.c               |  3 --
>  nptl/pthreadP.h                | 10 -----
>  nptl/pthread_clock_gettime.c   | 67 ----------------------------------
>  nptl/pthread_clock_settime.c   | 54 ---------------------------
>  nptl/pthread_create.c          |  7 ----
>  sysdeps/generic/ldsodefs.h     |  5 ---
>  sysdeps/mach/hurd/dl-sysdep.c  |  8 ----
>  sysdeps/nptl/fork.c            |  8 ----
>  sysdeps/posix/clock_getres.c   | 46 +----------------------
>  sysdeps/unix/clock_gettime.c   | 65 +--------------------------------
>  sysdeps/unix/clock_nanosleep.c | 30 ++-------------
>  sysdeps/unix/clock_settime.c   | 61 +------------------------------
>  17 files changed, 9 insertions(+), 417 deletions(-)
>  delete mode 100644 nptl/pthread_clock_gettime.c
>  delete mode 100644 nptl/pthread_clock_settime.c
> 
> diff --git a/elf/dl-support.c b/elf/dl-support.c
> index 42c350c75d..0a8b636d02 100644
> --- a/elf/dl-support.c
> +++ b/elf/dl-support.c
> @@ -129,11 +129,6 @@ void *_dl_random;
>  #include <dl-procruntime.c>
>  #include <dl-procinfo.c>
>  
> -/* Initial value of the CPU clock.  */
> -#ifndef HP_TIMING_NONAVAIL
> -hp_timing_t _dl_cpuclock_offset;
> -#endif
> -
>  void (*_dl_init_static_tls) (struct link_map *) = &_dl_nothread_init_static_tls;
>  
>  size_t _dl_pagesize = EXEC_PAGESIZE;
> @@ -314,9 +309,6 @@ _dl_non_dynamic_init (void)
>    _dl_main_map.l_phdr = GL(dl_phdr);
>    _dl_main_map.l_phnum = GL(dl_phnum);
>  
> -  if (HP_SMALL_TIMING_AVAIL)
> -    HP_TIMING_NOW (_dl_cpuclock_offset);
> -
>    _dl_verbose = *(getenv ("LD_WARN") ?: "") == '\0' ? 0 : 1;
>  
>    /* Set up the data structures for the system-supplied DSO early,
> diff --git a/elf/rtld.c b/elf/rtld.c
> index c1cc1b01f2..1f124b31fc 100644
> --- a/elf/rtld.c
> +++ b/elf/rtld.c
> @@ -403,8 +403,6 @@ _dl_start_final (void *arg, struct dl_start_final_info *info)
>  # endif
>  #endif
>  
> -  HP_TIMING_NOW (GL(dl_cpuclock_offset));
> -
>    /* Initialize the stack end variable.  */
>    __libc_stack_end = __builtin_frame_address (0);
>  
> diff --git a/nptl/Makefile b/nptl/Makefile
> index 5acfdcceff..f9bc5cc887 100644
> --- a/nptl/Makefile
> +++ b/nptl/Makefile
> @@ -109,7 +109,6 @@ libpthread-routines = nptl-init nptlfreeres vars events version pt-interp \
>  		      pthread_once \
>  		      old_pthread_atfork \
>  		      pthread_getcpuclockid \
> -		      pthread_clock_gettime pthread_clock_settime \
>  		      shm-directory \
>  		      sem_init sem_destroy \
>  		      sem_open sem_close sem_unlink \
> diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c
> index d8e8570a7d..fcbc46f0d7 100644
> --- a/nptl/allocatestack.c
> +++ b/nptl/allocatestack.c
> @@ -963,54 +963,6 @@ __reclaim_stacks (void)
>  }
>  
>  
> -#if HP_TIMING_AVAIL
> -# undef __find_thread_by_id
> -/* Find a thread given the thread ID.  */
> -attribute_hidden
> -struct pthread *
> -__find_thread_by_id (pid_t tid)
> -{
> -  struct pthread *result = NULL;
> -
> -  lll_lock (stack_cache_lock, LLL_PRIVATE);
> -
> -  /* Iterate over the list with system-allocated threads first.  */
> -  list_t *runp;
> -  list_for_each (runp, &stack_used)
> -    {
> -      struct pthread *curp;
> -
> -      curp = list_entry (runp, struct pthread, list);
> -
> -      if (curp->tid == tid)
> -	{
> -	  result = curp;
> -	  goto out;
> -	}
> -    }
> -
> -  /* Now the list with threads using user-allocated stacks.  */
> -  list_for_each (runp, &__stack_user)
> -    {
> -      struct pthread *curp;
> -
> -      curp = list_entry (runp, struct pthread, list);
> -
> -      if (curp->tid == tid)
> -	{
> -	  result = curp;
> -	  goto out;
> -	}
> -    }
> -
> - out:
> -  lll_unlock (stack_cache_lock, LLL_PRIVATE);
> -
> -  return result;
> -}
> -#endif
> -
> -
>  #ifdef SIGSETXID
>  static void
>  setxid_mark_thread (struct xid_command *cmdp, struct pthread *t)
> diff --git a/nptl/descr.h b/nptl/descr.h
> index 4ef33ae465..cb7d4c2282 100644
> --- a/nptl/descr.h
> +++ b/nptl/descr.h
> @@ -343,8 +343,7 @@ struct pthread
>    unsigned int setxid_futex;
>  
>  #if HP_TIMING_AVAIL
> -  /* Offset of the CPU clock at start thread start time.  */
> -  hp_timing_t cpuclock_offset;
> +  hp_timing_t cpuclock_offset_ununsed;
>  #endif
>  
>    /* If the thread waits to join another one the ID of the latter is
> diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c
> index b5895fabf3..6691211e4e 100644
> --- a/nptl/nptl-init.c
> +++ b/nptl/nptl-init.c
> @@ -276,9 +276,6 @@ __pthread_initialize_minimal_internal (void)
>    THREAD_SETMEM (pd, user_stack, true);
>    if (LLL_LOCK_INITIALIZER != 0)
>      THREAD_SETMEM (pd, lock, LLL_LOCK_INITIALIZER);
> -#if HP_TIMING_AVAIL
> -  THREAD_SETMEM (pd, cpuclock_offset, GL(dl_cpuclock_offset));
> -#endif
>  
>    /* Initialize the robust mutex data.  */
>    {
> diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h
> index 626bd4b096..f0facfdb7d 100644
> --- a/nptl/pthreadP.h
> +++ b/nptl/pthreadP.h
> @@ -401,16 +401,6 @@ extern int __pthread_multiple_threads attribute_hidden;
>  extern int *__libc_multiple_threads_ptr attribute_hidden;
>  #endif
>  
> -/* Find a thread given its TID.  */
> -extern struct pthread *__find_thread_by_id (pid_t tid) attribute_hidden
> -#ifdef SHARED
> -;
> -#else
> -weak_function;
> -#define __find_thread_by_id(tid) \
> -  (__find_thread_by_id ? (__find_thread_by_id) (tid) : (struct pthread *) NULL)
> -#endif
> -
>  extern void __pthread_init_static_tls (struct link_map *) attribute_hidden;
>  
>  extern size_t __pthread_get_minstack (const pthread_attr_t *attr);
> diff --git a/nptl/pthread_clock_gettime.c b/nptl/pthread_clock_gettime.c
> deleted file mode 100644
> index f1d9104b24..0000000000
> --- a/nptl/pthread_clock_gettime.c
> +++ /dev/null
> @@ -1,67 +0,0 @@
> -/* Copyright (C) 2001-2019 Free Software Foundation, Inc.
> -   This file is part of the GNU C Library.
> -
> -   The GNU C Library is free software; you can redistribute it and/or
> -   modify it under the terms of the GNU Lesser General Public License as
> -   published by the Free Software Foundation; either version 2.1 of the
> -   License, or (at your option) any later version.
> -
> -   The GNU C Library is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -   Lesser General Public License for more details.
> -
> -   You should have received a copy of the GNU Lesser General Public
> -   License along with the GNU C Library; see the file COPYING.LIB.  If
> -   not, see <http://www.gnu.org/licenses/>.  */
> -
> -#include <errno.h>
> -#include <stdlib.h>
> -#include <time.h>
> -#include "pthreadP.h"
> -
> -
> -#if HP_TIMING_AVAIL
> -int
> -__pthread_clock_gettime (clockid_t clock_id, hp_timing_t freq,
> -			 struct timespec *tp)
> -{
> -  hp_timing_t tsc;
> -
> -  /* Get the current counter.  */
> -  HP_TIMING_NOW (tsc);
> -
> -  /* This is the ID of the thread we are looking for.  */
> -  pid_t tid = ((unsigned int) clock_id) >> CLOCK_IDFIELD_SIZE;
> -
> -  /* Compute the offset since the start time of the process.  */
> -  if (tid == 0 || tid == THREAD_GETMEM (THREAD_SELF, tid))
> -    /* Our own clock.  */
> -    tsc -= THREAD_GETMEM (THREAD_SELF, cpuclock_offset);
> -  else
> -    {
> -      /* This is more complicated.  We have to locate the thread based
> -	 on the ID.  This means walking the list of existing
> -	 threads.  */
> -      struct pthread *thread = __find_thread_by_id (tid);
> -      if (thread == NULL)
> -	{
> -	  __set_errno (EINVAL);
> -	  return -1;
> -	}
> -
> -      /* There is a race here.  The thread might terminate and the stack
> -	 become unusable.  But this is the user's problem.  */
> -      tsc -= thread->cpuclock_offset;
> -    }
> -
> -  /* Compute the seconds.  */
> -  tp->tv_sec = tsc / freq;
> -
> -  /* And the nanoseconds.  This computation should be stable until
> -     we get machines with about 16GHz frequency.  */
> -  tp->tv_nsec = ((tsc % freq) * 1000000000ull) / freq;
> -
> -  return 0;
> -}
> -#endif
> diff --git a/nptl/pthread_clock_settime.c b/nptl/pthread_clock_settime.c
> deleted file mode 100644
> index 0fe6482f78..0000000000
> --- a/nptl/pthread_clock_settime.c
> +++ /dev/null
> @@ -1,54 +0,0 @@
> -/* Copyright (C) 2001-2019 Free Software Foundation, Inc.
> -   This file is part of the GNU C Library.
> -
> -   The GNU C Library is free software; you can redistribute it and/or
> -   modify it under the terms of the GNU Lesser General Public License as
> -   published by the Free Software Foundation; either version 2.1 of the
> -   License, or (at your option) any later version.
> -
> -   The GNU C Library is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -   Lesser General Public License for more details.
> -
> -   You should have received a copy of the GNU Lesser General Public
> -   License along with the GNU C Library; see the file COPYING.LIB.  If
> -   not, see <http://www.gnu.org/licenses/>.  */
> -
> -#include <errno.h>
> -#include <stdlib.h>
> -#include <time.h>
> -#include "pthreadP.h"
> -
> -
> -#if HP_TIMING_AVAIL
> -int
> -__pthread_clock_settime (clockid_t clock_id, hp_timing_t offset)
> -{
> -  /* This is the ID of the thread we are looking for.  */
> -  pid_t tid = ((unsigned int) clock_id) >> CLOCK_IDFIELD_SIZE;
> -
> -  /* Compute the offset since the start time of the process.  */
> -  if (tid == 0 || tid == THREAD_GETMEM (THREAD_SELF, tid))
> -    /* Our own clock.  */
> -    THREAD_SETMEM (THREAD_SELF, cpuclock_offset, offset);
> -  else
> -    {
> -      /* This is more complicated.  We have to locate the thread based
> -	 on the ID.  This means walking the list of existing
> -	 threads.  */
> -      struct pthread *thread = __find_thread_by_id (tid);
> -      if (thread == NULL)
> -	{
> -	  __set_errno (EINVAL);
> -	  return -1;
> -	}
> -
> -      /* There is a race here.  The thread might terminate and the stack
> -	 become unusable.  But this is the user's problem.  */
> -      thread->cpuclock_offset = offset;
> -    }
> -
> -  return 0;
> -}
> -#endif
> diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c
> index 2bd2b10727..18b7bbe765 100644
> --- a/nptl/pthread_create.c
> +++ b/nptl/pthread_create.c
> @@ -379,13 +379,6 @@ START_THREAD_DEFN
>  {
>    struct pthread *pd = START_THREAD_SELF;
>  
> -#if HP_TIMING_AVAIL
> -  /* Remember the time when the thread was started.  */
> -  hp_timing_t now;
> -  HP_TIMING_NOW (now);
> -  THREAD_SETMEM (pd, cpuclock_offset, now);
> -#endif
> -
>    /* Initialize resolver state pointer.  */
>    __resp = &pd->res;
>  
> diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
> index 37cab6f06b..346bbb812d 100644
> --- a/sysdeps/generic/ldsodefs.h
> +++ b/sysdeps/generic/ldsodefs.h
> @@ -352,11 +352,6 @@ struct rtld_global
>    /* The object to be initialized first.  */
>    EXTERN struct link_map *_dl_initfirst;
>  
> -#if HP_SMALL_TIMING_AVAIL
> -  /* Start time on CPU clock.  */
> -  EXTERN hp_timing_t _dl_cpuclock_offset;
> -#endif
> -
>    /* Map of shared object to be profiled.  */
>    EXTERN struct link_map *_dl_profile_map;
>  
> diff --git a/sysdeps/mach/hurd/dl-sysdep.c b/sysdeps/mach/hurd/dl-sysdep.c
> index a58338c930..72c80a8a46 100644
> --- a/sysdeps/mach/hurd/dl-sysdep.c
> +++ b/sysdeps/mach/hurd/dl-sysdep.c
> @@ -62,10 +62,6 @@ int __libc_multiple_libcs = 0;	/* Defining this here avoids the inclusion
>  void *__libc_stack_end = NULL;
>  rtld_hidden_data_def(__libc_stack_end)
>  
> -#if HP_TIMING_AVAIL
> -hp_timing_t _dl_cpuclock_offset;
> -#endif
> -
>  /* TODO: Initialize.  */
>  void *_dl_random attribute_relro = NULL;
>  
> @@ -246,10 +242,6 @@ unfmh();			/* XXX */
>    /* Initialize frequently used global variable.  */
>    GLRO(dl_pagesize) = __getpagesize ();
>  
> -#if HP_TIMING_AVAIL
> -  HP_TIMING_NOW (_dl_cpuclock_offset);
> -#endif
> -
>  fmh();				/* XXX */
>  
>    /* See hurd/hurdstartup.c; this deals with getting information
> diff --git a/sysdeps/nptl/fork.c b/sysdeps/nptl/fork.c
> index 14b69a6f89..3f357665bd 100644
> --- a/sysdeps/nptl/fork.c
> +++ b/sysdeps/nptl/fork.c
> @@ -83,14 +83,6 @@ __libc_fork (void)
>        if (__fork_generation_pointer != NULL)
>  	*__fork_generation_pointer += __PTHREAD_ONCE_FORK_GEN_INCR;
>  
> -#if HP_TIMING_AVAIL
> -      /* The CPU clock of the thread and process have to be set to zero.  */
> -      hp_timing_t now;
> -      HP_TIMING_NOW (now);
> -      THREAD_SETMEM (self, cpuclock_offset, now);
> -      GL(dl_cpuclock_offset) = now;
> -#endif
> -
>  #ifdef __NR_set_robust_list
>        /* Initialize the robust mutex list setting in the kernel which has
>  	 been reset during the fork.  We do not check for errors because if
> diff --git a/sysdeps/posix/clock_getres.c b/sysdeps/posix/clock_getres.c
> index dac4761fcc..01024a3f55 100644
> --- a/sysdeps/posix/clock_getres.c
> +++ b/sysdeps/posix/clock_getres.c
> @@ -24,37 +24,6 @@
>  #include <libc-internal.h>
>  
>  
> -#if HP_TIMING_AVAIL
> -static long int nsec;		/* Clock frequency of the processor.  */
> -
> -static int
> -hp_timing_getres (struct timespec *res)
> -{
> -  if (__glibc_unlikely (nsec == 0))
> -    {
> -      hp_timing_t freq;
> -
> -      /* This can only happen if we haven't initialized the `nsec'
> -	 variable yet.  Do this now.  We don't have to protect this
> -	 code against multiple execution since all of them should
> -	 lead to the same result.  */
> -      freq = __get_clockfreq ();
> -      if (__glibc_unlikely (freq == 0))
> -	/* Something went wrong.  */
> -	return -1;
> -
> -      nsec = MAX (UINT64_C (1000000000) / freq, 1);
> -    }
> -
> -  /* Fill in the values.
> -     The seconds are always zero (unless we have a 1Hz machine).  */
> -  res->tv_sec = 0;
> -  res->tv_nsec = nsec;
> -
> -  return 0;
> -}
> -#endif
> -
>  static inline int
>  realtime_getres (struct timespec *res)
>  {
> @@ -87,21 +56,8 @@ __clock_getres (clockid_t clock_id, struct timespec *res)
>        break;
>  
>      default:
> -#if HP_TIMING_AVAIL
> -      if ((clock_id & ((1 << CLOCK_IDFIELD_SIZE) - 1))
> -	  == CLOCK_THREAD_CPUTIME_ID)
> -	retval = hp_timing_getres (res);
> -      else
> -#endif
> -	__set_errno (EINVAL);
> -      break;
> -
> -#if HP_TIMING_AVAIL
> -    case CLOCK_PROCESS_CPUTIME_ID:
> -    case CLOCK_THREAD_CPUTIME_ID:
> -      retval = hp_timing_getres (res);
> +      __set_errno (EINVAL);
>        break;
> -#endif
>      }
>  
>    return retval;
> diff --git a/sysdeps/unix/clock_gettime.c b/sysdeps/unix/clock_gettime.c
> index 33a1f3335c..10a6c96d9d 100644
> --- a/sysdeps/unix/clock_gettime.c
> +++ b/sysdeps/unix/clock_gettime.c
> @@ -24,57 +24,6 @@
>  #include <ldsodefs.h>
>  
>  
> -#if HP_TIMING_AVAIL
> -/* Clock frequency of the processor.  We make it a 64-bit variable
> -   because some jokers are already playing with processors with more
> -   than 4GHz.  */
> -static hp_timing_t freq;
> -
> -
> -/* This function is defined in the thread library.  */
> -extern int __pthread_clock_gettime (clockid_t clock_id, hp_timing_t freq,
> -				    struct timespec *tp)
> -     __attribute__ ((__weak__));
> -
> -static int
> -hp_timing_gettime (clockid_t clock_id, struct timespec *tp)
> -{
> -  hp_timing_t tsc;
> -
> -  if (__glibc_unlikely (freq == 0))
> -    {
> -      /* This can only happen if we haven't initialized the `freq'
> -	 variable yet.  Do this now. We don't have to protect this
> -	 code against multiple execution since all of them should
> -	 lead to the same result.  */
> -      freq = __get_clockfreq ();
> -      if (__glibc_unlikely (freq == 0))
> -	/* Something went wrong.  */
> -	return -1;
> -    }
> -
> -  if (clock_id != CLOCK_PROCESS_CPUTIME_ID
> -      && __pthread_clock_gettime != NULL)
> -    return __pthread_clock_gettime (clock_id, freq, tp);
> -
> -  /* Get the current counter.  */
> -  HP_TIMING_NOW (tsc);
> -
> -  /* Compute the offset since the start time of the process.  */
> -  tsc -= GL(dl_cpuclock_offset);
> -
> -  /* Compute the seconds.  */
> -  tp->tv_sec = tsc / freq;
> -
> -  /* And the nanoseconds.  This computation should be stable until
> -     we get machines with about 16GHz frequency.  */
> -  tp->tv_nsec = ((tsc % freq) * UINT64_C (1000000000)) / freq;
> -
> -  return 0;
> -}
> -#endif
> -
> -
>  static inline int
>  realtime_gettime (struct timespec *tp)
>  {
> @@ -105,20 +54,8 @@ __clock_gettime (clockid_t clock_id, struct timespec *tp)
>        break;
>  
>      default:
> -#if HP_TIMING_AVAIL
> -      if ((clock_id & ((1 << CLOCK_IDFIELD_SIZE) - 1))
> -	  == CLOCK_THREAD_CPUTIME_ID)
> -	retval = hp_timing_gettime (clock_id, tp);
> -      else
> -#endif
> -	__set_errno (EINVAL);
> -      break;
> -
> -#if HP_TIMING_AVAIL
> -    case CLOCK_PROCESS_CPUTIME_ID:
> -      retval = hp_timing_gettime (clock_id, tp);
> +      __set_errno (EINVAL);
>        break;
> -#endif
>      }
>  
>    return retval;
> diff --git a/sysdeps/unix/clock_nanosleep.c b/sysdeps/unix/clock_nanosleep.c
> index 7722d1111c..b27608570c 100644
> --- a/sysdeps/unix/clock_nanosleep.c
> +++ b/sysdeps/unix/clock_nanosleep.c
> @@ -19,23 +19,8 @@
>  #include <assert.h>
>  #include <errno.h>
>  #include <time.h>
> -#include <hp-timing.h>
>  #include <sysdep-cancel.h>
>  
> -#if HP_TIMING_AVAIL
> -# define CPUCLOCK_P(clock) \
> -  ((clock) == CLOCK_PROCESS_CPUTIME_ID					      \
> -   || ((clock) & ((1 << CLOCK_IDFIELD_SIZE) - 1)) == CLOCK_THREAD_CPUTIME_ID)
> -#else
> -# define CPUCLOCK_P(clock) 0
> -#endif
> -
> -#ifndef INVALID_CLOCK_P
> -# define INVALID_CLOCK_P(cl) \
> -  ((cl) < CLOCK_REALTIME || (cl) > CLOCK_THREAD_CPUTIME_ID)
> -#endif
> -
> -
>  /* This implementation assumes that these is only a `nanosleep' system
>     call.  So we have to remap all other activities.  */
>  int
> @@ -51,14 +36,7 @@ __clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req,
>    if (clock_id == CLOCK_THREAD_CPUTIME_ID)
>      return EINVAL;		/* POSIX specifies EINVAL for this case.  */
>  
> -#ifdef SYSDEP_NANOSLEEP
> -  SYSDEP_NANOSLEEP;
> -#endif
> -
> -  if (CPUCLOCK_P (clock_id))
> -    return ENOTSUP;
> -
> -  if (INVALID_CLOCK_P (clock_id))
> +  if (clock_id < CLOCK_REALTIME || clock_id > CLOCK_THREAD_CPUTIME_ID)
>      return EINVAL;
>  
>    /* If we got an absolute time, remap it.  */
> @@ -71,7 +49,7 @@ __clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req,
>        assert (sizeof (sec) >= sizeof (now.tv_sec));
>  
>        /* Get the current time for this clock.  */
> -      if (__builtin_expect (__clock_gettime (clock_id, &now), 0) != 0)
> +      if (__clock_gettime (clock_id, &now) != 0)
>  	return errno;
>  
>        /* Compute the difference.  */
> @@ -90,12 +68,12 @@ __clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req,
>        /* Make sure we are not modifying the struct pointed to by REM.  */
>        rem = NULL;
>      }
> -  else if (__builtin_expect (flags, 0) != 0)
> +  else if (flags != 0)
>      return EINVAL;
>    else if (clock_id != CLOCK_REALTIME)
>      /* Not supported.  */
>      return ENOTSUP;
>  
> -  return __builtin_expect (__nanosleep (req, rem), 0) ? errno : 0;
> +  return __nanosleep (req, rem), 0 ? errno : 0;
>  }
>  weak_alias (__clock_nanosleep, clock_nanosleep)
> diff --git a/sysdeps/unix/clock_settime.c b/sysdeps/unix/clock_settime.c
> index dcf9ff660a..109a1ad872 100644
> --- a/sysdeps/unix/clock_settime.c
> +++ b/sysdeps/unix/clock_settime.c
> @@ -21,59 +21,11 @@
>  #include <ldsodefs.h>
>  
>  
> -#if HP_TIMING_AVAIL
> -/* Clock frequency of the processor.  We make it a 64-bit variable
> -   because some jokers are already playing with processors with more
> -   than 4GHz.  */
> -static hp_timing_t freq;
> -
> -
> -/* This function is defined in the thread library.  */
> -extern void __pthread_clock_settime (clockid_t clock_id, hp_timing_t offset)
> -     __attribute__ ((__weak__));
> -
> -
> -static int
> -hp_timing_settime (clockid_t clock_id, const struct timespec *tp)
> -{
> -  hp_timing_t tsc;
> -  hp_timing_t usertime;
> -
> -  /* First thing is to get the current time.  */
> -  HP_TIMING_NOW (tsc);
> -
> -  if (__glibc_unlikely (freq == 0))
> -    {
> -      /* This can only happen if we haven't initialized the `freq'
> -	 variable yet.  Do this now. We don't have to protect this
> -	 code against multiple execution since all of them should lead
> -	 to the same result.  */
> -      freq = __get_clockfreq ();
> -      if (__glibc_unlikely (freq == 0))
> -	/* Something went wrong.  */
> -	return -1;
> -    }
> -
> -  /* Convert the user-provided time into CPU ticks.  */
> -  usertime = tp->tv_sec * freq + (tp->tv_nsec * freq) / 1000000000ull;
> -
> -  /* Determine the offset and use it as the new base value.  */
> -  if (clock_id == CLOCK_PROCESS_CPUTIME_ID
> -      || __pthread_clock_settime == NULL)
> -    GL(dl_cpuclock_offset) = tsc - usertime;
> -  else
> -    __pthread_clock_settime (clock_id, tsc - usertime);
> -
> -  return 0;
> -}
> -#endif
> -
> -
>  /* Set CLOCK to value TP.  */
>  int
>  __clock_settime (clockid_t clock_id, const struct timespec *tp)
>  {
> -  int retval;
> +  int retval = -1;
>  
>    /* Make sure the time cvalue is OK.  */
>    if (tp->tv_nsec < 0 || tp->tv_nsec >= 1000000000)
> @@ -93,16 +45,7 @@ __clock_settime (clockid_t clock_id, const struct timespec *tp)
>        break;
>  
>      default:
> -# if HP_TIMING_AVAIL
> -      if (CPUCLOCK_WHICH (clock_id) == CLOCK_PROCESS_CPUTIME_ID
> -	  || CPUCLOCK_WHICH (clock_id) == CLOCK_THREAD_CPUTIME_ID)
> -	retval = hp_timing_settime (clock_id, tp);
> -      else
> -# endif
> -	{
> -	  __set_errno (EINVAL);
> -	  retval = -1;
> -	}
> +      __set_errno (EINVAL);
>        break;
>      }
>  
> 

  parent reply	other threads:[~2019-03-19 17:24 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-18 21:11 [PATCH v2 1/6] nptl: Remove pthread_clock_gettime pthread_clock_settime Adhemerval Zanella
2019-02-18 21:11 ` [PATCH v2 2/6] linux: Assume clock_getres CLOCK_{PROCESS,THREAD}_CPUTIME_ID Adhemerval Zanella
2019-03-19 17:24   ` Adhemerval Zanella
2019-03-20 11:49   ` Andreas Schwab
2019-03-20 14:13     ` Adhemerval Zanella
2019-03-20 14:39       ` Andreas Schwab
2019-02-18 21:11 ` [PATCH v2 3/6] Remove __get_clockfreq Adhemerval Zanella
2019-03-19 17:24   ` Adhemerval Zanella
2019-02-18 21:11 ` [PATCH v2 4/6] Do not use HP_TIMING_NOW for random bits Adhemerval Zanella
2019-02-18 21:11 ` [PATCH v2 5/6] Refactor hp-timing rtld usage Adhemerval Zanella
2019-02-18 21:11 ` [PATCH v2 6/6] Add generic hp-timing support Adhemerval Zanella
2019-03-19 17:23 ` Adhemerval Zanella [this message]
2019-03-20 11:32 ` [PATCH v2 1/6] nptl: Remove pthread_clock_gettime pthread_clock_settime Andreas Schwab

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

  List information: https://www.gnu.org/software/libc/involved.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5a213c63-a2ef-9d43-bdd3-95608fd0db68@linaro.org \
    --to=adhemerval.zanella@linaro.org \
    --cc=libc-alpha@sourceware.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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).