From: Kees Cook <keescook@chromium.org>
To: Vitor Massaru Iha <vitor@massaru.org>
Cc: davidgow@google.com, linux@rasmusvillemoes.dk,
brendanhiggins@google.com, linux-kernel@vger.kernel.org,
linux-kselftest@vger.kernel.org,
linux-kernel-mentees@lists.linuxfoundation.org,
kunit-dev@googlegroups.com
Subject: Re: [Linux-kernel-mentees] [RESEND, PATCH v2] lib: overflow-test: add KUnit test of check_*_overflow functions
Date: Thu, 18 Jun 2020 20:05:57 -0700 [thread overview]
Message-ID: <202006181949.6402C456@keescook> (raw)
In-Reply-To: <20200618140814.135948-1-vitor@massaru.org>
On Thu, Jun 18, 2020 at 11:08:14AM -0300, Vitor Massaru Iha wrote:
> This adds the conversion of the runtime tests of check_*_overflow functions,
> from `lib/test_overflow.c`to KUnit tests.
>
> The log similar to the one seen in dmesg running test_overflow.c can be
> seen in `test.log`.
>
> Signed-off-by: Vitor Massaru Iha <vitor@massaru.org>
> Tested-by: David Gow <davidgow@google.com>
> ---
> v2:
> * moved lib/test_overflow.c to lib/overflow-test.c;
I still don't want a dash in the filename, as this creates a difference
between the source name and the module name. While I still prefer
overflow_kunit.c, I can get over it and accept overflow_test.c :)
> * back to original license;
> * fixed style code;
> * keeps __initconst and added _refdata on overflow_test_cases variable;
> * keeps macros intact making asserts with the variable err;
> * removed duplicate test_s8_overflow();
> * fixed typos on commit message;
> ---
> lib/Kconfig.debug | 20 +++++++--
> lib/Makefile | 2 +-
> lib/{test_overflow.c => overflow-test.c} | 54 +++++++++---------------
> 3 files changed, 38 insertions(+), 38 deletions(-)
> rename lib/{test_overflow.c => overflow-test.c} (96%)
>
> diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
> index d74ac0fd6b2d..fb8a3955e969 100644
> --- a/lib/Kconfig.debug
> +++ b/lib/Kconfig.debug
> @@ -2000,9 +2000,6 @@ config TEST_UUID
> config TEST_XARRAY
> tristate "Test the XArray code at runtime"
>
> -config TEST_OVERFLOW
> - tristate "Test check_*_overflow() functions at runtime"
> -
> config TEST_RHASHTABLE
> tristate "Perform selftest on resizable hash table"
> help
> @@ -2155,6 +2152,23 @@ config SYSCTL_KUNIT_TEST
>
> If unsure, say N.
>
> +config OVERFLOW_KUNIT_TEST
> + tristate "KUnit test for overflow" if !KUNIT_ALL_TESTS
> + depends on KUNIT
> + default KUNIT_ALL_TESTS
> + help
> + This builds the overflow KUnit tests.
> +
> + KUnit tests run during boot and output the results to the debug log
> + in TAP format (http://testanything.org/). Only useful for kernel devs
> + running KUnit test harness and are not for inclusion into a production
> + build.
> +
> + For more information on KUnit and unit tests in general please refer
> + to the KUnit documentation in Documentation/dev-tools/kunit/.
> +
> + If unsure, say N.
> +
> config LIST_KUNIT_TEST
> tristate "KUnit Test for Kernel Linked-list structures" if !KUNIT_ALL_TESTS
> depends on KUNIT
> diff --git a/lib/Makefile b/lib/Makefile
> index b1c42c10073b..3b725c9f92d4 100644
> --- a/lib/Makefile
> +++ b/lib/Makefile
> @@ -75,7 +75,6 @@ obj-$(CONFIG_TEST_LIST_SORT) += test_list_sort.o
> obj-$(CONFIG_TEST_MIN_HEAP) += test_min_heap.o
> obj-$(CONFIG_TEST_LKM) += test_module.o
> obj-$(CONFIG_TEST_VMALLOC) += test_vmalloc.o
> -obj-$(CONFIG_TEST_OVERFLOW) += test_overflow.o
> obj-$(CONFIG_TEST_RHASHTABLE) += test_rhashtable.o
> obj-$(CONFIG_TEST_SORT) += test_sort.o
> obj-$(CONFIG_TEST_USER_COPY) += test_user_copy.o
> @@ -318,3 +317,4 @@ obj-$(CONFIG_OBJAGG) += objagg.o
> # KUnit tests
> obj-$(CONFIG_LIST_KUNIT_TEST) += list-test.o
> obj-$(CONFIG_LINEAR_RANGES_TEST) += test_linear_ranges.o
> +obj-$(CONFIG_OVERFLOW_KUNIT_TEST) += overflow-test.o
> diff --git a/lib/test_overflow.c b/lib/overflow-test.c
> similarity index 96%
> rename from lib/test_overflow.c
> rename to lib/overflow-test.c
> index 7a4b6f6c5473..d40ef06b1ade 100644
> --- a/lib/test_overflow.c
> +++ b/lib/overflow-test.c
> @@ -4,14 +4,11 @@
> */
> #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
>
> +#include <kunit/test.h>
> #include <linux/device.h>
> #include <linux/init.h>
> -#include <linux/kernel.h>
> #include <linux/mm.h>
> -#include <linux/module.h>
> #include <linux/overflow.h>
> -#include <linux/slab.h>
> -#include <linux/types.h>
> #include <linux/vmalloc.h>
>
> #define DEFINE_TEST_ARRAY(t) \
> @@ -270,7 +267,7 @@ DEFINE_TEST_FUNC(u64, "%llu");
> DEFINE_TEST_FUNC(s64, "%lld");
> #endif
>
> -static int __init test_overflow_calculation(void)
> +static void __init overflow_calculation_test(struct kunit *test)
> {
> int err = 0;
>
> @@ -285,10 +282,10 @@ static int __init test_overflow_calculation(void)
> err |= test_s64_overflow();
> #endif
>
> - return err;
> + KUNIT_EXPECT_FALSE(test, err);
> }
Ah! Well, yes, I guess that is one way to do it. :) I'm just curious:
why the change away from doing EXPECTs on individual tests?
>
> -static int __init test_overflow_shift(void)
> +static void __init overflow_shift_test(struct kunit *test)
> {
> int err = 0;
>
> @@ -479,7 +476,7 @@ static int __init test_overflow_shift(void)
> err |= TEST_ONE_SHIFT(0, 31, s32, 0, false);
> err |= TEST_ONE_SHIFT(0, 63, s64, 0, false);
>
> - return err;
> + KUNIT_EXPECT_FALSE(test, err);
> }
>
> /*
> @@ -555,7 +552,7 @@ DEFINE_TEST_ALLOC(kvzalloc_node, kvfree, 0, 1, 1);
> DEFINE_TEST_ALLOC(devm_kmalloc, devm_kfree, 1, 1, 0);
> DEFINE_TEST_ALLOC(devm_kzalloc, devm_kfree, 1, 1, 0);
>
> -static int __init test_overflow_allocation(void)
> +static void __init overflow_allocation_test(struct kunit *test)
> {
> const char device_name[] = "overflow-test";
> struct device *dev;
> @@ -563,10 +560,8 @@ static int __init test_overflow_allocation(void)
>
> /* Create dummy device for devm_kmalloc()-family tests. */
> dev = root_device_register(device_name);
> - if (IS_ERR(dev)) {
> - pr_warn("Cannot register test device\n");
> - return 1;
> - }
> + if (IS_ERR(dev))
> + kunit_warn(test, "Cannot register test device\n");
>
> err |= test_kmalloc(NULL);
> err |= test_kmalloc_node(NULL);
> @@ -585,30 +580,21 @@ static int __init test_overflow_allocation(void)
>
> device_unregister(dev);
>
> - return err;
> + KUNIT_EXPECT_FALSE(test, err);
> }
>
> -static int __init test_module_init(void)
> -{
> - int err = 0;
> -
> - err |= test_overflow_calculation();
> - err |= test_overflow_shift();
> - err |= test_overflow_allocation();
> -
> - if (err) {
> - pr_warn("FAIL!\n");
> - err = -EINVAL;
> - } else {
> - pr_info("all tests passed\n");
> - }
> +static struct kunit_case __refdata overflow_test_cases[] = {
Erm, __refdata? This seems like it should be __initdata.
> + KUNIT_CASE(overflow_calculation_test),
> + KUNIT_CASE(overflow_shift_test),
> + KUNIT_CASE(overflow_allocation_test),
> + {}
> +};
>
> - return err;
> -}
> +static struct kunit_suite overflow_test_suite = {
And this.
> + .name = "overflow",
> + .test_cases = overflow_test_cases,
> +};
>
> -static void __exit test_module_exit(void)
> -{ }
> +kunit_test_suites(&overflow_test_suite);
I suspect the problem causing the need for __refdata there is the lack
of __init markings on the functions in kunit_test_suites()?
(Or maybe this is explained somewhere else I've missed it.)
For example, would this work? (I haven't tested it all.)
diff --git a/include/kunit/test.h b/include/kunit/test.h
index 59f3144f009a..aad746d59d2f 100644
--- a/include/kunit/test.h
+++ b/include/kunit/test.h
@@ -233,9 +233,9 @@ size_t kunit_suite_num_test_cases(struct kunit_suite *suite);
unsigned int kunit_test_case_num(struct kunit_suite *suite,
struct kunit_case *test_case);
-int __kunit_test_suites_init(struct kunit_suite **suites);
+int __init __kunit_test_suites_init(struct kunit_suite **suites);
-void __kunit_test_suites_exit(struct kunit_suite **suites);
+void __exit __kunit_test_suites_exit(struct kunit_suite **suites);
/**
* kunit_test_suites() - used to register one or more &struct kunit_suite
@@ -263,8 +263,9 @@ void __kunit_test_suites_exit(struct kunit_suite **suites);
* everything else is definitely initialized.
*/
#define kunit_test_suites(suites_list...) \
- static struct kunit_suite *suites[] = {suites_list, NULL}; \
- static int kunit_test_suites_init(void) \
+ static struct kunit_suite *suites[] __initdata = \
+ {suites_list, NULL}; \
+ static int __init kunit_test_suites_init(void) \
{ \
return __kunit_test_suites_init(suites); \
} \
diff --git a/lib/kunit/test.c b/lib/kunit/test.c
index c36037200310..bfb0f563721b 100644
--- a/lib/kunit/test.c
+++ b/lib/kunit/test.c
@@ -381,7 +381,7 @@ static void kunit_init_suite(struct kunit_suite *suite)
kunit_debugfs_create_suite(suite);
}
-int __kunit_test_suites_init(struct kunit_suite **suites)
+int __init __kunit_test_suites_init(struct kunit_suite **suites)
{
unsigned int i;
@@ -393,7 +393,7 @@ int __kunit_test_suites_init(struct kunit_suite **suites)
}
EXPORT_SYMBOL_GPL(__kunit_test_suites_init);
-static void kunit_exit_suite(struct kunit_suite *suite)
+static void __exit kunit_exit_suite(struct kunit_suite *suite)
{
kunit_debugfs_destroy_suite(suite);
}
>
> -module_init(test_module_init);
> -module_exit(test_module_exit);
> MODULE_LICENSE("Dual MIT/GPL");
>
> base-commit: 7bf200b3a4ac10b1b0376c70b8c66ed39eae7cdd
> prerequisite-patch-id: e827b6b22f950b9f69620805a04e4a264cf4cc6a
> --
> 2.26.2
>
Thanks again for the conversion!
--
Kees Cook
_______________________________________________
Linux-kernel-mentees mailing list
Linux-kernel-mentees@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/linux-kernel-mentees
WARNING: multiple messages have this Message-ID (diff)
From: Kees Cook <keescook@chromium.org>
To: Vitor Massaru Iha <vitor@massaru.org>
Cc: kunit-dev@googlegroups.com, skhan@linuxfoundation.org,
linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org,
brendanhiggins@google.com,
linux-kernel-mentees@lists.linuxfoundation.org,
linux@rasmusvillemoes.dk, davidgow@google.com
Subject: Re: [RESEND, PATCH v2] lib: overflow-test: add KUnit test of check_*_overflow functions
Date: Thu, 18 Jun 2020 20:05:57 -0700 [thread overview]
Message-ID: <202006181949.6402C456@keescook> (raw)
In-Reply-To: <20200618140814.135948-1-vitor@massaru.org>
On Thu, Jun 18, 2020 at 11:08:14AM -0300, Vitor Massaru Iha wrote:
> This adds the conversion of the runtime tests of check_*_overflow functions,
> from `lib/test_overflow.c`to KUnit tests.
>
> The log similar to the one seen in dmesg running test_overflow.c can be
> seen in `test.log`.
>
> Signed-off-by: Vitor Massaru Iha <vitor@massaru.org>
> Tested-by: David Gow <davidgow@google.com>
> ---
> v2:
> * moved lib/test_overflow.c to lib/overflow-test.c;
I still don't want a dash in the filename, as this creates a difference
between the source name and the module name. While I still prefer
overflow_kunit.c, I can get over it and accept overflow_test.c :)
> * back to original license;
> * fixed style code;
> * keeps __initconst and added _refdata on overflow_test_cases variable;
> * keeps macros intact making asserts with the variable err;
> * removed duplicate test_s8_overflow();
> * fixed typos on commit message;
> ---
> lib/Kconfig.debug | 20 +++++++--
> lib/Makefile | 2 +-
> lib/{test_overflow.c => overflow-test.c} | 54 +++++++++---------------
> 3 files changed, 38 insertions(+), 38 deletions(-)
> rename lib/{test_overflow.c => overflow-test.c} (96%)
>
> diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
> index d74ac0fd6b2d..fb8a3955e969 100644
> --- a/lib/Kconfig.debug
> +++ b/lib/Kconfig.debug
> @@ -2000,9 +2000,6 @@ config TEST_UUID
> config TEST_XARRAY
> tristate "Test the XArray code at runtime"
>
> -config TEST_OVERFLOW
> - tristate "Test check_*_overflow() functions at runtime"
> -
> config TEST_RHASHTABLE
> tristate "Perform selftest on resizable hash table"
> help
> @@ -2155,6 +2152,23 @@ config SYSCTL_KUNIT_TEST
>
> If unsure, say N.
>
> +config OVERFLOW_KUNIT_TEST
> + tristate "KUnit test for overflow" if !KUNIT_ALL_TESTS
> + depends on KUNIT
> + default KUNIT_ALL_TESTS
> + help
> + This builds the overflow KUnit tests.
> +
> + KUnit tests run during boot and output the results to the debug log
> + in TAP format (http://testanything.org/). Only useful for kernel devs
> + running KUnit test harness and are not for inclusion into a production
> + build.
> +
> + For more information on KUnit and unit tests in general please refer
> + to the KUnit documentation in Documentation/dev-tools/kunit/.
> +
> + If unsure, say N.
> +
> config LIST_KUNIT_TEST
> tristate "KUnit Test for Kernel Linked-list structures" if !KUNIT_ALL_TESTS
> depends on KUNIT
> diff --git a/lib/Makefile b/lib/Makefile
> index b1c42c10073b..3b725c9f92d4 100644
> --- a/lib/Makefile
> +++ b/lib/Makefile
> @@ -75,7 +75,6 @@ obj-$(CONFIG_TEST_LIST_SORT) += test_list_sort.o
> obj-$(CONFIG_TEST_MIN_HEAP) += test_min_heap.o
> obj-$(CONFIG_TEST_LKM) += test_module.o
> obj-$(CONFIG_TEST_VMALLOC) += test_vmalloc.o
> -obj-$(CONFIG_TEST_OVERFLOW) += test_overflow.o
> obj-$(CONFIG_TEST_RHASHTABLE) += test_rhashtable.o
> obj-$(CONFIG_TEST_SORT) += test_sort.o
> obj-$(CONFIG_TEST_USER_COPY) += test_user_copy.o
> @@ -318,3 +317,4 @@ obj-$(CONFIG_OBJAGG) += objagg.o
> # KUnit tests
> obj-$(CONFIG_LIST_KUNIT_TEST) += list-test.o
> obj-$(CONFIG_LINEAR_RANGES_TEST) += test_linear_ranges.o
> +obj-$(CONFIG_OVERFLOW_KUNIT_TEST) += overflow-test.o
> diff --git a/lib/test_overflow.c b/lib/overflow-test.c
> similarity index 96%
> rename from lib/test_overflow.c
> rename to lib/overflow-test.c
> index 7a4b6f6c5473..d40ef06b1ade 100644
> --- a/lib/test_overflow.c
> +++ b/lib/overflow-test.c
> @@ -4,14 +4,11 @@
> */
> #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
>
> +#include <kunit/test.h>
> #include <linux/device.h>
> #include <linux/init.h>
> -#include <linux/kernel.h>
> #include <linux/mm.h>
> -#include <linux/module.h>
> #include <linux/overflow.h>
> -#include <linux/slab.h>
> -#include <linux/types.h>
> #include <linux/vmalloc.h>
>
> #define DEFINE_TEST_ARRAY(t) \
> @@ -270,7 +267,7 @@ DEFINE_TEST_FUNC(u64, "%llu");
> DEFINE_TEST_FUNC(s64, "%lld");
> #endif
>
> -static int __init test_overflow_calculation(void)
> +static void __init overflow_calculation_test(struct kunit *test)
> {
> int err = 0;
>
> @@ -285,10 +282,10 @@ static int __init test_overflow_calculation(void)
> err |= test_s64_overflow();
> #endif
>
> - return err;
> + KUNIT_EXPECT_FALSE(test, err);
> }
Ah! Well, yes, I guess that is one way to do it. :) I'm just curious:
why the change away from doing EXPECTs on individual tests?
>
> -static int __init test_overflow_shift(void)
> +static void __init overflow_shift_test(struct kunit *test)
> {
> int err = 0;
>
> @@ -479,7 +476,7 @@ static int __init test_overflow_shift(void)
> err |= TEST_ONE_SHIFT(0, 31, s32, 0, false);
> err |= TEST_ONE_SHIFT(0, 63, s64, 0, false);
>
> - return err;
> + KUNIT_EXPECT_FALSE(test, err);
> }
>
> /*
> @@ -555,7 +552,7 @@ DEFINE_TEST_ALLOC(kvzalloc_node, kvfree, 0, 1, 1);
> DEFINE_TEST_ALLOC(devm_kmalloc, devm_kfree, 1, 1, 0);
> DEFINE_TEST_ALLOC(devm_kzalloc, devm_kfree, 1, 1, 0);
>
> -static int __init test_overflow_allocation(void)
> +static void __init overflow_allocation_test(struct kunit *test)
> {
> const char device_name[] = "overflow-test";
> struct device *dev;
> @@ -563,10 +560,8 @@ static int __init test_overflow_allocation(void)
>
> /* Create dummy device for devm_kmalloc()-family tests. */
> dev = root_device_register(device_name);
> - if (IS_ERR(dev)) {
> - pr_warn("Cannot register test device\n");
> - return 1;
> - }
> + if (IS_ERR(dev))
> + kunit_warn(test, "Cannot register test device\n");
>
> err |= test_kmalloc(NULL);
> err |= test_kmalloc_node(NULL);
> @@ -585,30 +580,21 @@ static int __init test_overflow_allocation(void)
>
> device_unregister(dev);
>
> - return err;
> + KUNIT_EXPECT_FALSE(test, err);
> }
>
> -static int __init test_module_init(void)
> -{
> - int err = 0;
> -
> - err |= test_overflow_calculation();
> - err |= test_overflow_shift();
> - err |= test_overflow_allocation();
> -
> - if (err) {
> - pr_warn("FAIL!\n");
> - err = -EINVAL;
> - } else {
> - pr_info("all tests passed\n");
> - }
> +static struct kunit_case __refdata overflow_test_cases[] = {
Erm, __refdata? This seems like it should be __initdata.
> + KUNIT_CASE(overflow_calculation_test),
> + KUNIT_CASE(overflow_shift_test),
> + KUNIT_CASE(overflow_allocation_test),
> + {}
> +};
>
> - return err;
> -}
> +static struct kunit_suite overflow_test_suite = {
And this.
> + .name = "overflow",
> + .test_cases = overflow_test_cases,
> +};
>
> -static void __exit test_module_exit(void)
> -{ }
> +kunit_test_suites(&overflow_test_suite);
I suspect the problem causing the need for __refdata there is the lack
of __init markings on the functions in kunit_test_suites()?
(Or maybe this is explained somewhere else I've missed it.)
For example, would this work? (I haven't tested it all.)
diff --git a/include/kunit/test.h b/include/kunit/test.h
index 59f3144f009a..aad746d59d2f 100644
--- a/include/kunit/test.h
+++ b/include/kunit/test.h
@@ -233,9 +233,9 @@ size_t kunit_suite_num_test_cases(struct kunit_suite *suite);
unsigned int kunit_test_case_num(struct kunit_suite *suite,
struct kunit_case *test_case);
-int __kunit_test_suites_init(struct kunit_suite **suites);
+int __init __kunit_test_suites_init(struct kunit_suite **suites);
-void __kunit_test_suites_exit(struct kunit_suite **suites);
+void __exit __kunit_test_suites_exit(struct kunit_suite **suites);
/**
* kunit_test_suites() - used to register one or more &struct kunit_suite
@@ -263,8 +263,9 @@ void __kunit_test_suites_exit(struct kunit_suite **suites);
* everything else is definitely initialized.
*/
#define kunit_test_suites(suites_list...) \
- static struct kunit_suite *suites[] = {suites_list, NULL}; \
- static int kunit_test_suites_init(void) \
+ static struct kunit_suite *suites[] __initdata = \
+ {suites_list, NULL}; \
+ static int __init kunit_test_suites_init(void) \
{ \
return __kunit_test_suites_init(suites); \
} \
diff --git a/lib/kunit/test.c b/lib/kunit/test.c
index c36037200310..bfb0f563721b 100644
--- a/lib/kunit/test.c
+++ b/lib/kunit/test.c
@@ -381,7 +381,7 @@ static void kunit_init_suite(struct kunit_suite *suite)
kunit_debugfs_create_suite(suite);
}
-int __kunit_test_suites_init(struct kunit_suite **suites)
+int __init __kunit_test_suites_init(struct kunit_suite **suites)
{
unsigned int i;
@@ -393,7 +393,7 @@ int __kunit_test_suites_init(struct kunit_suite **suites)
}
EXPORT_SYMBOL_GPL(__kunit_test_suites_init);
-static void kunit_exit_suite(struct kunit_suite *suite)
+static void __exit kunit_exit_suite(struct kunit_suite *suite)
{
kunit_debugfs_destroy_suite(suite);
}
>
> -module_init(test_module_init);
> -module_exit(test_module_exit);
> MODULE_LICENSE("Dual MIT/GPL");
>
> base-commit: 7bf200b3a4ac10b1b0376c70b8c66ed39eae7cdd
> prerequisite-patch-id: e827b6b22f950b9f69620805a04e4a264cf4cc6a
> --
> 2.26.2
>
Thanks again for the conversion!
--
Kees Cook
next prev parent reply other threads:[~2020-06-19 3:06 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-18 14:08 [Linux-kernel-mentees] [RESEND, PATCH v2] lib: overflow-test: add KUnit test of check_*_overflow functions Vitor Massaru Iha
2020-06-18 14:08 ` Vitor Massaru Iha
2020-06-19 3:05 ` Kees Cook [this message]
2020-06-19 3:05 ` Kees Cook
2020-06-19 21:57 ` [Linux-kernel-mentees] " Vitor Massaru Iha
2020-06-19 21:57 ` Vitor Massaru Iha
2020-06-25 23:43 ` [Linux-kernel-mentees] " Brendan Higgins via Linux-kernel-mentees
2020-06-25 23:43 ` Brendan Higgins
2020-06-25 13:58 ` [Linux-kernel-mentees] " kernel test robot
2020-06-25 13:58 ` kernel test robot
2020-06-25 13:58 ` kernel test robot
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=202006181949.6402C456@keescook \
--to=keescook@chromium.org \
--cc=brendanhiggins@google.com \
--cc=davidgow@google.com \
--cc=kunit-dev@googlegroups.com \
--cc=linux-kernel-mentees@lists.linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux@rasmusvillemoes.dk \
--cc=vitor@massaru.org \
/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.