[PATCH v6 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 using the new LTP test API. This test validates that the kernel does not panic when enabling userstacktrace with page fault events. This is a regression test for commit 1dbd195 (tracing: Fix preempt count leak). The bug caused kernel panics when enabling userstacktrace option together with page fault events. Key changes: - Uses new LTP C API (tst_test.h) - Leverages ftrace_lib for common operations - Proper error handling with LTP macros - Requires root privileges (.needs_root = 1) - Tests for kernel panic by enabling stack tracer, userstacktrace, and page fault events in a loop Signed-off-by: Praveen K Pandey <[email protected]> --- runtest/tracing | 6 +- .../tracing/ftrace_test/ftrace_regression01.c | 126 ++++++++++++++++++ .../ftrace_test/ftrace_regression01.sh | 83 ------------ 3 files changed, 129 insertions(+), 86 deletions(-) create mode 100644 testcases/kernel/tracing/ftrace_test/ftrace_regression01.c delete mode 100755 testcases/kernel/tracing/ftrace_test/ftrace_regression01.sh diff --git a/runtest/tracing b/runtest/tracing index 674e2ad97..4204c2dc4 100644 --- a/runtest/tracing +++ b/runtest/tracing @@ -1,7 +1,7 @@ #DESCRIPTION:Tracing testing -ftrace_regression01 ftrace_regression01.sh -ftrace_regression02 ftrace_regression02.sh -ftrace-stress-test ftrace_stress_test.sh 90 +ftrace_regression01 ftrace_regression01 +ftrace_regression02 ftrace_regression02 +ftrace-stress-test ftrace_stress_test dynamic_debug01 dynamic_debug01.sh fanotify25 fanotify25 pt_full_trace_basic pt_test 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..baa8d01aa --- /dev/null +++ b/testcases/kernel/tracing/ftrace_test/ftrace_regression01.c @@ -0,0 +1,126 @@ +// 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 with page fault events. + * + * This is a regression test for commit 1dbd195 (tracing: Fix preempt count leak). + * The bug caused kernel panics when enabling userstacktrace option together with + * page fault events: + * + * - BUG: unable to handle kernel paging request + * - Thread overran stack, or stack corrupted + * + * 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 the loop multiple times to trigger potential race conditions + * - Verify system remains stable without kernel 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"}, + {} + } +}; + diff --git a/testcases/kernel/tracing/ftrace_test/ftrace_regression01.sh b/testcases/kernel/tracing/ftrace_test/ftrace_regression01.sh deleted file mode 100755 index d6969cfc6..000000000 --- a/testcases/kernel/tracing/ftrace_test/ftrace_regression01.sh +++ /dev/null @@ -1,83 +0,0 @@ -#! /bin/sh - -########################################################################### -## ## -## Copyright (c) 2015, Red Hat Inc. ## -## ## -## This program is free software: you can redistribute it and/or modify ## -## it under the terms of the GNU General Public License as published by ## -## the Free Software Foundation, either version 3 of the License, or ## -## (at your option) any later version. ## -## ## -## This program is distributed in the hope that it will be useful, ## -## but WITHOUT ANY WARRANTY; without even the implied warranty of ## -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## -## GNU General Public License for more details. ## -## ## -## You should have received a copy of the GNU General Public License ## -## along with this program. If not, see <http://www.gnu.org/licenses/>. ## -## ## -## Author: Li Wang <[email protected]> ## -## ## -########################################################################### -## ## -## Summary: panic while using userstacktrace ## -## ## -## BUG: unable to handle kernel paging request at 00000000417683c0 ## -## IP: [<ffffffff8105c834>] update_curr+0x124/0x1e0 ## -## PGD 41a796067 PUD 0 ## -## Thread overran stack, or stack corrupted ## -## Oops: 0000 [#1] SMP ## -## last sysfs file: ../system/cpu/cpu15/cache/index2/shared_cpu_map ## -## ## -## The bug was fixed by: ## -## 1dbd195 (tracing: Fix preempt count leak) ## -## ## -########################################################################### - -export TCID="ftrace_regression01" -export TST_TOTAL=1 - -. ftrace_lib.sh - -LOOP=10 - -TSTACK_TRACE_PATH="/proc/sys/kernel/stack_tracer_enabled" -EXC_PAGE_FAULT_ENABLE="$TRACING_PATH/events/exceptions/page_fault_kernel/enable" -MM_PAGE_FAULT_ENABLE="$TRACING_PATH/events/kmem/mm_kernel_pagefault/enable" - -ftrace_userstacktrace_test() -{ - if [ ! -e "$TSTACK_TRACE_PATH" ]; then - tst_brkm TCONF "Stack Tracer is not cofigured in This kernel" - fi - - for i in $(seq $LOOP); do - echo 1 > $TSTACK_TRACE_PATH - echo userstacktrace > $TRACING_PATH/trace_options - grep -q "^userstacktrace" $TRACING_PATH/trace_options - if [ $? -ne 0 ]; then - tst_brkm TBROK "Failed to set userstacktrace" - fi - - if [ -f "$EXC_PAGE_FAULT_ENABLE" ]; then - exc_page_fault_enable=`cat $EXC_PAGE_FAULT_ENABLE` - echo 1 > $EXC_PAGE_FAULT_ENABLE - else - mm_page_fault_enable=`cat $MM_PAGE_FAULT_ENABLE` - echo 1 > $MM_PAGE_FAULT_ENABLE - fi - done - - if [ -f "$EXC_PAGE_FAULT_ENABLE" ]; then - echo "$exc_page_fault_enable" > $EXC_PAGE_FAULT_ENABLE - else - echo "$mm_page_fault_enable" > $MM_PAGE_FAULT_ENABLE - fi - - tst_resm TPASS "Finished running the test" -} - -ftrace_userstacktrace_test - -tst_exit -- 2.50.1 -- Mailing list info: https://lists.linux.it/listinfo/ltp