On Tue, Nov 21, 2017 at 09:18:53AM -0500, 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.
Could I ask you to split this in smaller bits?
I'd start with just the rseq library, using only the rseq interface.
Then add the whole cpu_opv fallback stuff.
Then add the selftests using librseq.
As is this is a tad much to read in a single go.
--
To unsubscribe from this list: send the line "unsubscribe linux-kselftest" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
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(a)efficios.com>
> CC: Russell King <linux(a)arm.linux.org.uk>
> CC: Catalin Marinas <catalin.marinas(a)arm.com>
> CC: Will Deacon <will.deacon(a)arm.com>
> CC: Thomas Gleixner <tglx(a)linutronix.de>
> CC: Paul Turner <pjt(a)google.com>
> CC: Andrew Hunter <ahh(a)google.com>
> CC: Peter Zijlstra <peterz(a)infradead.org>
> CC: Andy Lutomirski <luto(a)amacapital.net>
> CC: Andi Kleen <andi(a)firstfloor.org>
> CC: Dave Watson <davejwatson(a)fb.com>
> CC: Chris Lameter <cl(a)linux.com>
> CC: Ingo Molnar <mingo(a)redhat.com>
> CC: "H. Peter Anvin" <hpa(a)zytor.com>
> CC: Ben Maurer <bmaurer(a)fb.com>
> CC: Steven Rostedt <rostedt(a)goodmis.org>
> CC: "Paul E. McKenney" <paulmck(a)linux.vnet.ibm.com>
> CC: Josh Triplett <josh(a)joshtriplett.org>
> CC: Linus Torvalds <torvalds(a)linux-foundation.org>
> CC: Andrew Morton <akpm(a)linux-foundation.org>
> CC: Boqun Feng <boqun.feng(a)gmail.com>
> CC: Shuah Khan <shuah(a)kernel.org>
> CC: linux-kselftest(a)vger.kernel.org
> CC: linux-api(a)vger.kernel.org
> ---
> 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(a)osg.samsung.com>
thanks,
-- Shuah
--
To unsubscribe from this list: send the line "unsubscribe linux-kselftest" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
----- On Nov 21, 2017, at 10:34 AM, shuah shuah(a)kernel.org wrote:
[...]
>> ---
>> MAINTAINERS | 1 +
>> tools/testing/selftests/Makefile | 1 +
>> tools/testing/selftests/rseq/.gitignore | 4 +
>
> Thanks for the .gitignore files. It is commonly missed change, I end
> up adding one to clean things up after tests get in.
I'm used to receive patches where contributors forget to add new files
to gitignore within my own projects, which may contribute to my awareness
of this pain point. :)
[...]
>> +
>> +void *test_percpu_inc_thread(void *arg)
>> +{
>> + struct inc_thread_test_data *thread_data = arg;
>> + struct inc_test_data *data = thread_data->data;
>> + long long i, reps;
>> +
>> + if (!opt_disable_rseq && thread_data->reg
>> + && rseq_register_current_thread())
>> + abort();
>> + reps = thread_data->reps;
>> + for (i = 0; i < reps; i++) {
>> + int cpu, ret;
>> +
>> +#ifndef SKIP_FASTPATH
>> + /* Try fast path. */
>> + cpu = rseq_cpu_start();
>> + ret = rseq_addv(&data->c[cpu].count, 1, cpu);
>> + if (likely(!ret))
>> + goto next;
>> +#endif
>
> So the test needs to compiled with this enabled? I think it would be better
> to make this an argument to be abel to select at test start time as opposed
> to making this compile time option. Remember that these tests get run in
> automated test rings. Making this a compile time otpion pertty much ensures
> that this path will not be tested.
>
> So I would reccommend adding a paratemer.
>
>> + slowpath:
>> + __attribute__((unused));
>> + for (;;) {
>> + /* Fallback on cpu_opv system call. */
>> + cpu = rseq_current_cpu();
>> + ret = cpu_op_addv(&data->c[cpu].count, 1, cpu);
>> + if (likely(!ret))
>> + break;
>> + assert(ret >= 0 || errno == EAGAIN);
>> + }
>> + next:
>> + __attribute__((unused));
>> +#ifndef BENCHMARK
>> + if (i != 0 && !(i % (reps / 10)))
>> + printf_verbose("tid %d: count %lld\n", (int) gettid(), i);
>> +#endif
>
> Same comment as before. Avoid compile time options.
The goal of those compiler define are to generate the altered code without
adding branches into the fast-paths.
Here is an alternative solution that should take care of your concern: I'll
build multiple targets for param_test.c:
param_test
param_test_skip_fastpath (built with -DSKIP_FASTPATH)
param_test_benchmark (build with -DBENCHMARK)
I'll update run_param_test.sh to run both param_test and param_test_skip_fastpath.
Note that "param_test_benchmark" is only useful for benchmarking,
so I don't plan to run it from run_param_test.sh which is meant
to track regressions.
Is that approach OK with you ?
Thanks,
Mathieu
--
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
--
To unsubscribe from this list: send the line "unsubscribe linux-kselftest" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Markus Elfring <elfring(a)users.sourceforge.net>
Date: Tue, 21 Nov 2017 20:56:51 +0100
Use the data type "sig_atomic_t" for the variable "done"
so that it can be safely modified by a signal handler.
Fixes: 0bc4b0cf15708fca04095232c4e448634e94d029 ("selftests: add basic posix timers selftests")
Signed-off-by: Markus Elfring <elfring(a)users.sourceforge.net>
---
tools/testing/selftests/timers/posix_timers.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/testing/selftests/timers/posix_timers.c b/tools/testing/selftests/timers/posix_timers.c
index 15cf56d32155..d64732c8b69a 100644
--- a/tools/testing/selftests/timers/posix_timers.c
+++ b/tools/testing/selftests/timers/posix_timers.c
@@ -20,7 +20,7 @@
#define DELAY 2
#define USECS_PER_SEC 1000000
-static volatile int done;
+static sig_atomic_t done;
/* Busy loop in userspace to elapse ITIMER_VIRTUAL */
static void user_loop(void)
--
2.15.0
--
To unsubscribe from this list: send the line "unsubscribe linux-kselftest" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Hello,
Static source code analysis points out that the checking of return values from
some function calls is incomplete also in this software area.
How would you like to fix remaining open issues there?
Regards,
Markus
--
To unsubscribe from this list: send the line "unsubscribe linux-kselftest" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html