1
1

Merge pull request #2596 from hjelmn/x86_rtdtsc

opal/timer: add code to check if rtdtsc is core invariant
Этот коммит содержится в:
Nathan Hjelm 2016-12-17 11:14:49 -07:00 коммит произвёл GitHub
родитель bd1828c54d a718743a5c
Коммит 16a2f09cd5
3 изменённых файлов: 44 добавлений и 14 удалений

Просмотреть файл

@ -1,3 +1,4 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
@ -9,6 +10,8 @@
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2016 Los Alamos National Security, LLC. ALl rights
* reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -56,7 +59,24 @@ opal_sys_timer_get_cycles(void)
return ((opal_timer_t)l) | (((opal_timer_t)h) << 32);
}
static inline bool opal_sys_timer_is_monotonic (void)
{
int32_t cpuid1, cpuid2, tmp;
const int32_t level = 0x80000007;
/* cpuid clobbers ebx but it must be restored for -fPIC so save
* then restore ebx */
__asm__ volatile ("xchgl %%ebx, %2\n"
"cpuid\n"
"xchgl %%ebx, %2\n":
"=a" (cpuid1), "=d" (cpuid2), "=r" (tmp) :
"a" (level) :
"ecx");
/* bit 8 of edx contains the invariant tsc flag */
return !!(cpuid2 & (1 << 8));
}
#define OPAL_HAVE_SYS_TIMER_GET_CYCLES 1
#define OPAL_HAVE_SYS_TIMER_IS_MONOTONIC 1
#else

Просмотреть файл

@ -1,3 +1,4 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
@ -10,6 +11,8 @@
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2016 Broadcom Limited. All rights reserved.
* Copyright (c) 2016 Los Alamos National Security, LLC. All rights
* reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -111,6 +114,17 @@ typedef long opal_timer_t;
#endif
#endif
#ifndef OPAL_HAVE_SYS_TIMER_IS_MONOTONIC
#define OPAL_HAVE_SYS_TIMER_IS_MONOTONIC 1
static inline bool opal_sys_timer_is_monotonic (void)
{
return OPAL_TIMER_MONOTONIC;
}
#endif
END_C_DECLS
#endif /* OPAL_SYS_TIMER_H */

Просмотреть файл

@ -12,7 +12,7 @@
* All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2015 Los Alamos National Security, LLC. All rights
* Copyright (c) 2015-2016 Los Alamos National Security, LLC. All rights
* reserved.
* Copyright (c) 2015 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2016 Broadcom Limited. All rights reserved.
@ -162,7 +162,7 @@ int opal_timer_linux_open(void)
{
int ret = OPAL_SUCCESS;
if(mca_timer_base_monotonic) {
if (mca_timer_base_monotonic && !opal_sys_timer_is_monotonic ()) {
#if OPAL_HAVE_CLOCK_GETTIME && (0 == OPAL_TIMER_MONOTONIC)
struct timespec res;
if( 0 == clock_getres(CLOCK_MONOTONIC, &res)) {
@ -172,10 +172,8 @@ int opal_timer_linux_open(void)
return ret;
}
#else
#if (0 == OPAL_TIMER_MONOTONIC)
/* Monotonic time requested but cannot be found. Complain! */
opal_show_help("help-opal-timer-linux.txt", "monotonic not supported", true);
#endif /* (0 == OPAL_TIMER_MONOTONIC) */
#endif /* OPAL_HAVE_CLOCK_GETTIME && (0 == OPAL_TIMER_MONOTONIC) */
}
ret = opal_timer_linux_find_freq();
@ -187,22 +185,20 @@ int opal_timer_linux_open(void)
#if OPAL_HAVE_CLOCK_GETTIME
opal_timer_t opal_timer_base_get_usec_clock_gettime(void)
{
struct timespec tp;
struct timespec tp = {.tv_sec = 0, .tv_nsec = 0};
if( 0 == clock_gettime(CLOCK_MONOTONIC, &tp) ) {
return (tp.tv_sec * 1e6 + tp.tv_nsec/1000);
}
return 0;
(void) clock_gettime (CLOCK_MONOTONIC, &tp);
return (tp.tv_sec * 1e6 + tp.tv_nsec/1000);
}
opal_timer_t opal_timer_base_get_cycles_clock_gettime(void)
{
struct timespec tp;
struct timespec tp = {.tv_sec = 0, .tv_nsec = 0};
if( 0 == clock_gettime(CLOCK_MONOTONIC, &tp) ) {
return (tp.tv_sec * 1e9 + tp.tv_nsec);
}
return 0;
(void) clock_gettime(CLOCK_MONOTONIC, &tp);
return (tp.tv_sec * 1e9 + tp.tv_nsec);
}
#endif /* OPAL_HAVE_CLOCK_GETTIME */