Merge remote-tracking branch 'tip/perf/urgent' into perf/core
To pick up fixes. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
@@ -377,6 +377,7 @@ struct kvm_sync_regs {
|
||||
|
||||
#define KVM_X86_QUIRK_LINT0_REENABLED (1 << 0)
|
||||
#define KVM_X86_QUIRK_CD_NW_CLEARED (1 << 1)
|
||||
#define KVM_X86_QUIRK_LAPIC_MMIO_HOLE (1 << 2)
|
||||
|
||||
#define KVM_STATE_NESTED_GUEST_MODE 0x00000001
|
||||
#define KVM_STATE_NESTED_RUN_PENDING 0x00000002
|
||||
|
||||
@@ -234,6 +234,7 @@ int main(int argc, char *argv[])
|
||||
break;
|
||||
|
||||
default:
|
||||
error = HV_E_FAIL;
|
||||
syslog(LOG_ERR, "Unknown operation: %d",
|
||||
buffer.hdr.operation);
|
||||
|
||||
|
||||
@@ -952,6 +952,7 @@ struct kvm_ppc_resize_hpt {
|
||||
#define KVM_CAP_S390_HPAGE_1M 156
|
||||
#define KVM_CAP_NESTED_STATE 157
|
||||
#define KVM_CAP_ARM_INJECT_SERROR_ESR 158
|
||||
#define KVM_CAP_MSR_PLATFORM_INFO 159
|
||||
|
||||
#ifdef KVM_CAP_IRQ_ROUTING
|
||||
|
||||
|
||||
@@ -1325,7 +1325,7 @@ class Tui(object):
|
||||
msg = ''
|
||||
while True:
|
||||
self.screen.erase()
|
||||
self.screen.addstr(0, 0, 'Set update interval (defaults to %fs).' %
|
||||
self.screen.addstr(0, 0, 'Set update interval (defaults to %.1fs).' %
|
||||
DELAY_DEFAULT, curses.A_BOLD)
|
||||
self.screen.addstr(4, 0, msg)
|
||||
self.screen.addstr(2, 0, 'Change delay from %.1fs to ' %
|
||||
|
||||
@@ -36,7 +36,7 @@ static const char *tracing_path_tracefs_mount(void)
|
||||
|
||||
__tracing_path_set("", mnt);
|
||||
|
||||
return mnt;
|
||||
return tracing_path;
|
||||
}
|
||||
|
||||
static const char *tracing_path_debugfs_mount(void)
|
||||
@@ -49,7 +49,7 @@ static const char *tracing_path_debugfs_mount(void)
|
||||
|
||||
__tracing_path_set("tracing/", mnt);
|
||||
|
||||
return mnt;
|
||||
return tracing_path;
|
||||
}
|
||||
|
||||
const char *tracing_path_mount(void)
|
||||
|
||||
@@ -833,7 +833,7 @@ ifndef NO_JVMTI
|
||||
JDIR=$(shell /usr/sbin/update-java-alternatives -l | head -1 | awk '{print $$3}')
|
||||
else
|
||||
ifneq (,$(wildcard /usr/sbin/alternatives))
|
||||
JDIR=$(shell alternatives --display java | tail -1 | cut -d' ' -f 5 | sed 's%/jre/bin/java.%%g')
|
||||
JDIR=$(shell /usr/sbin/alternatives --display java | tail -1 | cut -d' ' -f 5 | sed 's%/jre/bin/java.%%g')
|
||||
endif
|
||||
endif
|
||||
ifndef JDIR
|
||||
|
||||
@@ -635,7 +635,7 @@ $(LIBPERF_IN): prepare FORCE
|
||||
$(LIB_FILE): $(LIBPERF_IN)
|
||||
$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $(LIBPERF_IN) $(LIB_OBJS)
|
||||
|
||||
LIBTRACEEVENT_FLAGS += plugin_dir=$(plugindir_SQ)
|
||||
LIBTRACEEVENT_FLAGS += plugin_dir=$(plugindir_SQ) 'EXTRA_CFLAGS=$(EXTRA_CFLAGS)' 'LDFLAGS=$(LDFLAGS)'
|
||||
|
||||
$(LIBTRACEEVENT): FORCE
|
||||
$(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) $(OUTPUT)libtraceevent.a
|
||||
|
||||
@@ -980,6 +980,7 @@ int cmd_report(int argc, const char **argv)
|
||||
.id_index = perf_event__process_id_index,
|
||||
.auxtrace_info = perf_event__process_auxtrace_info,
|
||||
.auxtrace = perf_event__process_auxtrace,
|
||||
.event_update = perf_event__process_event_update,
|
||||
.feature = process_feature_event,
|
||||
.ordered_events = true,
|
||||
.ordering_requires_timestamps = true,
|
||||
|
||||
@@ -188,7 +188,7 @@
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xb",
|
||||
"EventName": "UNC_P_FREQ_GE_1200MHZ_CYCLES",
|
||||
"Filter": "filter_band0=1200",
|
||||
"Filter": "filter_band0=12",
|
||||
"MetricExpr": "(UNC_P_FREQ_GE_1200MHZ_CYCLES / UNC_P_CLOCKTICKS) * 100.",
|
||||
"MetricName": "freq_ge_1200mhz_cycles %",
|
||||
"PerPkg": "1",
|
||||
@@ -199,7 +199,7 @@
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xc",
|
||||
"EventName": "UNC_P_FREQ_GE_2000MHZ_CYCLES",
|
||||
"Filter": "filter_band1=2000",
|
||||
"Filter": "filter_band1=20",
|
||||
"MetricExpr": "(UNC_P_FREQ_GE_2000MHZ_CYCLES / UNC_P_CLOCKTICKS) * 100.",
|
||||
"MetricName": "freq_ge_2000mhz_cycles %",
|
||||
"PerPkg": "1",
|
||||
@@ -210,7 +210,7 @@
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xd",
|
||||
"EventName": "UNC_P_FREQ_GE_3000MHZ_CYCLES",
|
||||
"Filter": "filter_band2=3000",
|
||||
"Filter": "filter_band2=30",
|
||||
"MetricExpr": "(UNC_P_FREQ_GE_3000MHZ_CYCLES / UNC_P_CLOCKTICKS) * 100.",
|
||||
"MetricName": "freq_ge_3000mhz_cycles %",
|
||||
"PerPkg": "1",
|
||||
@@ -221,7 +221,7 @@
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xe",
|
||||
"EventName": "UNC_P_FREQ_GE_4000MHZ_CYCLES",
|
||||
"Filter": "filter_band3=4000",
|
||||
"Filter": "filter_band3=40",
|
||||
"MetricExpr": "(UNC_P_FREQ_GE_4000MHZ_CYCLES / UNC_P_CLOCKTICKS) * 100.",
|
||||
"MetricName": "freq_ge_4000mhz_cycles %",
|
||||
"PerPkg": "1",
|
||||
@@ -232,7 +232,7 @@
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xb",
|
||||
"EventName": "UNC_P_FREQ_GE_1200MHZ_TRANSITIONS",
|
||||
"Filter": "edge=1,filter_band0=1200",
|
||||
"Filter": "edge=1,filter_band0=12",
|
||||
"MetricExpr": "(UNC_P_FREQ_GE_1200MHZ_CYCLES / UNC_P_CLOCKTICKS) * 100.",
|
||||
"MetricName": "freq_ge_1200mhz_cycles %",
|
||||
"PerPkg": "1",
|
||||
@@ -243,7 +243,7 @@
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xc",
|
||||
"EventName": "UNC_P_FREQ_GE_2000MHZ_TRANSITIONS",
|
||||
"Filter": "edge=1,filter_band1=2000",
|
||||
"Filter": "edge=1,filter_band1=20",
|
||||
"MetricExpr": "(UNC_P_FREQ_GE_2000MHZ_CYCLES / UNC_P_CLOCKTICKS) * 100.",
|
||||
"MetricName": "freq_ge_2000mhz_cycles %",
|
||||
"PerPkg": "1",
|
||||
@@ -254,7 +254,7 @@
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xd",
|
||||
"EventName": "UNC_P_FREQ_GE_3000MHZ_TRANSITIONS",
|
||||
"Filter": "edge=1,filter_band2=4000",
|
||||
"Filter": "edge=1,filter_band2=30",
|
||||
"MetricExpr": "(UNC_P_FREQ_GE_3000MHZ_CYCLES / UNC_P_CLOCKTICKS) * 100.",
|
||||
"MetricName": "freq_ge_3000mhz_cycles %",
|
||||
"PerPkg": "1",
|
||||
@@ -265,7 +265,7 @@
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xe",
|
||||
"EventName": "UNC_P_FREQ_GE_4000MHZ_TRANSITIONS",
|
||||
"Filter": "edge=1,filter_band3=4000",
|
||||
"Filter": "edge=1,filter_band3=40",
|
||||
"MetricExpr": "(UNC_P_FREQ_GE_4000MHZ_CYCLES / UNC_P_CLOCKTICKS) * 100.",
|
||||
"MetricName": "freq_ge_4000mhz_cycles %",
|
||||
"PerPkg": "1",
|
||||
|
||||
@@ -187,7 +187,7 @@
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xb",
|
||||
"EventName": "UNC_P_FREQ_GE_1200MHZ_CYCLES",
|
||||
"Filter": "filter_band0=1200",
|
||||
"Filter": "filter_band0=12",
|
||||
"MetricExpr": "(UNC_P_FREQ_GE_1200MHZ_CYCLES / UNC_P_CLOCKTICKS) * 100.",
|
||||
"MetricName": "freq_ge_1200mhz_cycles %",
|
||||
"PerPkg": "1",
|
||||
@@ -198,7 +198,7 @@
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xc",
|
||||
"EventName": "UNC_P_FREQ_GE_2000MHZ_CYCLES",
|
||||
"Filter": "filter_band1=2000",
|
||||
"Filter": "filter_band1=20",
|
||||
"MetricExpr": "(UNC_P_FREQ_GE_2000MHZ_CYCLES / UNC_P_CLOCKTICKS) * 100.",
|
||||
"MetricName": "freq_ge_2000mhz_cycles %",
|
||||
"PerPkg": "1",
|
||||
@@ -209,7 +209,7 @@
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xd",
|
||||
"EventName": "UNC_P_FREQ_GE_3000MHZ_CYCLES",
|
||||
"Filter": "filter_band2=3000",
|
||||
"Filter": "filter_band2=30",
|
||||
"MetricExpr": "(UNC_P_FREQ_GE_3000MHZ_CYCLES / UNC_P_CLOCKTICKS) * 100.",
|
||||
"MetricName": "freq_ge_3000mhz_cycles %",
|
||||
"PerPkg": "1",
|
||||
@@ -220,7 +220,7 @@
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xe",
|
||||
"EventName": "UNC_P_FREQ_GE_4000MHZ_CYCLES",
|
||||
"Filter": "filter_band3=4000",
|
||||
"Filter": "filter_band3=40",
|
||||
"MetricExpr": "(UNC_P_FREQ_GE_4000MHZ_CYCLES / UNC_P_CLOCKTICKS) * 100.",
|
||||
"MetricName": "freq_ge_4000mhz_cycles %",
|
||||
"PerPkg": "1",
|
||||
@@ -231,7 +231,7 @@
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xb",
|
||||
"EventName": "UNC_P_FREQ_GE_1200MHZ_TRANSITIONS",
|
||||
"Filter": "edge=1,filter_band0=1200",
|
||||
"Filter": "edge=1,filter_band0=12",
|
||||
"MetricExpr": "(UNC_P_FREQ_GE_1200MHZ_CYCLES / UNC_P_CLOCKTICKS) * 100.",
|
||||
"MetricName": "freq_ge_1200mhz_cycles %",
|
||||
"PerPkg": "1",
|
||||
@@ -242,7 +242,7 @@
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xc",
|
||||
"EventName": "UNC_P_FREQ_GE_2000MHZ_TRANSITIONS",
|
||||
"Filter": "edge=1,filter_band1=2000",
|
||||
"Filter": "edge=1,filter_band1=20",
|
||||
"MetricExpr": "(UNC_P_FREQ_GE_2000MHZ_CYCLES / UNC_P_CLOCKTICKS) * 100.",
|
||||
"MetricName": "freq_ge_2000mhz_cycles %",
|
||||
"PerPkg": "1",
|
||||
@@ -253,7 +253,7 @@
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xd",
|
||||
"EventName": "UNC_P_FREQ_GE_3000MHZ_TRANSITIONS",
|
||||
"Filter": "edge=1,filter_band2=4000",
|
||||
"Filter": "edge=1,filter_band2=30",
|
||||
"MetricExpr": "(UNC_P_FREQ_GE_3000MHZ_CYCLES / UNC_P_CLOCKTICKS) * 100.",
|
||||
"MetricName": "freq_ge_3000mhz_cycles %",
|
||||
"PerPkg": "1",
|
||||
@@ -264,7 +264,7 @@
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xe",
|
||||
"EventName": "UNC_P_FREQ_GE_4000MHZ_TRANSITIONS",
|
||||
"Filter": "edge=1,filter_band3=4000",
|
||||
"Filter": "edge=1,filter_band3=40",
|
||||
"MetricExpr": "(UNC_P_FREQ_GE_4000MHZ_CYCLES / UNC_P_CLOCKTICKS) * 100.",
|
||||
"MetricName": "freq_ge_4000mhz_cycles %",
|
||||
"PerPkg": "1",
|
||||
|
||||
@@ -1081,6 +1081,7 @@ void *cpu_map_data__alloc(struct cpu_map *map, size_t *size, u16 *type, int *max
|
||||
}
|
||||
|
||||
*size += sizeof(struct cpu_map_data);
|
||||
*size = PERF_ALIGN(*size, sizeof(u64));
|
||||
return zalloc(*size);
|
||||
}
|
||||
|
||||
@@ -1560,26 +1561,9 @@ struct map *thread__find_map(struct thread *thread, u8 cpumode, u64 addr,
|
||||
|
||||
return NULL;
|
||||
}
|
||||
try_again:
|
||||
|
||||
al->map = map_groups__find(mg, al->addr);
|
||||
if (al->map == NULL) {
|
||||
/*
|
||||
* If this is outside of all known maps, and is a negative
|
||||
* address, try to look it up in the kernel dso, as it might be
|
||||
* a vsyscall or vdso (which executes in user-mode).
|
||||
*
|
||||
* XXX This is nasty, we should have a symbol list in the
|
||||
* "[vdso]" dso, but for now lets use the old trick of looking
|
||||
* in the whole kernel symbol list.
|
||||
*/
|
||||
if (cpumode == PERF_RECORD_MISC_USER && machine &&
|
||||
mg != &machine->kmaps &&
|
||||
machine__kernel_ip(machine, al->addr)) {
|
||||
mg = &machine->kmaps;
|
||||
load_map = true;
|
||||
goto try_again;
|
||||
}
|
||||
} else {
|
||||
if (al->map != NULL) {
|
||||
/*
|
||||
* Kernel maps might be changed when loading symbols so loading
|
||||
* must be done prior to using kernel maps.
|
||||
|
||||
@@ -1089,6 +1089,9 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts,
|
||||
attr->exclude_user = 1;
|
||||
}
|
||||
|
||||
if (evsel->own_cpus)
|
||||
evsel->attr.read_format |= PERF_FORMAT_ID;
|
||||
|
||||
/*
|
||||
* Apply event specific term settings,
|
||||
* it overloads any global configuration.
|
||||
|
||||
@@ -930,13 +930,14 @@ static void pmu_format_value(unsigned long *format, __u64 value, __u64 *v,
|
||||
|
||||
static __u64 pmu_format_max_value(const unsigned long *format)
|
||||
{
|
||||
__u64 w = 0;
|
||||
int fbit;
|
||||
int w;
|
||||
|
||||
for_each_set_bit(fbit, format, PERF_PMU_FORMAT_BITS)
|
||||
w |= (1ULL << fbit);
|
||||
|
||||
return w;
|
||||
w = bitmap_weight(format, PERF_PMU_FORMAT_BITS);
|
||||
if (!w)
|
||||
return 0;
|
||||
if (w < 64)
|
||||
return (1ULL << w) - 1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -85,6 +85,9 @@ static struct symbol *new_inline_sym(struct dso *dso,
|
||||
struct symbol *inline_sym;
|
||||
char *demangled = NULL;
|
||||
|
||||
if (!funcname)
|
||||
funcname = "??";
|
||||
|
||||
if (dso) {
|
||||
demangled = dso__demangle_sym(dso, 0, funcname);
|
||||
if (demangled)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
#
|
||||
# This test is for checking rtnetlink callpaths, and get as much coverage as possible.
|
||||
#
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
#
|
||||
# Run a series of udpgso benchmarks
|
||||
|
||||
@@ -56,15 +56,13 @@ unsigned int yield_mod_cnt, nr_abort;
|
||||
printf(fmt, ## __VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
#ifdef __i386__
|
||||
|
||||
#define INJECT_ASM_REG "eax"
|
||||
|
||||
#define RSEQ_INJECT_CLOBBER \
|
||||
, INJECT_ASM_REG
|
||||
|
||||
#ifdef __i386__
|
||||
|
||||
#define RSEQ_INJECT_ASM(n) \
|
||||
"mov asm_loop_cnt_" #n ", %%" INJECT_ASM_REG "\n\t" \
|
||||
"test %%" INJECT_ASM_REG ",%%" INJECT_ASM_REG "\n\t" \
|
||||
@@ -76,9 +74,16 @@ unsigned int yield_mod_cnt, nr_abort;
|
||||
|
||||
#elif defined(__x86_64__)
|
||||
|
||||
#define INJECT_ASM_REG_P "rax"
|
||||
#define INJECT_ASM_REG "eax"
|
||||
|
||||
#define RSEQ_INJECT_CLOBBER \
|
||||
, INJECT_ASM_REG_P \
|
||||
, INJECT_ASM_REG
|
||||
|
||||
#define RSEQ_INJECT_ASM(n) \
|
||||
"lea asm_loop_cnt_" #n "(%%rip), %%" INJECT_ASM_REG "\n\t" \
|
||||
"mov (%%" INJECT_ASM_REG "), %%" INJECT_ASM_REG "\n\t" \
|
||||
"lea asm_loop_cnt_" #n "(%%rip), %%" INJECT_ASM_REG_P "\n\t" \
|
||||
"mov (%%" INJECT_ASM_REG_P "), %%" INJECT_ASM_REG "\n\t" \
|
||||
"test %%" INJECT_ASM_REG ",%%" INJECT_ASM_REG "\n\t" \
|
||||
"jz 333f\n\t" \
|
||||
"222:\n\t" \
|
||||
@@ -86,10 +91,6 @@ unsigned int yield_mod_cnt, nr_abort;
|
||||
"jnz 222b\n\t" \
|
||||
"333:\n\t"
|
||||
|
||||
#else
|
||||
#error "Unsupported architecture"
|
||||
#endif
|
||||
|
||||
#elif defined(__s390__)
|
||||
|
||||
#define RSEQ_INJECT_INPUT \
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#include <errno.h>
|
||||
#include <sched.h>
|
||||
#include <stdbool.h>
|
||||
#include <limits.h>
|
||||
|
||||
#ifndef SYS_getcpu
|
||||
# ifdef __x86_64__
|
||||
@@ -31,6 +32,14 @@
|
||||
|
||||
int nerrs = 0;
|
||||
|
||||
typedef int (*vgettime_t)(clockid_t, struct timespec *);
|
||||
|
||||
vgettime_t vdso_clock_gettime;
|
||||
|
||||
typedef long (*vgtod_t)(struct timeval *tv, struct timezone *tz);
|
||||
|
||||
vgtod_t vdso_gettimeofday;
|
||||
|
||||
typedef long (*getcpu_t)(unsigned *, unsigned *, void *);
|
||||
|
||||
getcpu_t vgetcpu;
|
||||
@@ -95,6 +104,15 @@ static void fill_function_pointers()
|
||||
printf("Warning: failed to find getcpu in vDSO\n");
|
||||
|
||||
vgetcpu = (getcpu_t) vsyscall_getcpu();
|
||||
|
||||
vdso_clock_gettime = (vgettime_t)dlsym(vdso, "__vdso_clock_gettime");
|
||||
if (!vdso_clock_gettime)
|
||||
printf("Warning: failed to find clock_gettime in vDSO\n");
|
||||
|
||||
vdso_gettimeofday = (vgtod_t)dlsym(vdso, "__vdso_gettimeofday");
|
||||
if (!vdso_gettimeofday)
|
||||
printf("Warning: failed to find gettimeofday in vDSO\n");
|
||||
|
||||
}
|
||||
|
||||
static long sys_getcpu(unsigned * cpu, unsigned * node,
|
||||
@@ -103,6 +121,16 @@ static long sys_getcpu(unsigned * cpu, unsigned * node,
|
||||
return syscall(__NR_getcpu, cpu, node, cache);
|
||||
}
|
||||
|
||||
static inline int sys_clock_gettime(clockid_t id, struct timespec *ts)
|
||||
{
|
||||
return syscall(__NR_clock_gettime, id, ts);
|
||||
}
|
||||
|
||||
static inline int sys_gettimeofday(struct timeval *tv, struct timezone *tz)
|
||||
{
|
||||
return syscall(__NR_gettimeofday, tv, tz);
|
||||
}
|
||||
|
||||
static void test_getcpu(void)
|
||||
{
|
||||
printf("[RUN]\tTesting getcpu...\n");
|
||||
@@ -155,10 +183,154 @@ static void test_getcpu(void)
|
||||
}
|
||||
}
|
||||
|
||||
static bool ts_leq(const struct timespec *a, const struct timespec *b)
|
||||
{
|
||||
if (a->tv_sec != b->tv_sec)
|
||||
return a->tv_sec < b->tv_sec;
|
||||
else
|
||||
return a->tv_nsec <= b->tv_nsec;
|
||||
}
|
||||
|
||||
static bool tv_leq(const struct timeval *a, const struct timeval *b)
|
||||
{
|
||||
if (a->tv_sec != b->tv_sec)
|
||||
return a->tv_sec < b->tv_sec;
|
||||
else
|
||||
return a->tv_usec <= b->tv_usec;
|
||||
}
|
||||
|
||||
static char const * const clocknames[] = {
|
||||
[0] = "CLOCK_REALTIME",
|
||||
[1] = "CLOCK_MONOTONIC",
|
||||
[2] = "CLOCK_PROCESS_CPUTIME_ID",
|
||||
[3] = "CLOCK_THREAD_CPUTIME_ID",
|
||||
[4] = "CLOCK_MONOTONIC_RAW",
|
||||
[5] = "CLOCK_REALTIME_COARSE",
|
||||
[6] = "CLOCK_MONOTONIC_COARSE",
|
||||
[7] = "CLOCK_BOOTTIME",
|
||||
[8] = "CLOCK_REALTIME_ALARM",
|
||||
[9] = "CLOCK_BOOTTIME_ALARM",
|
||||
[10] = "CLOCK_SGI_CYCLE",
|
||||
[11] = "CLOCK_TAI",
|
||||
};
|
||||
|
||||
static void test_one_clock_gettime(int clock, const char *name)
|
||||
{
|
||||
struct timespec start, vdso, end;
|
||||
int vdso_ret, end_ret;
|
||||
|
||||
printf("[RUN]\tTesting clock_gettime for clock %s (%d)...\n", name, clock);
|
||||
|
||||
if (sys_clock_gettime(clock, &start) < 0) {
|
||||
if (errno == EINVAL) {
|
||||
vdso_ret = vdso_clock_gettime(clock, &vdso);
|
||||
if (vdso_ret == -EINVAL) {
|
||||
printf("[OK]\tNo such clock.\n");
|
||||
} else {
|
||||
printf("[FAIL]\tNo such clock, but __vdso_clock_gettime returned %d\n", vdso_ret);
|
||||
nerrs++;
|
||||
}
|
||||
} else {
|
||||
printf("[WARN]\t clock_gettime(%d) syscall returned error %d\n", clock, errno);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
vdso_ret = vdso_clock_gettime(clock, &vdso);
|
||||
end_ret = sys_clock_gettime(clock, &end);
|
||||
|
||||
if (vdso_ret != 0 || end_ret != 0) {
|
||||
printf("[FAIL]\tvDSO returned %d, syscall errno=%d\n",
|
||||
vdso_ret, errno);
|
||||
nerrs++;
|
||||
return;
|
||||
}
|
||||
|
||||
printf("\t%llu.%09ld %llu.%09ld %llu.%09ld\n",
|
||||
(unsigned long long)start.tv_sec, start.tv_nsec,
|
||||
(unsigned long long)vdso.tv_sec, vdso.tv_nsec,
|
||||
(unsigned long long)end.tv_sec, end.tv_nsec);
|
||||
|
||||
if (!ts_leq(&start, &vdso) || !ts_leq(&vdso, &end)) {
|
||||
printf("[FAIL]\tTimes are out of sequence\n");
|
||||
nerrs++;
|
||||
}
|
||||
}
|
||||
|
||||
static void test_clock_gettime(void)
|
||||
{
|
||||
for (int clock = 0; clock < sizeof(clocknames) / sizeof(clocknames[0]);
|
||||
clock++) {
|
||||
test_one_clock_gettime(clock, clocknames[clock]);
|
||||
}
|
||||
|
||||
/* Also test some invalid clock ids */
|
||||
test_one_clock_gettime(-1, "invalid");
|
||||
test_one_clock_gettime(INT_MIN, "invalid");
|
||||
test_one_clock_gettime(INT_MAX, "invalid");
|
||||
}
|
||||
|
||||
static void test_gettimeofday(void)
|
||||
{
|
||||
struct timeval start, vdso, end;
|
||||
struct timezone sys_tz, vdso_tz;
|
||||
int vdso_ret, end_ret;
|
||||
|
||||
if (!vdso_gettimeofday)
|
||||
return;
|
||||
|
||||
printf("[RUN]\tTesting gettimeofday...\n");
|
||||
|
||||
if (sys_gettimeofday(&start, &sys_tz) < 0) {
|
||||
printf("[FAIL]\tsys_gettimeofday failed (%d)\n", errno);
|
||||
nerrs++;
|
||||
return;
|
||||
}
|
||||
|
||||
vdso_ret = vdso_gettimeofday(&vdso, &vdso_tz);
|
||||
end_ret = sys_gettimeofday(&end, NULL);
|
||||
|
||||
if (vdso_ret != 0 || end_ret != 0) {
|
||||
printf("[FAIL]\tvDSO returned %d, syscall errno=%d\n",
|
||||
vdso_ret, errno);
|
||||
nerrs++;
|
||||
return;
|
||||
}
|
||||
|
||||
printf("\t%llu.%06ld %llu.%06ld %llu.%06ld\n",
|
||||
(unsigned long long)start.tv_sec, start.tv_usec,
|
||||
(unsigned long long)vdso.tv_sec, vdso.tv_usec,
|
||||
(unsigned long long)end.tv_sec, end.tv_usec);
|
||||
|
||||
if (!tv_leq(&start, &vdso) || !tv_leq(&vdso, &end)) {
|
||||
printf("[FAIL]\tTimes are out of sequence\n");
|
||||
nerrs++;
|
||||
}
|
||||
|
||||
if (sys_tz.tz_minuteswest == vdso_tz.tz_minuteswest &&
|
||||
sys_tz.tz_dsttime == vdso_tz.tz_dsttime) {
|
||||
printf("[OK]\ttimezones match: minuteswest=%d, dsttime=%d\n",
|
||||
sys_tz.tz_minuteswest, sys_tz.tz_dsttime);
|
||||
} else {
|
||||
printf("[FAIL]\ttimezones do not match\n");
|
||||
nerrs++;
|
||||
}
|
||||
|
||||
/* And make sure that passing NULL for tz doesn't crash. */
|
||||
vdso_gettimeofday(&vdso, NULL);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
fill_function_pointers();
|
||||
|
||||
test_clock_gettime();
|
||||
test_gettimeofday();
|
||||
|
||||
/*
|
||||
* Test getcpu() last so that, if something goes wrong setting affinity,
|
||||
* we still run the other tests.
|
||||
*/
|
||||
test_getcpu();
|
||||
|
||||
return nerrs ? 1 : 0;
|
||||
|
||||
Reference in New Issue
Block a user