----- On Nov 22, 2017, at 10:23 AM, shuah shuah@xxxxxxxxxx wrote: > On 11/21/2017 03:19 PM, Mathieu Desnoyers wrote: >> Implements two basic tests of RSEQ functionality, and one more >> exhaustive parameterizable test. >> >> The first, "basic_test" only asserts that RSEQ works moderately >> correctly. E.g. that the CPUID pointer works. >> >> "basic_percpu_ops_test" is a slightly more "realistic" variant, >> implementing a few simple per-cpu operations and testing their >> correctness. >> >> "param_test" is a parametrizable restartable sequences test. See >> the "--help" output for usage. >> >> A run_param_test.sh script runs many variants of the parametrizable >> tests. >> >> As part of those tests, a helper library "rseq" implements a user-space >> API around restartable sequences. It uses the cpu_opv system call as >> fallback when single-stepped by a debugger. It exposes the instruction >> pointer addresses where the rseq assembly blocks begin and end, as well >> as the associated abort instruction pointer, in the __rseq_table >> section. This section allows debuggers may know where to place >> breakpoints when single-stepping through assembly blocks which may be >> aborted at any point by the kernel. >> >> The rseq library expose APIs that present the fast-path operations. >> The new from userspace is, e.g. for a counter increment: >> >> cpu = rseq_cpu_start(); >> ret = rseq_addv(&data->c[cpu].count, 1, cpu); >> if (likely(!ret)) >> return 0; /* Success. */ >> do { >> cpu = rseq_current_cpu(); >> ret = cpu_op_addv(&data->c[cpu].count, 1, cpu); >> if (likely(!ret)) >> return 0; /* Success. */ >> } while (ret > 0 || errno == EAGAIN); >> perror("cpu_op_addv"); >> return -1; /* Unexpected error. */ >> >> PowerPC tests have been implemented by Boqun Feng. >> >> Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@xxxxxxxxxxxx> >> CC: Russell King <linux@xxxxxxxxxxxxxxxx> >> CC: Catalin Marinas <catalin.marinas@xxxxxxx> >> CC: Will Deacon <will.deacon@xxxxxxx> >> CC: Thomas Gleixner <tglx@xxxxxxxxxxxxx> >> CC: Paul Turner <pjt@xxxxxxxxxx> >> CC: Andrew Hunter <ahh@xxxxxxxxxx> >> CC: Peter Zijlstra <peterz@xxxxxxxxxxxxx> >> CC: Andy Lutomirski <luto@xxxxxxxxxxxxxx> >> CC: Andi Kleen <andi@xxxxxxxxxxxxxx> >> CC: Dave Watson <davejwatson@xxxxxx> >> CC: Chris Lameter <cl@xxxxxxxxx> >> CC: Ingo Molnar <mingo@xxxxxxxxxx> >> CC: "H. Peter Anvin" <hpa@xxxxxxxxx> >> CC: Ben Maurer <bmaurer@xxxxxx> >> CC: Steven Rostedt <rostedt@xxxxxxxxxxx> >> CC: "Paul E. McKenney" <paulmck@xxxxxxxxxxxxxxxxxx> >> CC: Josh Triplett <josh@xxxxxxxxxxxxxxxx> >> CC: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> >> CC: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> >> CC: Boqun Feng <boqun.feng@xxxxxxxxx> >> CC: Shuah Khan <shuah@xxxxxxxxxx> >> CC: linux-kselftest@xxxxxxxxxxxxxxx >> CC: linux-api@xxxxxxxxxxxxxxx >> --- >> Changes since v1: >> - Provide abort-ip signature: The abort-ip signature is located just >> before the abort-ip target. It is currently hardcoded, but a >> user-space application could use the __rseq_table to iterate on all >> abort-ip targets and use a random value as signature if needed in the >> future. >> - Add rseq_prepare_unload(): Libraries and JIT code using rseq critical >> sections need to issue rseq_prepare_unload() on each thread at least >> once before reclaim of struct rseq_cs. >> - Use initial-exec TLS model, non-weak symbol: The initial-exec model is >> signal-safe, whereas the global-dynamic model is not. Remove the >> "weak" symbol attribute from the __rseq_abi in rseq.c. The rseq.so >> library will have ownership of that symbol, and there is not reason for >> an application or user library to try to define that symbol. >> The expected use is to link against libreq.so, which owns and provide >> that symbol. >> - Set cpu_id to -2 on register error >> - Add rseq_len syscall parameter, rseq_cs version >> - Ensure disassember-friendly signature: x86 32/64 disassembler have a >> hard time decoding the instruction stream after a bad instruction. Use >> a nopl instruction to encode the signature. Suggested by Andy Lutomirski. >> - Exercise parametrized tests variants in a shell scripts. >> - Restartable sequences selftests: Remove use of event counter. >> - Use cpu_id_start field: With the cpu_id_start field, the C >> preparation phase of the fast-path does not need to compare cpu_id < 0 >> anymore. >> - Signal-safe registration and refcounting: Allow libraries using >> librseq.so to register it from signal handlers. >> - Use OVERRIDE_TARGETS in makefile. >> - Use "m" constraints for rseq_cs field. >> >> Changes since v2: >> - Update based on Thomas Gleixner's comments. >> >> Changes since v3: >> - Generate param_test_skip_fastpath and param_test_benchmark with >> -DSKIP_FASTPATH and -DBENCHMARK (respectively). Add param_test_fastpath >> to run_param_test.sh. >> --- >> MAINTAINERS | 1 + >> tools/testing/selftests/Makefile | 1 + >> tools/testing/selftests/rseq/.gitignore | 4 + >> tools/testing/selftests/rseq/Makefile | 33 + >> .../testing/selftests/rseq/basic_percpu_ops_test.c | 333 +++++ >> tools/testing/selftests/rseq/basic_test.c | 55 + >> tools/testing/selftests/rseq/param_test.c | 1285 ++++++++++++++++++++ >> tools/testing/selftests/rseq/rseq-arm.h | 535 ++++++++ >> tools/testing/selftests/rseq/rseq-ppc.h | 567 +++++++++ >> tools/testing/selftests/rseq/rseq-x86.h | 898 ++++++++++++++ >> tools/testing/selftests/rseq/rseq.c | 116 ++ >> tools/testing/selftests/rseq/rseq.h | 154 +++ >> tools/testing/selftests/rseq/run_param_test.sh | 126 ++ >> 13 files changed, 4108 insertions(+) >> create mode 100644 tools/testing/selftests/rseq/.gitignore >> create mode 100644 tools/testing/selftests/rseq/Makefile >> create mode 100644 tools/testing/selftests/rseq/basic_percpu_ops_test.c >> create mode 100644 tools/testing/selftests/rseq/basic_test.c >> create mode 100644 tools/testing/selftests/rseq/param_test.c >> create mode 100644 tools/testing/selftests/rseq/rseq-arm.h >> create mode 100644 tools/testing/selftests/rseq/rseq-ppc.h >> create mode 100644 tools/testing/selftests/rseq/rseq-x86.h >> create mode 100644 tools/testing/selftests/rseq/rseq.c >> create mode 100644 tools/testing/selftests/rseq/rseq.h >> create mode 100755 tools/testing/selftests/rseq/run_param_test.sh >> > > Looks good. > > Acked-by: Shuah Khan <shuahkh@xxxxxxxxxxxxxxx> Thanks the the reviews! Mathieu > > thanks, > -- Shuah -- Mathieu Desnoyers EfficiOS Inc. http://www.efficios.com -- To unsubscribe from this list: send the line "unsubscribe linux-api" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html