Re: [PATCH 2/2] selftests/bpf: Add test for bpf_rdtsc

From: John Fastabend
Date: Thu Jul 06 2023 - 00:57:55 EST


Tero Kristo wrote:
>
> On 04/07/2023 01:00, John Fastabend wrote:
> > Tero Kristo wrote:
> >> Add selftest for bpf_rdtsc() which reads the TSC (Time Stamp Counter) on
> >> x86_64 architectures. The test reads the TSC from both userspace and the
> >> BPF program, and verifies the TSC values are in incremental order as
> >> expected. The test is automatically skipped on architectures that do not
> >> support the feature.
> >>
> >> Signed-off-by: Tero Kristo <tero.kristo@xxxxxxxxxxxxxxx>
> >> ---
> >> .../selftests/bpf/prog_tests/test_rdtsc.c | 67 +++++++++++++++++++
> >> .../testing/selftests/bpf/progs/test_rdtsc.c | 21 ++++++
> >> 2 files changed, 88 insertions(+)
> >> create mode 100644 tools/testing/selftests/bpf/prog_tests/test_rdtsc.c
> >> create mode 100644 tools/testing/selftests/bpf/progs/test_rdtsc.c
> >>
> >> diff --git a/tools/testing/selftests/bpf/prog_tests/test_rdtsc.c b/tools/testing/selftests/bpf/prog_tests/test_rdtsc.c
> >> new file mode 100644
> >> index 000000000000..2b26deb5b35a
> >> --- /dev/null
> >> +++ b/tools/testing/selftests/bpf/prog_tests/test_rdtsc.c
> >> @@ -0,0 +1,67 @@
> >> +// SPDX-License-Identifier: GPL-2.0
> >> +/* Copyright(c) 2023 Intel Corporation */
> >> +
> >> +#include "test_progs.h"
> >> +#include "test_rdtsc.skel.h"
> >> +
> >> +#ifdef __x86_64__
> >> +
> >> +static inline u64 _rdtsc(void)
> >> +{
> >> + u32 low, high;
> >> +
> >> + __asm__ __volatile__("rdtscp" : "=a" (low), "=d" (high));
> > I think its ok but note this could fail if user doesn't have
> > access to rdtscp and iirc that can be restricted?
>
> It is possible to restrict RDTSC access from userspace by enabling the
> TSD bit in CR4 register, and it will cause the userspace process to trap
> with general protection fault.
>
> However, the usage of RDTSC appears to be built-in to C standard
> libraries (probably some timer routines) and enabling the CR4 TSD makes
> the system near unusable. Things like sshd + systemd also start
> generating the same general protection faults if RDTSC is blocked. Also,
> attempting to run anything at all with the BPF selftest suite causes the
> same general protection fault; not only the rdtsc test.
>
> I tried this with couple of setups, one system running a minimalistic
> buildroot and another one running a fedora37 installation and the
> results were similar.

Thanks. Good enough for me.

>
> -Tero