From: Frank Rowand <frowand.list@gmail.com>
To: Brendan Higgins <brendanhiggins@google.com>,
jdike@addtoit.com, richard@nod.at,
anton.ivanov@cambridgegreys.com, arnd@arndb.de,
keescook@chromium.org, skhan@linuxfoundation.org,
alan.maguire@oracle.com, yzaikin@google.com, davidgow@google.com,
akpm@linux-foundation.org, rppt@linux.ibm.com
Cc: gregkh@linuxfoundation.org, sboyd@kernel.org,
logang@deltatee.com, mcgrof@kernel.org, knut.omang@oracle.com,
linux-um@lists.infradead.org, linux-arch@vger.kernel.org,
linux-kselftest@vger.kernel.org, kunit-dev@googlegroups.com,
linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org
Subject: Re: [PATCH v2 3/7] kunit: test: create a single centralized executor for all tests
Date: Tue, 4 Feb 2020 16:27:12 -0600 [thread overview]
Message-ID: <11977708-bb18-e322-db7a-9f21d7cdec54@gmail.com> (raw)
In-Reply-To: <20200130230812.142642-4-brendanhiggins@google.com>
On 1/30/20 5:08 PM, Brendan Higgins wrote:
> From: Alan Maguire <alan.maguire@oracle.com>
>
> Add a centralized executor to dispatch tests rather than relying on
> late_initcall to schedule each test suite separately. Centralized
> execution is for built-in tests only; modules will execute tests
> when loaded.
>
> Signed-off-by: Alan Maguire <alan.maguire@oracle.com>
> Co-developed-by: Iurii Zaikin <yzaikin@google.com>
> Signed-off-by: Iurii Zaikin <yzaikin@google.com>
> Co-developed-by: Brendan Higgins <brendanhiggins@google.com>
> Signed-off-by: Brendan Higgins <brendanhiggins@google.com>
> Reviewed-by: Stephen Boyd <sboyd@kernel.org>
> ---
> include/kunit/test.h | 73 +++++++++++++++++++++++++++-----------------
> lib/kunit/Makefile | 3 +-
> lib/kunit/executor.c | 36 ++++++++++++++++++++++
> 3 files changed, 83 insertions(+), 29 deletions(-)
> create mode 100644 lib/kunit/executor.c
>
> diff --git a/include/kunit/test.h b/include/kunit/test.h
> index 2dfb550c6723a..8a02f93a6b505 100644
> --- a/include/kunit/test.h
> +++ b/include/kunit/test.h
The following fragment does not match the test.h in Linux 5.5 or 5.4-rc1 (as one
possible earlier version). And we are not to Linux 5.5-rc1 yet. (Simple way
to check for the mis-match - 5.5 has kunit_test_suite() instead of
kunit_test_suites().)
I know that there is an alternate tree where some of the development occurs.
Can you please add a link in MAINTAINERS? And please note (at least in
patch 0) what tree the series is developed against?
-Frank
> @@ -197,46 +197,63 @@ void kunit_init_test(struct kunit *test, const char *name);
>
> int kunit_run_tests(struct kunit_suite *suite);
>
> -/**
> - * kunit_test_suites() - used to register one or more &struct kunit_suite
> - * with KUnit.
> - *
> - * @suites: a statically allocated list of &struct kunit_suite.
> - *
> - * Registers @suites with the test framework. See &struct kunit_suite for
> - * more information.
> - *
> - * When builtin, KUnit tests are all run as late_initcalls; this means
> - * that they cannot test anything where tests must run at a different init
> - * phase. One significant restriction resulting from this is that KUnit
> - * cannot reliably test anything that is initialize in the late_init phase;
> - * another is that KUnit is useless to test things that need to be run in
> - * an earlier init phase.
> - *
> - * An alternative is to build the tests as a module. Because modules
> - * do not support multiple late_initcall()s, we need to initialize an
> - * array of suites for a module.
> - *
> - * TODO(brendanhiggins@google.com): Don't run all KUnit tests as
> - * late_initcalls. I have some future work planned to dispatch all KUnit
> - * tests from the same place, and at the very least to do so after
> - * everything else is definitely initialized.
> +/*
> + * If a test suite is built-in, module_init() gets translated into
> + * an initcall which we don't want as the idea is that for builtins
> + * the executor will manage execution. So ensure we do not define
> + * module_{init|exit} functions for the builtin case when registering
> + * suites via kunit_test_suites() below.
> */
> -#define kunit_test_suites(...) \
> - static struct kunit_suite *suites[] = { __VA_ARGS__, NULL}; \
> - static int kunit_test_suites_init(void) \
> +#ifdef MODULE
> +#define kunit_test_suites_for_module(__suites) \
> + static int __init kunit_test_suites_init(void) \
> { \
> + struct kunit_suite *suites[] = (__suites); \
> unsigned int i; \
> + \
> for (i = 0; suites[i] != NULL; i++) \
> kunit_run_tests(suites[i]); \
> return 0; \
> } \
> - late_initcall(kunit_test_suites_init); \
> + module_init(kunit_test_suites_init); \
> + \
> static void __exit kunit_test_suites_exit(void) \
> { \
> return; \
> } \
> module_exit(kunit_test_suites_exit)
> +#else
> +#define kunit_test_suites_for_module(__suites)
> +#endif /* MODULE */
> +
> +#define __kunit_test_suites(unique_array, unique_suites, ...) \
> + static struct kunit_suite *unique_array[] = { __VA_ARGS__, NULL }; \
> + kunit_test_suites_for_module(unique_array); \
> + static struct kunit_suite **unique_suites \
> + __used __aligned(8) __section(.kunit_test_suites) = unique_array
> +
> +/**
> + * kunit_test_suites() - used to register one or more &struct kunit_suite
> + * with KUnit.
> + *
> + * @suites: a statically allocated list of &struct kunit_suite.
> + *
> + * Registers @suites with the test framework. See &struct kunit_suite for
> + * more information.
> + *
> + * When builtin, KUnit tests are all run via executor; this is done
> + * by placing the array of struct kunit_suite * in the .kunit_test_suites
> + * ELF section.
> + *
> + * An alternative is to build the tests as a module. Because modules do not
> + * support multiple initcall()s, we need to initialize an array of suites for a
> + * module.
> + *
> + */
> +#define kunit_test_suites(...) \
> + __kunit_test_suites(__UNIQUE_ID(array), \
> + __UNIQUE_ID(suites), \
> + __VA_ARGS__)
>
> #define kunit_test_suite(suite) kunit_test_suites(&suite)
>
> diff --git a/lib/kunit/Makefile b/lib/kunit/Makefile
> index fab55649b69a5..c282f02ca066b 100644
> --- a/lib/kunit/Makefile
> +++ b/lib/kunit/Makefile
> @@ -3,7 +3,8 @@ obj-$(CONFIG_KUNIT) += kunit.o
> kunit-objs += test.o \
> string-stream.o \
> assert.o \
> - try-catch.o
> + try-catch.o \
> + executor.o
>
> obj-$(CONFIG_KUNIT_TEST) += kunit-test.o
>
> diff --git a/lib/kunit/executor.c b/lib/kunit/executor.c
> new file mode 100644
> index 0000000000000..6429927d598a5
> --- /dev/null
> +++ b/lib/kunit/executor.c
> @@ -0,0 +1,36 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +#include <kunit/test.h>
> +
> +/*
> + * These symbols point to the .kunit_test_suites section and are defined in
> + * include/asm-generic/vmlinux.lds.h, and consequently must be extern.
> + */
> +extern struct kunit_suite * const * const __kunit_suites_start[];
> +extern struct kunit_suite * const * const __kunit_suites_end[];
> +
> +#if IS_BUILTIN(CONFIG_KUNIT)
> +
> +static int kunit_run_all_tests(void)
> +{
> + struct kunit_suite * const * const *suites, * const *subsuite;
> + bool has_test_failed = false;
> +
> + for (suites = __kunit_suites_start;
> + suites < __kunit_suites_end;
> + suites++) {
> + for (subsuite = *suites; *subsuite != NULL; subsuite++) {
> + if (kunit_run_tests(*subsuite))
> + has_test_failed = true;
> + }
> + }
> +
> + if (has_test_failed)
> + return -EFAULT;
> +
> + return 0;
> +}
> +
> +late_initcall(kunit_run_all_tests);
> +
> +#endif /* IS_BUILTIN(CONFIG_KUNIT) */
>
WARNING: multiple messages have this Message-ID (diff)
From: Frank Rowand <frowand.list@gmail.com>
To: Brendan Higgins <brendanhiggins@google.com>,
jdike@addtoit.com, richard@nod.at,
anton.ivanov@cambridgegreys.com, arnd@arndb.de,
keescook@chromium.org, skhan@linuxfoundation.org,
alan.maguire@oracle.com, yzaikin@google.com, davidgow@google.com,
akpm@linux-foundation.org, rppt@linux.ibm.com
Cc: linux-arch@vger.kernel.org, linux-doc@vger.kernel.org,
sboyd@kernel.org, gregkh@linuxfoundation.org,
knut.omang@oracle.com, linux-kernel@vger.kernel.org,
linux-um@lists.infradead.org, mcgrof@kernel.org,
linux-kselftest@vger.kernel.org, logang@deltatee.com,
kunit-dev@googlegroups.com
Subject: Re: [PATCH v2 3/7] kunit: test: create a single centralized executor for all tests
Date: Tue, 4 Feb 2020 16:27:12 -0600 [thread overview]
Message-ID: <11977708-bb18-e322-db7a-9f21d7cdec54@gmail.com> (raw)
In-Reply-To: <20200130230812.142642-4-brendanhiggins@google.com>
On 1/30/20 5:08 PM, Brendan Higgins wrote:
> From: Alan Maguire <alan.maguire@oracle.com>
>
> Add a centralized executor to dispatch tests rather than relying on
> late_initcall to schedule each test suite separately. Centralized
> execution is for built-in tests only; modules will execute tests
> when loaded.
>
> Signed-off-by: Alan Maguire <alan.maguire@oracle.com>
> Co-developed-by: Iurii Zaikin <yzaikin@google.com>
> Signed-off-by: Iurii Zaikin <yzaikin@google.com>
> Co-developed-by: Brendan Higgins <brendanhiggins@google.com>
> Signed-off-by: Brendan Higgins <brendanhiggins@google.com>
> Reviewed-by: Stephen Boyd <sboyd@kernel.org>
> ---
> include/kunit/test.h | 73 +++++++++++++++++++++++++++-----------------
> lib/kunit/Makefile | 3 +-
> lib/kunit/executor.c | 36 ++++++++++++++++++++++
> 3 files changed, 83 insertions(+), 29 deletions(-)
> create mode 100644 lib/kunit/executor.c
>
> diff --git a/include/kunit/test.h b/include/kunit/test.h
> index 2dfb550c6723a..8a02f93a6b505 100644
> --- a/include/kunit/test.h
> +++ b/include/kunit/test.h
The following fragment does not match the test.h in Linux 5.5 or 5.4-rc1 (as one
possible earlier version). And we are not to Linux 5.5-rc1 yet. (Simple way
to check for the mis-match - 5.5 has kunit_test_suite() instead of
kunit_test_suites().)
I know that there is an alternate tree where some of the development occurs.
Can you please add a link in MAINTAINERS? And please note (at least in
patch 0) what tree the series is developed against?
-Frank
> @@ -197,46 +197,63 @@ void kunit_init_test(struct kunit *test, const char *name);
>
> int kunit_run_tests(struct kunit_suite *suite);
>
> -/**
> - * kunit_test_suites() - used to register one or more &struct kunit_suite
> - * with KUnit.
> - *
> - * @suites: a statically allocated list of &struct kunit_suite.
> - *
> - * Registers @suites with the test framework. See &struct kunit_suite for
> - * more information.
> - *
> - * When builtin, KUnit tests are all run as late_initcalls; this means
> - * that they cannot test anything where tests must run at a different init
> - * phase. One significant restriction resulting from this is that KUnit
> - * cannot reliably test anything that is initialize in the late_init phase;
> - * another is that KUnit is useless to test things that need to be run in
> - * an earlier init phase.
> - *
> - * An alternative is to build the tests as a module. Because modules
> - * do not support multiple late_initcall()s, we need to initialize an
> - * array of suites for a module.
> - *
> - * TODO(brendanhiggins@google.com): Don't run all KUnit tests as
> - * late_initcalls. I have some future work planned to dispatch all KUnit
> - * tests from the same place, and at the very least to do so after
> - * everything else is definitely initialized.
> +/*
> + * If a test suite is built-in, module_init() gets translated into
> + * an initcall which we don't want as the idea is that for builtins
> + * the executor will manage execution. So ensure we do not define
> + * module_{init|exit} functions for the builtin case when registering
> + * suites via kunit_test_suites() below.
> */
> -#define kunit_test_suites(...) \
> - static struct kunit_suite *suites[] = { __VA_ARGS__, NULL}; \
> - static int kunit_test_suites_init(void) \
> +#ifdef MODULE
> +#define kunit_test_suites_for_module(__suites) \
> + static int __init kunit_test_suites_init(void) \
> { \
> + struct kunit_suite *suites[] = (__suites); \
> unsigned int i; \
> + \
> for (i = 0; suites[i] != NULL; i++) \
> kunit_run_tests(suites[i]); \
> return 0; \
> } \
> - late_initcall(kunit_test_suites_init); \
> + module_init(kunit_test_suites_init); \
> + \
> static void __exit kunit_test_suites_exit(void) \
> { \
> return; \
> } \
> module_exit(kunit_test_suites_exit)
> +#else
> +#define kunit_test_suites_for_module(__suites)
> +#endif /* MODULE */
> +
> +#define __kunit_test_suites(unique_array, unique_suites, ...) \
> + static struct kunit_suite *unique_array[] = { __VA_ARGS__, NULL }; \
> + kunit_test_suites_for_module(unique_array); \
> + static struct kunit_suite **unique_suites \
> + __used __aligned(8) __section(.kunit_test_suites) = unique_array
> +
> +/**
> + * kunit_test_suites() - used to register one or more &struct kunit_suite
> + * with KUnit.
> + *
> + * @suites: a statically allocated list of &struct kunit_suite.
> + *
> + * Registers @suites with the test framework. See &struct kunit_suite for
> + * more information.
> + *
> + * When builtin, KUnit tests are all run via executor; this is done
> + * by placing the array of struct kunit_suite * in the .kunit_test_suites
> + * ELF section.
> + *
> + * An alternative is to build the tests as a module. Because modules do not
> + * support multiple initcall()s, we need to initialize an array of suites for a
> + * module.
> + *
> + */
> +#define kunit_test_suites(...) \
> + __kunit_test_suites(__UNIQUE_ID(array), \
> + __UNIQUE_ID(suites), \
> + __VA_ARGS__)
>
> #define kunit_test_suite(suite) kunit_test_suites(&suite)
>
> diff --git a/lib/kunit/Makefile b/lib/kunit/Makefile
> index fab55649b69a5..c282f02ca066b 100644
> --- a/lib/kunit/Makefile
> +++ b/lib/kunit/Makefile
> @@ -3,7 +3,8 @@ obj-$(CONFIG_KUNIT) += kunit.o
> kunit-objs += test.o \
> string-stream.o \
> assert.o \
> - try-catch.o
> + try-catch.o \
> + executor.o
>
> obj-$(CONFIG_KUNIT_TEST) += kunit-test.o
>
> diff --git a/lib/kunit/executor.c b/lib/kunit/executor.c
> new file mode 100644
> index 0000000000000..6429927d598a5
> --- /dev/null
> +++ b/lib/kunit/executor.c
> @@ -0,0 +1,36 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +#include <kunit/test.h>
> +
> +/*
> + * These symbols point to the .kunit_test_suites section and are defined in
> + * include/asm-generic/vmlinux.lds.h, and consequently must be extern.
> + */
> +extern struct kunit_suite * const * const __kunit_suites_start[];
> +extern struct kunit_suite * const * const __kunit_suites_end[];
> +
> +#if IS_BUILTIN(CONFIG_KUNIT)
> +
> +static int kunit_run_all_tests(void)
> +{
> + struct kunit_suite * const * const *suites, * const *subsuite;
> + bool has_test_failed = false;
> +
> + for (suites = __kunit_suites_start;
> + suites < __kunit_suites_end;
> + suites++) {
> + for (subsuite = *suites; *subsuite != NULL; subsuite++) {
> + if (kunit_run_tests(*subsuite))
> + has_test_failed = true;
> + }
> + }
> +
> + if (has_test_failed)
> + return -EFAULT;
> +
> + return 0;
> +}
> +
> +late_initcall(kunit_run_all_tests);
> +
> +#endif /* IS_BUILTIN(CONFIG_KUNIT) */
>
_______________________________________________
linux-um mailing list
linux-um@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-um
next prev parent reply other threads:[~2020-02-04 22:27 UTC|newest]
Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-01-30 23:08 [PATCH v2 0/7] kunit: create a centralized executor to dispatch all KUnit tests Brendan Higgins
2020-01-30 23:08 ` Brendan Higgins
2020-01-30 23:08 ` [PATCH v2 1/7] vmlinux.lds.h: add linker section for KUnit test suites Brendan Higgins
2020-01-30 23:08 ` Brendan Higgins
2020-01-30 23:08 ` [PATCH v2 2/7] arch: um: " Brendan Higgins
2020-01-30 23:08 ` Brendan Higgins
2020-02-04 21:59 ` Frank Rowand
2020-02-04 21:59 ` Frank Rowand
2020-02-04 22:30 ` Brendan Higgins
2020-02-04 22:30 ` Brendan Higgins
2020-02-04 23:17 ` Frank Rowand
2020-02-04 23:17 ` Frank Rowand
2020-02-04 23:17 ` Frank Rowand
2020-02-05 1:17 ` Brendan Higgins
2020-02-05 1:17 ` Brendan Higgins
2020-02-05 1:17 ` Brendan Higgins
2020-02-06 19:22 ` David Gow
2020-02-06 19:22 ` David Gow
2020-02-06 19:22 ` David Gow
2020-01-30 23:08 ` [PATCH v2 3/7] kunit: test: create a single centralized executor for all tests Brendan Higgins
2020-01-30 23:08 ` Brendan Higgins
2020-02-04 22:27 ` Frank Rowand [this message]
2020-02-04 22:27 ` Frank Rowand
2020-02-04 22:35 ` Brendan Higgins
2020-02-04 22:35 ` Brendan Higgins
2020-02-04 22:35 ` Brendan Higgins
2020-01-30 23:08 ` [PATCH v2 4/7] init: main: add KUnit to kernel init Brendan Higgins
2020-01-30 23:08 ` Brendan Higgins
2020-03-02 20:00 ` Luis Chamberlain
2020-03-02 20:00 ` Luis Chamberlain
2020-01-30 23:08 ` [PATCH v2 5/7] kunit: test: add test plan to KUnit TAP format Brendan Higgins
2020-01-30 23:08 ` Brendan Higgins
2020-02-04 23:01 ` Frank Rowand
2020-02-04 23:01 ` Frank Rowand
2020-02-06 18:47 ` Brendan Higgins
2020-02-06 18:47 ` Brendan Higgins
2020-02-06 18:47 ` Brendan Higgins
2020-01-30 23:08 ` [PATCH v2 6/7] kunit: Add 'kunit_shutdown' option Brendan Higgins
2020-01-30 23:08 ` Brendan Higgins
2020-02-04 23:05 ` Frank Rowand
2020-02-04 23:05 ` Frank Rowand
2020-02-04 23:05 ` Frank Rowand
2020-02-04 23:05 ` Frank Rowand
2020-01-30 23:08 ` [PATCH v2 7/7] Documentation: Add kunit_shutdown to kernel-parameters.txt Brendan Higgins
2020-01-30 23:08 ` Brendan Higgins
2020-02-05 0:19 ` Frank Rowand
2020-02-05 0:19 ` Frank Rowand
2020-02-04 7:19 ` [PATCH v2 0/7] kunit: create a centralized executor to dispatch all KUnit tests Stephen Boyd
2020-02-04 7:19 ` Stephen Boyd
2020-02-04 7:19 ` Stephen Boyd
2020-02-04 7:19 ` Stephen Boyd
2020-02-04 19:35 ` Brendan Higgins
2020-02-04 19:35 ` Brendan Higgins
2020-02-04 19:35 ` Brendan Higgins
2020-02-04 23:35 ` Frank Rowand
2020-02-04 23:35 ` Frank Rowand
2020-02-04 23:35 ` Frank Rowand
2020-02-04 21:18 ` Frank Rowand
2020-02-04 21:18 ` Frank Rowand
2020-02-04 22:01 ` Brendan Higgins
2020-02-04 22:01 ` Brendan Higgins
2020-02-04 22:01 ` Brendan Higgins
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=11977708-bb18-e322-db7a-9f21d7cdec54@gmail.com \
--to=frowand.list@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=alan.maguire@oracle.com \
--cc=anton.ivanov@cambridgegreys.com \
--cc=arnd@arndb.de \
--cc=brendanhiggins@google.com \
--cc=davidgow@google.com \
--cc=gregkh@linuxfoundation.org \
--cc=jdike@addtoit.com \
--cc=keescook@chromium.org \
--cc=knut.omang@oracle.com \
--cc=kunit-dev@googlegroups.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-um@lists.infradead.org \
--cc=logang@deltatee.com \
--cc=mcgrof@kernel.org \
--cc=richard@nod.at \
--cc=rppt@linux.ibm.com \
--cc=sboyd@kernel.org \
--cc=skhan@linuxfoundation.org \
--cc=yzaikin@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.