summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
9f68fe3)
There is an issue introduced with "commit
73df3e07 gettime: offset CPU cycle
counter by initial value". For architectures which define
ARCH_CPU_CLOCK_CYCLES_PER_USEC (currently only s390) this causes a build
error
gettime.c:174:11: error: ‘cycles_start’ undeclared (first use in this
function)
if (t < cycles_start && !cycles_wrap)
To make sure variables and code are only compiled in the same cases I
added a
clock definition called ARCH_CPU_CLOCK_WRAPS. We could merge
ARCH_CPU_CLOCK_WRAPS and the existing ARCH_CPU_CLOCK_CYCLES_PER_USEC
into one
if you prefer, so far nobody else uses it.
To avoid cluttering all architecture headers I enabled it by default in
arch-generic.h, so any arch not needing the wrap handling can undef
ARCH_CPU_CLOCK_WRAPS later in their headers.
Signed-off-by: Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
#define ARCH_CPU_CLOCK_CYCLES_PER_USEC 1
#define ARCH_HAVE_CPU_CLOCK
#define ARCH_CPU_CLOCK_CYCLES_PER_USEC 1
#define ARCH_HAVE_CPU_CLOCK
+#undef ARCH_CPU_CLOCK_WRAPS
#define ARCH_HAVE_INIT
extern int tsc_reliable;
#define ARCH_HAVE_INIT
extern int tsc_reliable;
extern unsigned long arch_flags;
extern unsigned long arch_flags;
+#define ARCH_CPU_CLOCK_WRAPS
+
#if defined(__i386__)
#include "arch-x86.h"
#elif defined(__x86_64__)
#if defined(__i386__)
#include "arch-x86.h"
#elif defined(__x86_64__)
static unsigned long cycles_per_usec;
static unsigned long inv_cycles_per_usec;
static uint64_t max_cycles_for_mult;
static unsigned long cycles_per_usec;
static unsigned long inv_cycles_per_usec;
static uint64_t max_cycles_for_mult;
+#endif
+#ifdef ARCH_CPU_CLOCK_WRAPS
static unsigned long long cycles_start, cycles_wrap;
#endif
int tsc_reliable = 0;
static unsigned long long cycles_start, cycles_wrap;
#endif
int tsc_reliable = 0;
#endif
t = get_cpu_clock();
#endif
t = get_cpu_clock();
+#ifdef ARCH_CPU_CLOCK_WRAPS
if (t < cycles_start && !cycles_wrap)
cycles_wrap = 1;
else if (cycles_wrap && t >= cycles_start && !tv->warned) {
if (t < cycles_start && !cycles_wrap)
cycles_wrap = 1;
else if (cycles_wrap && t >= cycles_start && !tv->warned) {
tv->last_cycles = t;
tv->last_tv_valid = 1;
#ifdef ARCH_CPU_CLOCK_CYCLES_PER_USEC
tv->last_cycles = t;
tv->last_tv_valid = 1;
#ifdef ARCH_CPU_CLOCK_CYCLES_PER_USEC
inv_cycles_per_usec = 16777216UL / cycles_per_usec;
max_cycles_for_mult = ~0ULL / inv_cycles_per_usec;
dprint(FD_TIME, "inv_cycles_per_usec=%lu\n", inv_cycles_per_usec);
inv_cycles_per_usec = 16777216UL / cycles_per_usec;
max_cycles_for_mult = ~0ULL / inv_cycles_per_usec;
dprint(FD_TIME, "inv_cycles_per_usec=%lu\n", inv_cycles_per_usec);
+#ifdef ARCH_CPU_CLOCK_WRAPS
cycles_start = get_cpu_clock();
dprint(FD_TIME, "cycles_start=%llu\n", cycles_start);
cycles_start = get_cpu_clock();
dprint(FD_TIME, "cycles_start=%llu\n", cycles_start);