* [PATCH v9] Kunit to check the longest symbol length
@ 2025-03-02 22:15 Sergio González Collado
2025-03-05 23:17 ` Rae Moar
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Sergio González Collado @ 2025-03-02 22:15 UTC (permalink / raw)
To: David Gow, Rae Moar, linux-kselftest, kunit-dev, Miguel Ojeda,
Alex Gaynor
Cc: Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin,
Andreas Hindborg, Alice Ryhl, David Rheinsberg, rust-for-linux,
x86, Sergio González Collado, Martin Rodriguez Reboredo,
Shuah Khan
The longest length of a symbol (KSYM_NAME_LEN) was increased to 512
in the reference [1]. This patch adds kunit test suite to check the longest
symbol length. These tests verify that the longest symbol length defined
is supported.
This test can also help other efforts for longer symbol length,
like [2].
The test suite defines one symbol with the longest possible length.
The first test verify that functions with names of the created
symbol, can be called or not.
The second test, verify that the symbols are created (or
not) in the kernel symbol table.
[1] https://lore.kernel.org/lkml/20220802015052.10452-6-ojeda@kernel.org/
[2] https://lore.kernel.org/lkml/20240605032120.3179157-1-song@kernel.org/
Tested-by: Martin Rodriguez Reboredo <yakoyoku@gmail.com>
Reviewed-by: Shuah Khan <skhan@linuxfoundation.org>
Reviewed-by: Rae Moar <rmoar@google.com>
Signed-off-by: Sergio González Collado <sergio.collado@gmail.com>
Link: https://github.com/Rust-for-Linux/linux/issues/504
---
V8 -> V9: removed unused macro & corrected error message
---
V7 -> V8: typo fixed & rebased
---
V6 -> V7: rebased
---
V5 -> V6: remove tests with symbols of length KSYM_NAME_LEN+1
---
V4 -> V5: fixed typo, added improved description
---
V3 -> V4: add x86 mantainers, add new reference.
---
V2 -> V3: updated base and added MODULE_DESCRIPTION() and MODULE_AUTHOR()
---
V1 -> V2: corrected CI tests. Added fix proposed at [3]
[3] https://lore.kernel.org/lkml/Y9ES4UKl%2F+DtvAVS@gmail.com/T/#m3ef0e12bb834d01ed1ebdcae12ef5f2add342077
The test execution should result in something like:
```
[20:04:35] =============== longest-symbol (4 subtests) ================
[20:04:35] [PASSED] test_longest_symbol
[20:04:35] [PASSED] test_longest_symbol_kallsyms
[20:04:35] ================= [PASSED] longest-symbol ==================
[20:04:35] ============================================================
[20:04:35] Testing complete. Ran 4 tests: passed: 4
```
---
arch/x86/tools/insn_decoder_test.c | 3 +-
lib/Kconfig.debug | 9 ++++
lib/Makefile | 2 +
lib/longest_symbol_kunit.c | 82 ++++++++++++++++++++++++++++++
4 files changed, 95 insertions(+), 1 deletion(-)
create mode 100644 lib/longest_symbol_kunit.c
diff --git a/arch/x86/tools/insn_decoder_test.c b/arch/x86/tools/insn_decoder_test.c
index 472540aeabc2..6c2986d2ad11 100644
--- a/arch/x86/tools/insn_decoder_test.c
+++ b/arch/x86/tools/insn_decoder_test.c
@@ -10,6 +10,7 @@
#include <assert.h>
#include <unistd.h>
#include <stdarg.h>
+#include <linux/kallsyms.h>
#define unlikely(cond) (cond)
@@ -106,7 +107,7 @@ static void parse_args(int argc, char **argv)
}
}
-#define BUFSIZE 256
+#define BUFSIZE (256 + KSYM_NAME_LEN)
int main(int argc, char **argv)
{
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index 1af972a92d06..62d43aa9e8f0 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -2838,6 +2838,15 @@ config FORTIFY_KUNIT_TEST
by the str*() and mem*() family of functions. For testing runtime
traps of FORTIFY_SOURCE, see LKDTM's "FORTIFY_*" tests.
+config LONGEST_SYM_KUNIT_TEST
+ tristate "Test the longest symbol possible" if !KUNIT_ALL_TESTS
+ depends on KUNIT && KPROBES
+ default KUNIT_ALL_TESTS
+ help
+ Tests the longest symbol possible
+
+ If unsure, say N.
+
config HW_BREAKPOINT_KUNIT_TEST
bool "Test hw_breakpoint constraints accounting" if !KUNIT_ALL_TESTS
depends on HAVE_HW_BREAKPOINT
diff --git a/lib/Makefile b/lib/Makefile
index d5cfc7afbbb8..e8fec9defec2 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -393,6 +393,8 @@ obj-$(CONFIG_FORTIFY_KUNIT_TEST) += fortify_kunit.o
obj-$(CONFIG_CRC_KUNIT_TEST) += crc_kunit.o
obj-$(CONFIG_SIPHASH_KUNIT_TEST) += siphash_kunit.o
obj-$(CONFIG_USERCOPY_KUNIT_TEST) += usercopy_kunit.o
+obj-$(CONFIG_LONGEST_SYM_KUNIT_TEST) += longest_symbol_kunit.o
+CFLAGS_longest_symbol_kunit.o += $(call cc-disable-warning, missing-prototypes)
obj-$(CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED) += devmem_is_allowed.o
diff --git a/lib/longest_symbol_kunit.c b/lib/longest_symbol_kunit.c
new file mode 100644
index 000000000000..e3c28ff1807f
--- /dev/null
+++ b/lib/longest_symbol_kunit.c
@@ -0,0 +1,82 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Test the longest symbol length. Execute with:
+ * ./tools/testing/kunit/kunit.py run longest-symbol
+ * --arch=x86_64 --kconfig_add CONFIG_KPROBES=y --kconfig_add CONFIG_MODULES=y
+ * --kconfig_add CONFIG_RETPOLINE=n --kconfig_add CONFIG_CFI_CLANG=n
+ * --kconfig_add CONFIG_MITIGATION_RETPOLINE=n
+ */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <kunit/test.h>
+#include <linux/stringify.h>
+#include <linux/kprobes.h>
+#include <linux/kallsyms.h>
+
+#define DI(name) s##name##name
+#define DDI(name) DI(n##name##name)
+#define DDDI(name) DDI(n##name##name)
+#define DDDDI(name) DDDI(n##name##name)
+#define DDDDDI(name) DDDDI(n##name##name)
+
+/*Generate a symbol whose name length is 511 */
+#define LONGEST_SYM_NAME DDDDDI(g1h2i3j4k5l6m7n)
+
+#define RETURN_LONGEST_SYM 0xAAAAA
+
+noinline int LONGEST_SYM_NAME(void);
+noinline int LONGEST_SYM_NAME(void)
+{
+ return RETURN_LONGEST_SYM;
+}
+
+_Static_assert(sizeof(__stringify(LONGEST_SYM_NAME)) == KSYM_NAME_LEN,
+"Incorrect symbol length found. Expected KSYM_NAME_LEN: "
+__stringify(KSYM_NAME_LEN) ", but found: "
+__stringify(sizeof(LONGEST_SYM_NAME)));
+
+static void test_longest_symbol(struct kunit *test)
+{
+ KUNIT_EXPECT_EQ(test, RETURN_LONGEST_SYM, LONGEST_SYM_NAME());
+};
+
+static void test_longest_symbol_kallsyms(struct kunit *test)
+{
+ unsigned long (*kallsyms_lookup_name)(const char *name);
+ static int (*longest_sym)(void);
+
+ struct kprobe kp = {
+ .symbol_name = "kallsyms_lookup_name",
+ };
+
+ if (register_kprobe(&kp) < 0) {
+ pr_info("%s: kprobe not registered", __func__);
+ KUNIT_FAIL(test, "test_longest_symbol kallsyms: kprobe not registered\n");
+ return;
+ }
+
+ kunit_warn(test, "test_longest_symbol kallsyms: kprobe registered\n");
+ kallsyms_lookup_name = (unsigned long (*)(const char *name))kp.addr;
+ unregister_kprobe(&kp);
+
+ longest_sym =
+ (void *) kallsyms_lookup_name(__stringify(LONGEST_SYM_NAME));
+ KUNIT_EXPECT_EQ(test, RETURN_LONGEST_SYM, longest_sym());
+};
+
+static struct kunit_case longest_symbol_test_cases[] = {
+ KUNIT_CASE(test_longest_symbol),
+ KUNIT_CASE(test_longest_symbol_kallsyms),
+ {}
+};
+
+static struct kunit_suite longest_symbol_test_suite = {
+ .name = "longest-symbol",
+ .test_cases = longest_symbol_test_cases,
+};
+kunit_test_suite(longest_symbol_test_suite);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Test the longest symbol length");
+MODULE_AUTHOR("Sergio González Collado");
base-commit: 7eb172143d5508b4da468ed59ee857c6e5e01da6
--
2.39.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v9] Kunit to check the longest symbol length
2025-03-02 22:15 [PATCH v9] Kunit to check the longest symbol length Sergio González Collado
@ 2025-03-05 23:17 ` Rae Moar
2025-03-14 5:44 ` David Gow
2025-05-26 18:27 ` Miguel Ojeda
2 siblings, 0 replies; 5+ messages in thread
From: Rae Moar @ 2025-03-05 23:17 UTC (permalink / raw)
To: Sergio González Collado
Cc: David Gow, linux-kselftest, kunit-dev, Miguel Ojeda, Alex Gaynor,
Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin,
Andreas Hindborg, Alice Ryhl, David Rheinsberg, rust-for-linux,
x86, Martin Rodriguez Reboredo, Shuah Khan
On Sun, Mar 2, 2025 at 5:15 PM Sergio González Collado
<sergio.collado@gmail.com> wrote:
>
> The longest length of a symbol (KSYM_NAME_LEN) was increased to 512
> in the reference [1]. This patch adds kunit test suite to check the longest
> symbol length. These tests verify that the longest symbol length defined
> is supported.
>
Hello!
Thanks for all the updates! This is now applying cleanly for me and it
looks good to me.
Reviewed-by: Rae Moar <rmoar@google.com>
Thanks!
-Rae
> This test can also help other efforts for longer symbol length,
> like [2].
>
> The test suite defines one symbol with the longest possible length.
>
> The first test verify that functions with names of the created
> symbol, can be called or not.
>
> The second test, verify that the symbols are created (or
> not) in the kernel symbol table.
>
> [1] https://lore.kernel.org/lkml/20220802015052.10452-6-ojeda@kernel.org/
> [2] https://lore.kernel.org/lkml/20240605032120.3179157-1-song@kernel.org/
>
> Tested-by: Martin Rodriguez Reboredo <yakoyoku@gmail.com>
> Reviewed-by: Shuah Khan <skhan@linuxfoundation.org>
> Reviewed-by: Rae Moar <rmoar@google.com>
> Signed-off-by: Sergio González Collado <sergio.collado@gmail.com>
> Link: https://github.com/Rust-for-Linux/linux/issues/504
> ---
> V8 -> V9: removed unused macro & corrected error message
> ---
> V7 -> V8: typo fixed & rebased
> ---
> V6 -> V7: rebased
> ---
> V5 -> V6: remove tests with symbols of length KSYM_NAME_LEN+1
> ---
> V4 -> V5: fixed typo, added improved description
> ---
> V3 -> V4: add x86 mantainers, add new reference.
> ---
> V2 -> V3: updated base and added MODULE_DESCRIPTION() and MODULE_AUTHOR()
> ---
> V1 -> V2: corrected CI tests. Added fix proposed at [3]
>
> [3] https://lore.kernel.org/lkml/Y9ES4UKl%2F+DtvAVS@gmail.com/T/#m3ef0e12bb834d01ed1ebdcae12ef5f2add342077
>
> The test execution should result in something like:
> ```
> [20:04:35] =============== longest-symbol (4 subtests) ================
> [20:04:35] [PASSED] test_longest_symbol
> [20:04:35] [PASSED] test_longest_symbol_kallsyms
> [20:04:35] ================= [PASSED] longest-symbol ==================
> [20:04:35] ============================================================
> [20:04:35] Testing complete. Ran 4 tests: passed: 4
> ```
> ---
> arch/x86/tools/insn_decoder_test.c | 3 +-
> lib/Kconfig.debug | 9 ++++
> lib/Makefile | 2 +
> lib/longest_symbol_kunit.c | 82 ++++++++++++++++++++++++++++++
> 4 files changed, 95 insertions(+), 1 deletion(-)
> create mode 100644 lib/longest_symbol_kunit.c
>
> diff --git a/arch/x86/tools/insn_decoder_test.c b/arch/x86/tools/insn_decoder_test.c
> index 472540aeabc2..6c2986d2ad11 100644
> --- a/arch/x86/tools/insn_decoder_test.c
> +++ b/arch/x86/tools/insn_decoder_test.c
> @@ -10,6 +10,7 @@
> #include <assert.h>
> #include <unistd.h>
> #include <stdarg.h>
> +#include <linux/kallsyms.h>
>
> #define unlikely(cond) (cond)
>
> @@ -106,7 +107,7 @@ static void parse_args(int argc, char **argv)
> }
> }
>
> -#define BUFSIZE 256
> +#define BUFSIZE (256 + KSYM_NAME_LEN)
>
> int main(int argc, char **argv)
> {
> diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
> index 1af972a92d06..62d43aa9e8f0 100644
> --- a/lib/Kconfig.debug
> +++ b/lib/Kconfig.debug
> @@ -2838,6 +2838,15 @@ config FORTIFY_KUNIT_TEST
> by the str*() and mem*() family of functions. For testing runtime
> traps of FORTIFY_SOURCE, see LKDTM's "FORTIFY_*" tests.
>
> +config LONGEST_SYM_KUNIT_TEST
> + tristate "Test the longest symbol possible" if !KUNIT_ALL_TESTS
> + depends on KUNIT && KPROBES
> + default KUNIT_ALL_TESTS
> + help
> + Tests the longest symbol possible
> +
> + If unsure, say N.
> +
> config HW_BREAKPOINT_KUNIT_TEST
> bool "Test hw_breakpoint constraints accounting" if !KUNIT_ALL_TESTS
> depends on HAVE_HW_BREAKPOINT
> diff --git a/lib/Makefile b/lib/Makefile
> index d5cfc7afbbb8..e8fec9defec2 100644
> --- a/lib/Makefile
> +++ b/lib/Makefile
> @@ -393,6 +393,8 @@ obj-$(CONFIG_FORTIFY_KUNIT_TEST) += fortify_kunit.o
> obj-$(CONFIG_CRC_KUNIT_TEST) += crc_kunit.o
> obj-$(CONFIG_SIPHASH_KUNIT_TEST) += siphash_kunit.o
> obj-$(CONFIG_USERCOPY_KUNIT_TEST) += usercopy_kunit.o
> +obj-$(CONFIG_LONGEST_SYM_KUNIT_TEST) += longest_symbol_kunit.o
> +CFLAGS_longest_symbol_kunit.o += $(call cc-disable-warning, missing-prototypes)
>
> obj-$(CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED) += devmem_is_allowed.o
>
> diff --git a/lib/longest_symbol_kunit.c b/lib/longest_symbol_kunit.c
> new file mode 100644
> index 000000000000..e3c28ff1807f
> --- /dev/null
> +++ b/lib/longest_symbol_kunit.c
> @@ -0,0 +1,82 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Test the longest symbol length. Execute with:
> + * ./tools/testing/kunit/kunit.py run longest-symbol
> + * --arch=x86_64 --kconfig_add CONFIG_KPROBES=y --kconfig_add CONFIG_MODULES=y
> + * --kconfig_add CONFIG_RETPOLINE=n --kconfig_add CONFIG_CFI_CLANG=n
> + * --kconfig_add CONFIG_MITIGATION_RETPOLINE=n
> + */
> +
> +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
> +
> +#include <kunit/test.h>
> +#include <linux/stringify.h>
> +#include <linux/kprobes.h>
> +#include <linux/kallsyms.h>
> +
> +#define DI(name) s##name##name
> +#define DDI(name) DI(n##name##name)
> +#define DDDI(name) DDI(n##name##name)
> +#define DDDDI(name) DDDI(n##name##name)
> +#define DDDDDI(name) DDDDI(n##name##name)
> +
> +/*Generate a symbol whose name length is 511 */
> +#define LONGEST_SYM_NAME DDDDDI(g1h2i3j4k5l6m7n)
> +
> +#define RETURN_LONGEST_SYM 0xAAAAA
> +
> +noinline int LONGEST_SYM_NAME(void);
> +noinline int LONGEST_SYM_NAME(void)
> +{
> + return RETURN_LONGEST_SYM;
> +}
> +
> +_Static_assert(sizeof(__stringify(LONGEST_SYM_NAME)) == KSYM_NAME_LEN,
> +"Incorrect symbol length found. Expected KSYM_NAME_LEN: "
> +__stringify(KSYM_NAME_LEN) ", but found: "
> +__stringify(sizeof(LONGEST_SYM_NAME)));
> +
> +static void test_longest_symbol(struct kunit *test)
> +{
> + KUNIT_EXPECT_EQ(test, RETURN_LONGEST_SYM, LONGEST_SYM_NAME());
> +};
> +
> +static void test_longest_symbol_kallsyms(struct kunit *test)
> +{
> + unsigned long (*kallsyms_lookup_name)(const char *name);
> + static int (*longest_sym)(void);
> +
> + struct kprobe kp = {
> + .symbol_name = "kallsyms_lookup_name",
> + };
> +
> + if (register_kprobe(&kp) < 0) {
> + pr_info("%s: kprobe not registered", __func__);
> + KUNIT_FAIL(test, "test_longest_symbol kallsyms: kprobe not registered\n");
> + return;
> + }
> +
> + kunit_warn(test, "test_longest_symbol kallsyms: kprobe registered\n");
> + kallsyms_lookup_name = (unsigned long (*)(const char *name))kp.addr;
> + unregister_kprobe(&kp);
> +
> + longest_sym =
> + (void *) kallsyms_lookup_name(__stringify(LONGEST_SYM_NAME));
> + KUNIT_EXPECT_EQ(test, RETURN_LONGEST_SYM, longest_sym());
> +};
> +
> +static struct kunit_case longest_symbol_test_cases[] = {
> + KUNIT_CASE(test_longest_symbol),
> + KUNIT_CASE(test_longest_symbol_kallsyms),
> + {}
> +};
> +
> +static struct kunit_suite longest_symbol_test_suite = {
> + .name = "longest-symbol",
> + .test_cases = longest_symbol_test_cases,
> +};
> +kunit_test_suite(longest_symbol_test_suite);
> +
> +MODULE_LICENSE("GPL");
> +MODULE_DESCRIPTION("Test the longest symbol length");
> +MODULE_AUTHOR("Sergio González Collado");
>
> base-commit: 7eb172143d5508b4da468ed59ee857c6e5e01da6
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v9] Kunit to check the longest symbol length
2025-03-02 22:15 [PATCH v9] Kunit to check the longest symbol length Sergio González Collado
2025-03-05 23:17 ` Rae Moar
@ 2025-03-14 5:44 ` David Gow
2025-05-26 18:27 ` Miguel Ojeda
2 siblings, 0 replies; 5+ messages in thread
From: David Gow @ 2025-03-14 5:44 UTC (permalink / raw)
To: Sergio González Collado
Cc: Rae Moar, linux-kselftest, kunit-dev, Miguel Ojeda, Alex Gaynor,
Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin,
Andreas Hindborg, Alice Ryhl, David Rheinsberg, rust-for-linux,
x86, Martin Rodriguez Reboredo, Shuah Khan
[-- Attachment #1: Type: text/plain, Size: 8028 bytes --]
On Mon, 3 Mar 2025 at 06:15, Sergio González Collado
<sergio.collado@gmail.com> wrote:
>
> The longest length of a symbol (KSYM_NAME_LEN) was increased to 512
> in the reference [1]. This patch adds kunit test suite to check the longest
> symbol length. These tests verify that the longest symbol length defined
> is supported.
>
> This test can also help other efforts for longer symbol length,
> like [2].
>
> The test suite defines one symbol with the longest possible length.
>
> The first test verify that functions with names of the created
> symbol, can be called or not.
>
> The second test, verify that the symbols are created (or
> not) in the kernel symbol table.
>
> [1] https://lore.kernel.org/lkml/20220802015052.10452-6-ojeda@kernel.org/
> [2] https://lore.kernel.org/lkml/20240605032120.3179157-1-song@kernel.org/
>
> Tested-by: Martin Rodriguez Reboredo <yakoyoku@gmail.com>
> Reviewed-by: Shuah Khan <skhan@linuxfoundation.org>
> Reviewed-by: Rae Moar <rmoar@google.com>
> Signed-off-by: Sergio González Collado <sergio.collado@gmail.com>
> Link: https://github.com/Rust-for-Linux/linux/issues/504
> ---
Acked-by: David Gow <davidgow@google.com>
I suspect that this might end up finding issues with some tools, so
I'd not be surprised if it breaks something, but given the whole point
is to uncover issues, we should accept it and find out. :-)
Thanks for putting so much time into this -- sorry it ended up taking so long.
-- David
> V8 -> V9: removed unused macro & corrected error message
> ---
> V7 -> V8: typo fixed & rebased
> ---
> V6 -> V7: rebased
> ---
> V5 -> V6: remove tests with symbols of length KSYM_NAME_LEN+1
> ---
> V4 -> V5: fixed typo, added improved description
> ---
> V3 -> V4: add x86 mantainers, add new reference.
> ---
> V2 -> V3: updated base and added MODULE_DESCRIPTION() and MODULE_AUTHOR()
> ---
> V1 -> V2: corrected CI tests. Added fix proposed at [3]
>
> [3] https://lore.kernel.org/lkml/Y9ES4UKl%2F+DtvAVS@gmail.com/T/#m3ef0e12bb834d01ed1ebdcae12ef5f2add342077
>
> The test execution should result in something like:
> ```
> [20:04:35] =============== longest-symbol (4 subtests) ================
> [20:04:35] [PASSED] test_longest_symbol
> [20:04:35] [PASSED] test_longest_symbol_kallsyms
> [20:04:35] ================= [PASSED] longest-symbol ==================
> [20:04:35] ============================================================
> [20:04:35] Testing complete. Ran 4 tests: passed: 4
> ```
> ---
> arch/x86/tools/insn_decoder_test.c | 3 +-
> lib/Kconfig.debug | 9 ++++
> lib/Makefile | 2 +
> lib/longest_symbol_kunit.c | 82 ++++++++++++++++++++++++++++++
> 4 files changed, 95 insertions(+), 1 deletion(-)
> create mode 100644 lib/longest_symbol_kunit.c
>
> diff --git a/arch/x86/tools/insn_decoder_test.c b/arch/x86/tools/insn_decoder_test.c
> index 472540aeabc2..6c2986d2ad11 100644
> --- a/arch/x86/tools/insn_decoder_test.c
> +++ b/arch/x86/tools/insn_decoder_test.c
> @@ -10,6 +10,7 @@
> #include <assert.h>
> #include <unistd.h>
> #include <stdarg.h>
> +#include <linux/kallsyms.h>
>
> #define unlikely(cond) (cond)
>
> @@ -106,7 +107,7 @@ static void parse_args(int argc, char **argv)
> }
> }
>
> -#define BUFSIZE 256
> +#define BUFSIZE (256 + KSYM_NAME_LEN)
>
> int main(int argc, char **argv)
> {
> diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
> index 1af972a92d06..62d43aa9e8f0 100644
> --- a/lib/Kconfig.debug
> +++ b/lib/Kconfig.debug
> @@ -2838,6 +2838,15 @@ config FORTIFY_KUNIT_TEST
> by the str*() and mem*() family of functions. For testing runtime
> traps of FORTIFY_SOURCE, see LKDTM's "FORTIFY_*" tests.
>
> +config LONGEST_SYM_KUNIT_TEST
> + tristate "Test the longest symbol possible" if !KUNIT_ALL_TESTS
> + depends on KUNIT && KPROBES
> + default KUNIT_ALL_TESTS
> + help
> + Tests the longest symbol possible
> +
> + If unsure, say N.
> +
> config HW_BREAKPOINT_KUNIT_TEST
> bool "Test hw_breakpoint constraints accounting" if !KUNIT_ALL_TESTS
> depends on HAVE_HW_BREAKPOINT
> diff --git a/lib/Makefile b/lib/Makefile
> index d5cfc7afbbb8..e8fec9defec2 100644
> --- a/lib/Makefile
> +++ b/lib/Makefile
> @@ -393,6 +393,8 @@ obj-$(CONFIG_FORTIFY_KUNIT_TEST) += fortify_kunit.o
> obj-$(CONFIG_CRC_KUNIT_TEST) += crc_kunit.o
> obj-$(CONFIG_SIPHASH_KUNIT_TEST) += siphash_kunit.o
> obj-$(CONFIG_USERCOPY_KUNIT_TEST) += usercopy_kunit.o
> +obj-$(CONFIG_LONGEST_SYM_KUNIT_TEST) += longest_symbol_kunit.o
> +CFLAGS_longest_symbol_kunit.o += $(call cc-disable-warning, missing-prototypes)
>
> obj-$(CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED) += devmem_is_allowed.o
>
> diff --git a/lib/longest_symbol_kunit.c b/lib/longest_symbol_kunit.c
> new file mode 100644
> index 000000000000..e3c28ff1807f
> --- /dev/null
> +++ b/lib/longest_symbol_kunit.c
> @@ -0,0 +1,82 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Test the longest symbol length. Execute with:
> + * ./tools/testing/kunit/kunit.py run longest-symbol
> + * --arch=x86_64 --kconfig_add CONFIG_KPROBES=y --kconfig_add CONFIG_MODULES=y
> + * --kconfig_add CONFIG_RETPOLINE=n --kconfig_add CONFIG_CFI_CLANG=n
> + * --kconfig_add CONFIG_MITIGATION_RETPOLINE=n
> + */
> +
> +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
> +
> +#include <kunit/test.h>
> +#include <linux/stringify.h>
> +#include <linux/kprobes.h>
> +#include <linux/kallsyms.h>
> +
> +#define DI(name) s##name##name
> +#define DDI(name) DI(n##name##name)
> +#define DDDI(name) DDI(n##name##name)
> +#define DDDDI(name) DDDI(n##name##name)
> +#define DDDDDI(name) DDDDI(n##name##name)
> +
> +/*Generate a symbol whose name length is 511 */
> +#define LONGEST_SYM_NAME DDDDDI(g1h2i3j4k5l6m7n)
> +
> +#define RETURN_LONGEST_SYM 0xAAAAA
> +
> +noinline int LONGEST_SYM_NAME(void);
> +noinline int LONGEST_SYM_NAME(void)
> +{
> + return RETURN_LONGEST_SYM;
> +}
> +
> +_Static_assert(sizeof(__stringify(LONGEST_SYM_NAME)) == KSYM_NAME_LEN,
> +"Incorrect symbol length found. Expected KSYM_NAME_LEN: "
> +__stringify(KSYM_NAME_LEN) ", but found: "
> +__stringify(sizeof(LONGEST_SYM_NAME)));
> +
> +static void test_longest_symbol(struct kunit *test)
> +{
> + KUNIT_EXPECT_EQ(test, RETURN_LONGEST_SYM, LONGEST_SYM_NAME());
> +};
> +
> +static void test_longest_symbol_kallsyms(struct kunit *test)
> +{
> + unsigned long (*kallsyms_lookup_name)(const char *name);
> + static int (*longest_sym)(void);
> +
> + struct kprobe kp = {
> + .symbol_name = "kallsyms_lookup_name",
> + };
> +
> + if (register_kprobe(&kp) < 0) {
> + pr_info("%s: kprobe not registered", __func__);
> + KUNIT_FAIL(test, "test_longest_symbol kallsyms: kprobe not registered\n");
> + return;
> + }
> +
> + kunit_warn(test, "test_longest_symbol kallsyms: kprobe registered\n");
> + kallsyms_lookup_name = (unsigned long (*)(const char *name))kp.addr;
> + unregister_kprobe(&kp);
> +
> + longest_sym =
> + (void *) kallsyms_lookup_name(__stringify(LONGEST_SYM_NAME));
> + KUNIT_EXPECT_EQ(test, RETURN_LONGEST_SYM, longest_sym());
> +};
> +
> +static struct kunit_case longest_symbol_test_cases[] = {
> + KUNIT_CASE(test_longest_symbol),
> + KUNIT_CASE(test_longest_symbol_kallsyms),
> + {}
> +};
> +
> +static struct kunit_suite longest_symbol_test_suite = {
> + .name = "longest-symbol",
> + .test_cases = longest_symbol_test_cases,
> +};
> +kunit_test_suite(longest_symbol_test_suite);
> +
> +MODULE_LICENSE("GPL");
> +MODULE_DESCRIPTION("Test the longest symbol length");
> +MODULE_AUTHOR("Sergio González Collado");
>
> base-commit: 7eb172143d5508b4da468ed59ee857c6e5e01da6
> --
> 2.39.2
>
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 5281 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v9] Kunit to check the longest symbol length
2025-03-02 22:15 [PATCH v9] Kunit to check the longest symbol length Sergio González Collado
2025-03-05 23:17 ` Rae Moar
2025-03-14 5:44 ` David Gow
@ 2025-05-26 18:27 ` Miguel Ojeda
2025-05-26 18:49 ` Miguel Ojeda
2 siblings, 1 reply; 5+ messages in thread
From: Miguel Ojeda @ 2025-05-26 18:27 UTC (permalink / raw)
To: Sergio González Collado
Cc: David Gow, Rae Moar, linux-kselftest, kunit-dev, Miguel Ojeda,
Alex Gaynor, Boqun Feng, Gary Guo, Björn Roy Baron,
Benno Lossin, Andreas Hindborg, Alice Ryhl, David Rheinsberg,
rust-for-linux, x86, Martin Rodriguez Reboredo, Shuah Khan
On Sun, Mar 2, 2025 at 11:15 PM Sergio González Collado
<sergio.collado@gmail.com> wrote:
>
> arch/x86/tools/insn_decoder_test.c | 3 +-
Should at least this part of the patch be backported to the LTSs?
Thanks!
Cheers,
Miguel
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v9] Kunit to check the longest symbol length
2025-05-26 18:27 ` Miguel Ojeda
@ 2025-05-26 18:49 ` Miguel Ojeda
0 siblings, 0 replies; 5+ messages in thread
From: Miguel Ojeda @ 2025-05-26 18:49 UTC (permalink / raw)
To: Sergio González Collado
Cc: David Gow, Rae Moar, linux-kselftest, kunit-dev, Miguel Ojeda,
Alex Gaynor, Boqun Feng, Gary Guo, Björn Roy Baron,
Benno Lossin, Andreas Hindborg, Alice Ryhl, David Rheinsberg,
rust-for-linux, x86, Martin Rodriguez Reboredo, Shuah Khan
On Mon, May 26, 2025 at 8:27 PM Miguel Ojeda
<miguel.ojeda.sandonis@gmail.com> wrote:
>
> Should at least this part of the patch be backported to the LTSs?
For future reference/context, we had another report at:
https://github.com/Rust-for-Linux/linux/issues/1134.
Cheers,
Miguel
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-05-26 18:49 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-02 22:15 [PATCH v9] Kunit to check the longest symbol length Sergio González Collado
2025-03-05 23:17 ` Rae Moar
2025-03-14 5:44 ` David Gow
2025-05-26 18:27 ` Miguel Ojeda
2025-05-26 18:49 ` Miguel Ojeda
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).