mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-18 09:44:18 +08:00
s390/module: test loading modules with a lot of relocations
Add a test in order to prevent regressions. Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> Reviewed-by: Heiko Carstens <hca@linux.ibm.com> Cc: Vasily Gorbik <gor@linux.ibm.com> Cc: Christian Borntraeger <borntraeger@linux.ibm.com> Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
This commit is contained in:
parent
f3b7e73b2c
commit
90c5318795
@ -945,6 +945,9 @@ config S390_GUEST
|
|||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
|
config S390_MODULES_SANITY_TEST_HELPERS
|
||||||
|
def_bool n
|
||||||
|
|
||||||
menu "Selftests"
|
menu "Selftests"
|
||||||
|
|
||||||
config S390_UNWIND_SELFTEST
|
config S390_UNWIND_SELFTEST
|
||||||
@ -971,4 +974,16 @@ config S390_KPROBES_SANITY_TEST
|
|||||||
|
|
||||||
Say N if you are unsure.
|
Say N if you are unsure.
|
||||||
|
|
||||||
|
config S390_MODULES_SANITY_TEST
|
||||||
|
def_tristate n
|
||||||
|
depends on KUNIT
|
||||||
|
default KUNIT_ALL_TESTS
|
||||||
|
prompt "Enable s390 specific modules tests"
|
||||||
|
select S390_MODULES_SANITY_TEST_HELPERS
|
||||||
|
help
|
||||||
|
This option enables an s390 specific modules test. This option is
|
||||||
|
not useful for distributions or general kernels, but only for
|
||||||
|
kernel developers working on architecture code.
|
||||||
|
|
||||||
|
Say N if you are unsure.
|
||||||
endmenu
|
endmenu
|
||||||
|
@ -17,4 +17,7 @@ KASAN_SANITIZE_uaccess.o := n
|
|||||||
obj-$(CONFIG_S390_UNWIND_SELFTEST) += test_unwind.o
|
obj-$(CONFIG_S390_UNWIND_SELFTEST) += test_unwind.o
|
||||||
CFLAGS_test_unwind.o += -fno-optimize-sibling-calls
|
CFLAGS_test_unwind.o += -fno-optimize-sibling-calls
|
||||||
|
|
||||||
|
obj-$(CONFIG_S390_MODULES_SANITY_TEST) += test_modules.o
|
||||||
|
obj-$(CONFIG_S390_MODULES_SANITY_TEST_HELPERS) += test_modules_helpers.o
|
||||||
|
|
||||||
lib-$(CONFIG_FUNCTION_ERROR_INJECTION) += error-inject.o
|
lib-$(CONFIG_FUNCTION_ERROR_INJECTION) += error-inject.o
|
||||||
|
35
arch/s390/lib/test_modules.c
Normal file
35
arch/s390/lib/test_modules.c
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0+
|
||||||
|
|
||||||
|
#include <kunit/test.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
|
||||||
|
#include "test_modules.h"
|
||||||
|
|
||||||
|
#define DECLARE_RETURN(i) int test_modules_return_ ## i(void)
|
||||||
|
REPEAT_10000(DECLARE_RETURN);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Test that modules with many relocations are loaded properly.
|
||||||
|
*/
|
||||||
|
static void test_modules_many_vmlinux_relocs(struct kunit *test)
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
#define CALL_RETURN(i) result += test_modules_return_ ## i()
|
||||||
|
REPEAT_10000(CALL_RETURN);
|
||||||
|
KUNIT_ASSERT_EQ(test, result, 49995000);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct kunit_case modules_testcases[] = {
|
||||||
|
KUNIT_CASE(test_modules_many_vmlinux_relocs),
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct kunit_suite modules_test_suite = {
|
||||||
|
.name = "modules_test_s390",
|
||||||
|
.test_cases = modules_testcases,
|
||||||
|
};
|
||||||
|
|
||||||
|
kunit_test_suites(&modules_test_suite);
|
||||||
|
|
||||||
|
MODULE_LICENSE("GPL");
|
50
arch/s390/lib/test_modules.h
Normal file
50
arch/s390/lib/test_modules.h
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||||
|
#ifndef TEST_MODULES_H
|
||||||
|
#define TEST_MODULES_H
|
||||||
|
|
||||||
|
#define __REPEAT_10000_3(f, x) \
|
||||||
|
f(x ## 0); \
|
||||||
|
f(x ## 1); \
|
||||||
|
f(x ## 2); \
|
||||||
|
f(x ## 3); \
|
||||||
|
f(x ## 4); \
|
||||||
|
f(x ## 5); \
|
||||||
|
f(x ## 6); \
|
||||||
|
f(x ## 7); \
|
||||||
|
f(x ## 8); \
|
||||||
|
f(x ## 9)
|
||||||
|
#define __REPEAT_10000_2(f, x) \
|
||||||
|
__REPEAT_10000_3(f, x ## 0); \
|
||||||
|
__REPEAT_10000_3(f, x ## 1); \
|
||||||
|
__REPEAT_10000_3(f, x ## 2); \
|
||||||
|
__REPEAT_10000_3(f, x ## 3); \
|
||||||
|
__REPEAT_10000_3(f, x ## 4); \
|
||||||
|
__REPEAT_10000_3(f, x ## 5); \
|
||||||
|
__REPEAT_10000_3(f, x ## 6); \
|
||||||
|
__REPEAT_10000_3(f, x ## 7); \
|
||||||
|
__REPEAT_10000_3(f, x ## 8); \
|
||||||
|
__REPEAT_10000_3(f, x ## 9)
|
||||||
|
#define __REPEAT_10000_1(f, x) \
|
||||||
|
__REPEAT_10000_2(f, x ## 0); \
|
||||||
|
__REPEAT_10000_2(f, x ## 1); \
|
||||||
|
__REPEAT_10000_2(f, x ## 2); \
|
||||||
|
__REPEAT_10000_2(f, x ## 3); \
|
||||||
|
__REPEAT_10000_2(f, x ## 4); \
|
||||||
|
__REPEAT_10000_2(f, x ## 5); \
|
||||||
|
__REPEAT_10000_2(f, x ## 6); \
|
||||||
|
__REPEAT_10000_2(f, x ## 7); \
|
||||||
|
__REPEAT_10000_2(f, x ## 8); \
|
||||||
|
__REPEAT_10000_2(f, x ## 9)
|
||||||
|
#define REPEAT_10000(f) \
|
||||||
|
__REPEAT_10000_1(f, 0); \
|
||||||
|
__REPEAT_10000_1(f, 1); \
|
||||||
|
__REPEAT_10000_1(f, 2); \
|
||||||
|
__REPEAT_10000_1(f, 3); \
|
||||||
|
__REPEAT_10000_1(f, 4); \
|
||||||
|
__REPEAT_10000_1(f, 5); \
|
||||||
|
__REPEAT_10000_1(f, 6); \
|
||||||
|
__REPEAT_10000_1(f, 7); \
|
||||||
|
__REPEAT_10000_1(f, 8); \
|
||||||
|
__REPEAT_10000_1(f, 9)
|
||||||
|
|
||||||
|
#endif
|
13
arch/s390/lib/test_modules_helpers.c
Normal file
13
arch/s390/lib/test_modules_helpers.c
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0+
|
||||||
|
|
||||||
|
#include <linux/export.h>
|
||||||
|
|
||||||
|
#include "test_modules.h"
|
||||||
|
|
||||||
|
#define DEFINE_RETURN(i) \
|
||||||
|
int test_modules_return_ ## i(void) \
|
||||||
|
{ \
|
||||||
|
return 1 ## i - 10000; \
|
||||||
|
} \
|
||||||
|
EXPORT_SYMBOL_GPL(test_modules_return_ ## i)
|
||||||
|
REPEAT_10000(DEFINE_RETURN);
|
Loading…
Reference in New Issue
Block a user