[LTP PATCH v3 2/5] ftrace: Convert ftrace_regression01.sh to C
Praveen K Pandey <[email protected]>
| Newsgroups | gmane.linux.ltp |
|---|---|
| Message-ID | <[email protected]> |
Convert ftrace_regression01.sh to C implementation using LTP new API. This test validates that function tracing works correctly by: - Enabling function tracing - Verifying trace output contains function calls - Checking for kernel crashes or hangs The test requires root to access and configure the ftrace subsystem via debugfs. Signed-off-by: Praveen K Pandey <[email protected]> --- .../tracing/ftrace_test/ftrace_regression01.c | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 testcases/kernel/tracing/ftrace_test/ftrace_regression01.c diff --git a/testcases/kernel/tracing/ftrace_test/ftrace_regression01.c b/testcases/kernel/tracing/ftrace_test/ftrace_regression01.c new file mode 100644 index 000000000..2f502569d --- /dev/null +++ b/testcases/kernel/tracing/ftrace_test/ftrace_regression01.c @@ -0,0 +1,127 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2015 Red Hat Inc. + * Copyright (c) 2024 Linux Test Project + * Copyright (c) IBM, 2026 + * + * Author: Li Wang <[email protected]> + * Converted to C by: Praveen K Pandey <[email protected]> + */ + +/*\ + * Test for kernel panic while using userstacktrace. + * + * This is a regression test for a kernel bug where enabling userstacktrace + * along with page fault events could cause a kernel panic: + * + * - BUG: unable to handle kernel paging request + * - Thread overran stack, or stack corrupted + * + * The bug was fixed by commit 1dbd195 (tracing: Fix preempt count leak) + * + * Requires root to access and configure the ftrace subsystem via debugfs. + * + * [Algorithm] + * + * - Enable stack tracer + * - Enable userstacktrace option + * - Enable page fault events (either exceptions:page_fault_kernel or + * kmem:mm_kernel_pagefault depending on kernel version) + * - Repeat multiple times to trigger the issue + * - System should not panic + */ + +#include "tst_test.h" +#include "ftrace_lib.h" + +#define LOOP_COUNT 10 + +static void run_test(void) +{ + int i; + char *exc_page_fault_enable = NULL; + char *mm_page_fault_enable = NULL; + int use_exc_event = 0; + + /* Check if stack tracer is available */ + if (access("/proc/sys/kernel/stack_tracer_enabled", F_OK) != 0) + tst_brk(TCONF, "Stack tracer is not configured in this kernel"); + + /* Determine which page fault event is available */ + if (ftrace_file_exists("events/exceptions/page_fault_kernel/enable")) { + use_exc_event = 1; + exc_page_fault_enable = ftrace_read_file("events/exceptions/page_fault_kernel/enable"); + } else if (ftrace_file_exists("events/kmem/mm_kernel_pagefault/enable")) { + use_exc_event = 0; + mm_page_fault_enable = ftrace_read_file("events/kmem/mm_kernel_pagefault/enable"); + } else { + tst_brk(TCONF, "Neither page_fault_kernel nor mm_kernel_pagefault event is available"); + } + + /* Run the test loop */ + for (i = 0; i < LOOP_COUNT; i++) { + char *options; + + /* Enable stack tracer */ + SAFE_FILE_PRINTF("/proc/sys/kernel/stack_tracer_enabled", "1"); + + /* Enable userstacktrace option */ + if (ftrace_write_file("trace_options", "userstacktrace\n") != 0) + tst_brk(TBROK, "Failed to set userstacktrace option"); + + /* Verify userstacktrace is enabled */ + options = ftrace_read_file("trace_options"); + if (!options || !strstr(options, "userstacktrace")) { + free(options); + tst_brk(TBROK, "Failed to enable userstacktrace"); + } + free(options); + + /* Enable page fault event */ + if (use_exc_event) { + if (ftrace_write_file("events/exceptions/page_fault_kernel/enable", "1\n") != 0) + tst_res(TINFO, "Failed to enable page_fault_kernel event"); + } else { + if (ftrace_write_file("events/kmem/mm_kernel_pagefault/enable", "1\n") != 0) + tst_res(TINFO, "Failed to enable mm_kernel_pagefault event"); + } + + /* Wait for trace events to be written */ + char *trace_content = TST_RETRY_FUNC(ftrace_read_file("trace"), TST_RETVAL_NOTNULL); + free(trace_content); + } + + /* Restore page fault event state */ + if (use_exc_event && exc_page_fault_enable) { + ftrace_write_file("events/exceptions/page_fault_kernel/enable", exc_page_fault_enable); + free(exc_page_fault_enable); + } else if (!use_exc_event && mm_page_fault_enable) { + ftrace_write_file("events/kmem/mm_kernel_pagefault/enable", mm_page_fault_enable); + free(mm_page_fault_enable); + } + + tst_res(TPASS, "System did not panic with userstacktrace enabled"); +} + +static void setup(void) +{ + ftrace_initialize(); +} + +static void cleanup(void) +{ + ftrace_cleanup(); +} + +static struct tst_test test = { + .test_all = run_test, + .setup = setup, + .cleanup = cleanup, + .needs_root = 1, + .needs_tmpdir = 1, + .tags = (const struct tst_tag[]) { + {"linux-git", "1dbd195"}, + {} + } +}; + -- 2.50.1 -- Mailing list info: https://lists.linux.it/listinfo/ltp