Message ID | 20191009082611.9441-6-cristian.marussi@arm.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Add arm64/signal initial kselftest support | expand |
On Wed, Oct 09, 2019 at 09:26:04AM +0100, Cristian Marussi wrote: > Extend signal testing framework to allow the definition of a custom per > test initialization function to be run at the end of the common test_init > after test setup phase has completed and before test-run routine. > > This custom per-test initialization function also enables the test writer > to decide on its own when forcibly skip the test itself using standard KSFT > mechanism. > > Signed-off-by: Cristian Marussi <cristian.marussi@arm.com> Reviewed-by: Dave Martin <Dave.Martin@arm.com> > --- > v7 --> v8 > - per test .init() helper added new in v8 (splitted out of v7 05/11) > --- > .../selftests/arm64/signal/test_signals.c | 6 ++-- > .../selftests/arm64/signal/test_signals.h | 7 ++-- > .../arm64/signal/test_signals_utils.c | 32 +++++++++++++------ > .../arm64/signal/test_signals_utils.h | 1 + > 4 files changed, 31 insertions(+), 15 deletions(-) > > diff --git a/tools/testing/selftests/arm64/signal/test_signals.c b/tools/testing/selftests/arm64/signal/test_signals.c > index cb970346b280..416b1ff43199 100644 > --- a/tools/testing/selftests/arm64/signal/test_signals.c > +++ b/tools/testing/selftests/arm64/signal/test_signals.c > @@ -19,11 +19,11 @@ int main(int argc, char *argv[]) > current = &tde; > > ksft_print_msg("%s :: %s\n", current->name, current->descr); > - if (test_setup(current)) { > + if (test_setup(current) && test_init(current)) { > test_run(current); > - test_result(current); > test_cleanup(current); > } > + test_result(current); > > - return current->pass ? KSFT_PASS : KSFT_FAIL; > + return current->result; > } > diff --git a/tools/testing/selftests/arm64/signal/test_signals.h b/tools/testing/selftests/arm64/signal/test_signals.h > index 3fd4499f00bf..901521188202 100644 > --- a/tools/testing/selftests/arm64/signal/test_signals.h > +++ b/tools/testing/selftests/arm64/signal/test_signals.h > @@ -84,17 +84,20 @@ struct tdescr { > unsigned int timeout; > bool triggered; > bool pass; > + unsigned int result; > /* optional sa_flags for the installed handler */ > int sa_flags; > ucontext_t saved_uc; > /* optional test private data */ > void *priv; > > - /* a custom setup function to be called before test starts */ > + /* a custom setup: called alternatively to default_setup */ > int (*setup)(struct tdescr *td); > + /* a custom init: called by default test init after test_setup */ > + bool (*init)(struct tdescr *td); > /* a custom cleanup function called before test exits */ > void (*cleanup)(struct tdescr *td); > - /* an optional function to be used as a trigger for test starting */ > + /* an optional function to be used as a trigger for starting test */ > int (*trigger)(struct tdescr *td); > /* > * the actual test-core: invoked differently depending on the > diff --git a/tools/testing/selftests/arm64/signal/test_signals_utils.c b/tools/testing/selftests/arm64/signal/test_signals_utils.c > index ff24db6f9d06..e8bbe36c2660 100644 > --- a/tools/testing/selftests/arm64/signal/test_signals_utils.c > +++ b/tools/testing/selftests/arm64/signal/test_signals_utils.c > @@ -11,6 +11,8 @@ > #include <linux/auxvec.h> > #include <ucontext.h> > > +#include <kselftest.h> > + > #include "test_signals.h" > #include "test_signals_utils.h" > #include "testcases/testcases.h" > @@ -54,12 +56,18 @@ static void unblock_signal(int signum) > > static void default_result(struct tdescr *td, bool force_exit) > { > - if (td->pass) > + if (td->result == KSFT_SKIP) { > + fprintf(stderr, "==>> completed. SKIP.\n"); > + } else if (td->pass) { > fprintf(stderr, "==>> completed. PASS(1)\n"); > - else > + td->result = KSFT_PASS; > + } else { > fprintf(stdout, "==>> completed. FAIL(0)\n"); > + td->result = KSFT_FAIL; > + } > + > if (force_exit) > - exit(td->pass ? EXIT_SUCCESS : EXIT_FAILURE); > + exit(td->result); > } > > /* > @@ -211,7 +219,7 @@ static inline int default_trigger(struct tdescr *td) > return !raise(td->sig_trig); > } > > -static int test_init(struct tdescr *td) > +int test_init(struct tdescr *td) > { > td->minsigstksz = getauxval(AT_MINSIGSTKSZ); > if (!td->minsigstksz) > @@ -224,8 +232,6 @@ static int test_init(struct tdescr *td) > * Checking for CPU required features using both the > * auxval and the arm64 MRS Emulation to read sysregs. > */ > - if (getauxval(AT_HWCAP) & HWCAP_SSBS) > - td->feats_supported |= FEAT_SSBS; > if (getauxval(AT_HWCAP) & HWCAP_CPUID) { > uint64_t val = 0; > > @@ -250,7 +256,14 @@ static int test_init(struct tdescr *td) > ~td->feats_supported)); > } > > + /* Perform test specific additional initialization */ > + if (td->init && !td->init(td)) { > + fprintf(stderr, "FAILED Testcase initialization.\n"); > + return 0; > + } > td->initialized = 1; > + fprintf(stderr, "Testcase initialized.\n"); > + > return 1; > } > > @@ -262,9 +275,8 @@ int test_setup(struct tdescr *td) > assert(td->name); > assert(td->run); > > - if (!test_init(td)) > - return 0; > - > + /* Default result is FAIL if test setup fails */ > + td->result = KSFT_FAIL; > if (td->setup) > return td->setup(td); > else > @@ -285,7 +297,7 @@ int test_run(struct tdescr *td) > > void test_result(struct tdescr *td) > { > - if (td->check_result) > + if (td->initialized && td->result != KSFT_SKIP && td->check_result) > td->check_result(td); > default_result(td, 0); > } > diff --git a/tools/testing/selftests/arm64/signal/test_signals_utils.h b/tools/testing/selftests/arm64/signal/test_signals_utils.h > index 47a7592b7c53..5e3a2b7aaa8b 100644 > --- a/tools/testing/selftests/arm64/signal/test_signals_utils.h > +++ b/tools/testing/selftests/arm64/signal/test_signals_utils.h > @@ -6,6 +6,7 @@ > > #include "test_signals.h" > > +int test_init(struct tdescr *td); > int test_setup(struct tdescr *td); > void test_cleanup(struct tdescr *td); > int test_run(struct tdescr *td); > -- > 2.17.1 > > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
On 09/10/2019 12:32, Dave Martin wrote: > On Wed, Oct 09, 2019 at 09:26:04AM +0100, Cristian Marussi wrote: >> Extend signal testing framework to allow the definition of a custom per >> test initialization function to be run at the end of the common test_init >> after test setup phase has completed and before test-run routine. >> >> This custom per-test initialization function also enables the test writer >> to decide on its own when forcibly skip the test itself using standard KSFT >> mechanism. >> >> Signed-off-by: Cristian Marussi <cristian.marussi@arm.com> > > Reviewed-by: Dave Martin <Dave.Martin@arm.com> > Thanks Cristian >> --- >> v7 --> v8 >> - per test .init() helper added new in v8 (splitted out of v7 05/11) >> --- >> .../selftests/arm64/signal/test_signals.c | 6 ++-- >> .../selftests/arm64/signal/test_signals.h | 7 ++-- >> .../arm64/signal/test_signals_utils.c | 32 +++++++++++++------ >> .../arm64/signal/test_signals_utils.h | 1 + >> 4 files changed, 31 insertions(+), 15 deletions(-) >> >> diff --git a/tools/testing/selftests/arm64/signal/test_signals.c b/tools/testing/selftests/arm64/signal/test_signals.c >> index cb970346b280..416b1ff43199 100644 >> --- a/tools/testing/selftests/arm64/signal/test_signals.c >> +++ b/tools/testing/selftests/arm64/signal/test_signals.c >> @@ -19,11 +19,11 @@ int main(int argc, char *argv[]) >> current = &tde; >> >> ksft_print_msg("%s :: %s\n", current->name, current->descr); >> - if (test_setup(current)) { >> + if (test_setup(current) && test_init(current)) { >> test_run(current); >> - test_result(current); >> test_cleanup(current); >> } >> + test_result(current); >> >> - return current->pass ? KSFT_PASS : KSFT_FAIL; >> + return current->result; >> } >> diff --git a/tools/testing/selftests/arm64/signal/test_signals.h b/tools/testing/selftests/arm64/signal/test_signals.h >> index 3fd4499f00bf..901521188202 100644 >> --- a/tools/testing/selftests/arm64/signal/test_signals.h >> +++ b/tools/testing/selftests/arm64/signal/test_signals.h >> @@ -84,17 +84,20 @@ struct tdescr { >> unsigned int timeout; >> bool triggered; >> bool pass; >> + unsigned int result; >> /* optional sa_flags for the installed handler */ >> int sa_flags; >> ucontext_t saved_uc; >> /* optional test private data */ >> void *priv; >> >> - /* a custom setup function to be called before test starts */ >> + /* a custom setup: called alternatively to default_setup */ >> int (*setup)(struct tdescr *td); >> + /* a custom init: called by default test init after test_setup */ >> + bool (*init)(struct tdescr *td); >> /* a custom cleanup function called before test exits */ >> void (*cleanup)(struct tdescr *td); >> - /* an optional function to be used as a trigger for test starting */ >> + /* an optional function to be used as a trigger for starting test */ >> int (*trigger)(struct tdescr *td); >> /* >> * the actual test-core: invoked differently depending on the >> diff --git a/tools/testing/selftests/arm64/signal/test_signals_utils.c b/tools/testing/selftests/arm64/signal/test_signals_utils.c >> index ff24db6f9d06..e8bbe36c2660 100644 >> --- a/tools/testing/selftests/arm64/signal/test_signals_utils.c >> +++ b/tools/testing/selftests/arm64/signal/test_signals_utils.c >> @@ -11,6 +11,8 @@ >> #include <linux/auxvec.h> >> #include <ucontext.h> >> >> +#include <kselftest.h> >> + >> #include "test_signals.h" >> #include "test_signals_utils.h" >> #include "testcases/testcases.h" >> @@ -54,12 +56,18 @@ static void unblock_signal(int signum) >> >> static void default_result(struct tdescr *td, bool force_exit) >> { >> - if (td->pass) >> + if (td->result == KSFT_SKIP) { >> + fprintf(stderr, "==>> completed. SKIP.\n"); >> + } else if (td->pass) { >> fprintf(stderr, "==>> completed. PASS(1)\n"); >> - else >> + td->result = KSFT_PASS; >> + } else { >> fprintf(stdout, "==>> completed. FAIL(0)\n"); >> + td->result = KSFT_FAIL; >> + } >> + >> if (force_exit) >> - exit(td->pass ? EXIT_SUCCESS : EXIT_FAILURE); >> + exit(td->result); >> } >> >> /* >> @@ -211,7 +219,7 @@ static inline int default_trigger(struct tdescr *td) >> return !raise(td->sig_trig); >> } >> >> -static int test_init(struct tdescr *td) >> +int test_init(struct tdescr *td) >> { >> td->minsigstksz = getauxval(AT_MINSIGSTKSZ); >> if (!td->minsigstksz) >> @@ -224,8 +232,6 @@ static int test_init(struct tdescr *td) >> * Checking for CPU required features using both the >> * auxval and the arm64 MRS Emulation to read sysregs. >> */ >> - if (getauxval(AT_HWCAP) & HWCAP_SSBS) >> - td->feats_supported |= FEAT_SSBS; >> if (getauxval(AT_HWCAP) & HWCAP_CPUID) { >> uint64_t val = 0; >> >> @@ -250,7 +256,14 @@ static int test_init(struct tdescr *td) >> ~td->feats_supported)); >> } >> >> + /* Perform test specific additional initialization */ >> + if (td->init && !td->init(td)) { >> + fprintf(stderr, "FAILED Testcase initialization.\n"); >> + return 0; >> + } >> td->initialized = 1; >> + fprintf(stderr, "Testcase initialized.\n"); >> + >> return 1; >> } >> >> @@ -262,9 +275,8 @@ int test_setup(struct tdescr *td) >> assert(td->name); >> assert(td->run); >> >> - if (!test_init(td)) >> - return 0; >> - >> + /* Default result is FAIL if test setup fails */ >> + td->result = KSFT_FAIL; >> if (td->setup) >> return td->setup(td); >> else >> @@ -285,7 +297,7 @@ int test_run(struct tdescr *td) >> >> void test_result(struct tdescr *td) >> { >> - if (td->check_result) >> + if (td->initialized && td->result != KSFT_SKIP && td->check_result) >> td->check_result(td); >> default_result(td, 0); >> } >> diff --git a/tools/testing/selftests/arm64/signal/test_signals_utils.h b/tools/testing/selftests/arm64/signal/test_signals_utils.h >> index 47a7592b7c53..5e3a2b7aaa8b 100644 >> --- a/tools/testing/selftests/arm64/signal/test_signals_utils.h >> +++ b/tools/testing/selftests/arm64/signal/test_signals_utils.h >> @@ -6,6 +6,7 @@ >> >> #include "test_signals.h" >> >> +int test_init(struct tdescr *td); >> int test_setup(struct tdescr *td); >> void test_cleanup(struct tdescr *td); >> int test_run(struct tdescr *td); >> -- >> 2.17.1 >> >> >> _______________________________________________ >> linux-arm-kernel mailing list >> linux-arm-kernel@lists.infradead.org >> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
diff --git a/tools/testing/selftests/arm64/signal/test_signals.c b/tools/testing/selftests/arm64/signal/test_signals.c index cb970346b280..416b1ff43199 100644 --- a/tools/testing/selftests/arm64/signal/test_signals.c +++ b/tools/testing/selftests/arm64/signal/test_signals.c @@ -19,11 +19,11 @@ int main(int argc, char *argv[]) current = &tde; ksft_print_msg("%s :: %s\n", current->name, current->descr); - if (test_setup(current)) { + if (test_setup(current) && test_init(current)) { test_run(current); - test_result(current); test_cleanup(current); } + test_result(current); - return current->pass ? KSFT_PASS : KSFT_FAIL; + return current->result; } diff --git a/tools/testing/selftests/arm64/signal/test_signals.h b/tools/testing/selftests/arm64/signal/test_signals.h index 3fd4499f00bf..901521188202 100644 --- a/tools/testing/selftests/arm64/signal/test_signals.h +++ b/tools/testing/selftests/arm64/signal/test_signals.h @@ -84,17 +84,20 @@ struct tdescr { unsigned int timeout; bool triggered; bool pass; + unsigned int result; /* optional sa_flags for the installed handler */ int sa_flags; ucontext_t saved_uc; /* optional test private data */ void *priv; - /* a custom setup function to be called before test starts */ + /* a custom setup: called alternatively to default_setup */ int (*setup)(struct tdescr *td); + /* a custom init: called by default test init after test_setup */ + bool (*init)(struct tdescr *td); /* a custom cleanup function called before test exits */ void (*cleanup)(struct tdescr *td); - /* an optional function to be used as a trigger for test starting */ + /* an optional function to be used as a trigger for starting test */ int (*trigger)(struct tdescr *td); /* * the actual test-core: invoked differently depending on the diff --git a/tools/testing/selftests/arm64/signal/test_signals_utils.c b/tools/testing/selftests/arm64/signal/test_signals_utils.c index ff24db6f9d06..e8bbe36c2660 100644 --- a/tools/testing/selftests/arm64/signal/test_signals_utils.c +++ b/tools/testing/selftests/arm64/signal/test_signals_utils.c @@ -11,6 +11,8 @@ #include <linux/auxvec.h> #include <ucontext.h> +#include <kselftest.h> + #include "test_signals.h" #include "test_signals_utils.h" #include "testcases/testcases.h" @@ -54,12 +56,18 @@ static void unblock_signal(int signum) static void default_result(struct tdescr *td, bool force_exit) { - if (td->pass) + if (td->result == KSFT_SKIP) { + fprintf(stderr, "==>> completed. SKIP.\n"); + } else if (td->pass) { fprintf(stderr, "==>> completed. PASS(1)\n"); - else + td->result = KSFT_PASS; + } else { fprintf(stdout, "==>> completed. FAIL(0)\n"); + td->result = KSFT_FAIL; + } + if (force_exit) - exit(td->pass ? EXIT_SUCCESS : EXIT_FAILURE); + exit(td->result); } /* @@ -211,7 +219,7 @@ static inline int default_trigger(struct tdescr *td) return !raise(td->sig_trig); } -static int test_init(struct tdescr *td) +int test_init(struct tdescr *td) { td->minsigstksz = getauxval(AT_MINSIGSTKSZ); if (!td->minsigstksz) @@ -224,8 +232,6 @@ static int test_init(struct tdescr *td) * Checking for CPU required features using both the * auxval and the arm64 MRS Emulation to read sysregs. */ - if (getauxval(AT_HWCAP) & HWCAP_SSBS) - td->feats_supported |= FEAT_SSBS; if (getauxval(AT_HWCAP) & HWCAP_CPUID) { uint64_t val = 0; @@ -250,7 +256,14 @@ static int test_init(struct tdescr *td) ~td->feats_supported)); } + /* Perform test specific additional initialization */ + if (td->init && !td->init(td)) { + fprintf(stderr, "FAILED Testcase initialization.\n"); + return 0; + } td->initialized = 1; + fprintf(stderr, "Testcase initialized.\n"); + return 1; } @@ -262,9 +275,8 @@ int test_setup(struct tdescr *td) assert(td->name); assert(td->run); - if (!test_init(td)) - return 0; - + /* Default result is FAIL if test setup fails */ + td->result = KSFT_FAIL; if (td->setup) return td->setup(td); else @@ -285,7 +297,7 @@ int test_run(struct tdescr *td) void test_result(struct tdescr *td) { - if (td->check_result) + if (td->initialized && td->result != KSFT_SKIP && td->check_result) td->check_result(td); default_result(td, 0); } diff --git a/tools/testing/selftests/arm64/signal/test_signals_utils.h b/tools/testing/selftests/arm64/signal/test_signals_utils.h index 47a7592b7c53..5e3a2b7aaa8b 100644 --- a/tools/testing/selftests/arm64/signal/test_signals_utils.h +++ b/tools/testing/selftests/arm64/signal/test_signals_utils.h @@ -6,6 +6,7 @@ #include "test_signals.h" +int test_init(struct tdescr *td); int test_setup(struct tdescr *td); void test_cleanup(struct tdescr *td); int test_run(struct tdescr *td);
Extend signal testing framework to allow the definition of a custom per test initialization function to be run at the end of the common test_init after test setup phase has completed and before test-run routine. This custom per-test initialization function also enables the test writer to decide on its own when forcibly skip the test itself using standard KSFT mechanism. Signed-off-by: Cristian Marussi <cristian.marussi@arm.com> --- v7 --> v8 - per test .init() helper added new in v8 (splitted out of v7 05/11) --- .../selftests/arm64/signal/test_signals.c | 6 ++-- .../selftests/arm64/signal/test_signals.h | 7 ++-- .../arm64/signal/test_signals_utils.c | 32 +++++++++++++------ .../arm64/signal/test_signals_utils.h | 1 + 4 files changed, 31 insertions(+), 15 deletions(-)