eebf4dd452
kselftest runs as a userspace process. Sometimes we need to test things from kernel space. One way of doing this is by creating a test module. Currently doing so requires developers to write a bunch of boiler plate in the module if kselftest is to be used to run the tests. This means we currently have a load of duplicate code to achieve these ends. If we have a uniform method for implementing test modules then we can reduce code duplication, ensure uniformity in the test framework, ease code maintenance, and reduce the work required to create tests. This all helps to encourage developers to write and run tests. Add a C header file that can be included in test modules. This provides a single point for common test functions/macros. Implement a few macros that make up the start of the test framework. Add documentation for new kselftest header to kselftest documentation. Acked-by: Kees Cook <keescook@chromium.org> Signed-off-by: Tobin C. Harding <tobin@kernel.org> Signed-off-by: Shuah Khan <shuah@kernel.org>
49 lines
1.2 KiB
C
49 lines
1.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0+ */
|
|
#ifndef __KSELFTEST_MODULE_H
|
|
#define __KSELFTEST_MODULE_H
|
|
|
|
#include <linux/module.h>
|
|
|
|
/*
|
|
* Test framework for writing test modules to be loaded by kselftest.
|
|
* See Documentation/dev-tools/kselftest.rst for an example test module.
|
|
*/
|
|
|
|
#define KSTM_MODULE_GLOBALS() \
|
|
static unsigned int total_tests __initdata; \
|
|
static unsigned int failed_tests __initdata
|
|
|
|
#define KSTM_CHECK_ZERO(x) do { \
|
|
total_tests++; \
|
|
if (x) { \
|
|
pr_warn("TC failed at %s:%d\n", __func__, __LINE__); \
|
|
failed_tests++; \
|
|
} \
|
|
} while (0)
|
|
|
|
static inline int kstm_report(unsigned int total_tests, unsigned int failed_tests)
|
|
{
|
|
if (failed_tests == 0)
|
|
pr_info("all %u tests passed\n", total_tests);
|
|
else
|
|
pr_warn("failed %u out of %u tests\n", failed_tests, total_tests);
|
|
|
|
return failed_tests ? -EINVAL : 0;
|
|
}
|
|
|
|
#define KSTM_MODULE_LOADERS(__module) \
|
|
static int __init __module##_init(void) \
|
|
{ \
|
|
pr_info("loaded.\n"); \
|
|
selftest(); \
|
|
return kstm_report(total_tests, failed_tests); \
|
|
} \
|
|
static void __exit __module##_exit(void) \
|
|
{ \
|
|
pr_info("unloaded.\n"); \
|
|
} \
|
|
module_init(__module##_init); \
|
|
module_exit(__module##_exit)
|
|
|
|
#endif /* __KSELFTEST_MODULE_H */
|