From nobody Fri Oct 2 03:36:50 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B30FC3A5429; Thu, 6 Aug 2026 01:07:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785978427; cv=none; b=cQiZ9F4YnPMig7vq53nkxlw+/b9xcgF31o/5x+lMfpf9IfEoP2ZqYELIae2HIQI2yV+KNemxAlBbblEVvKPyHJF4HmRCAIwlrjtALYzP5XbToXdmxlxXUmiLeHjPqRSYWaRf8OMvCL+bWl2xTdlWbf/5zRP2sOS0xSkoHJCGmuE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785978427; c=relaxed/simple; bh=aWlPQzgF2eqH7UPINhTPXLY1l6uBW3E44x4GyVYsmFM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=mo+vAPMhPdSR4+G7okjyHrxZG4I72uWIExkeSWMadJrYArKpc+JYCOYyb3xTI9wMKl00VFgsvio+fdfg2Iqfj2P/aGtz/6EaHJoAWNd4oiXFmFwDMtcNIMcybv8jm0aZcP8o7aUMI7p7EqkIIvfuTh/hJaiJjkTAFnrVpbPdW4s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=LcgGIUCD; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="LcgGIUCD" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 632BF1F000E9; Thu, 6 Aug 2026 01:07:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785978425; bh=lyeQQY/9uxHSjcdz3qjuvR/fuu1OhucK52DTtzuVb90=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=LcgGIUCDew/CTcIoXKnL/3XgMfg2Wbr/PvIMV5DvhuVzAncXjh/Jmq3TYhi8PJhaH JjPU6/pDNebxJHEU8MOSoFzWqFpTN3PuI84hVnFjDTREGQw8pihfXVwKqZcyUlyr9h l+Hnoy4+bcLCmlSYmIeKsqTs+FbufTXB9+TJHx8rP7ceY2+aEAfnLvkz+FFAdZRm2i w6xMZQwRJRVsFUHawor8FOGnkbecjnVPPckovwcq05wu9n7Kzwsyt7Tw3V3ZzFZKbn 5j5i3VrOqnG3QrXYj1e2xCbl7xY/BlKKLdu+KO/5JrBvP2/bRpE1zdirAli0lJhP1i qNSrsX81sW76Q== From: "Masami Hiramatsu (Google)" To: Steven Rostedt , Masami Hiramatsu , Jonathan Corbet , Shuah Khan Cc: Mathieu Desnoyers , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: [PATCH 1/2] tracing/boot: Add support for eprobe, fprobe, and tprobe events Date: Thu, 6 Aug 2026 10:07:01 +0900 Message-ID: <178597842125.123558.2594525097237345437.stgit@devnote2> X-Mailer: git-send-email 2.43.0 In-Reply-To: <178597841107.123558.13065821394773752510.stgit@devnote2> References: <178597841107.123558.13065821394773752510.stgit@devnote2> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Masami Hiramatsu (Google) Boot-time tracing currently supports kprobe-events and synthetic-events under per-event configuration options. Extend boot-time tracing to support newly added dynamic probe types: - event probes (eprobe) under the "eprobes" event group - function probes (fprobe) under the "fprobes" event group - tracepoint probes (tprobe) under the "tracepoints" or "tprobes" event group To support this cleanly, update dyn_event_create() in trace_dynevent.c so that passing NULL as the type parameter delegates to create_dyn_event(), allowing generic creation of any registered dynamic event type from a raw command string. Update Documentation/trace/boottime-trace.rst accordingly to describe the new per-event bootconfig options. Assisted-by: Antigravity:gemini-3.6-flash Signed-off-by: Masami Hiramatsu (Google) --- Documentation/trace/boottime-trace.rst | 18 ++++- kernel/trace/trace_boot.c | 113 ++++++++++++++++++++++++++++= ++++ kernel/trace/trace_dynevent.c | 5 + 3 files changed, 133 insertions(+), 3 deletions(-) diff --git a/Documentation/trace/boottime-trace.rst b/Documentation/trace/b= oottime-trace.rst index 651f3a2c01de..2c3c1fedb92c 100644 --- a/Documentation/trace/boottime-trace.rst +++ b/Documentation/trace/boottime-trace.rst @@ -121,9 +121,21 @@ ftrace.[instance.INSTANCE.]event.synthetic.EVENT.field= s =3D FIELD[, FIELD2[...]] Defines new synthetic event with FIELDs. Each field should be "type varname". =20 -Note that kprobe and synthetic event definitions can be written under -instance node, but those are also visible from other instances. So please -take care for event name conflict. +ftrace.[instance.INSTANCE.]event.eprobes.EVENT.probes =3D PROBE[, PROBE2[.= ..]] + Defines new event probe based on PROBEs. This option is available only + for the event which group name is "eprobes". + +ftrace.[instance.INSTANCE.]event.fprobes.EVENT.probes =3D PROBE[, PROBE2[.= ..]] + Defines new fprobe event based on PROBEs. This option is available only + for the event which group name is "fprobes". + +ftrace.[instance.INSTANCE.]event.tracepoints.EVENT.probes =3D PROBE[, PROB= E2[...]] + Defines new tracepoint probe based on PROBEs. This option is available = only + for the event which group name is "tracepoints" or "tprobes". + +Note that dynamic event definitions can be written under instance node, but +those are also visible from other instances. So please take care for event +name conflict. =20 Ftrace Histogram Options ------------------------ diff --git a/kernel/trace/trace_boot.c b/kernel/trace/trace_boot.c index 2ca2541c8a58..6ecf1a035caa 100644 --- a/kernel/trace/trace_boot.c +++ b/kernel/trace/trace_boot.c @@ -18,6 +18,7 @@ #include =20 #include "trace.h" +#include "trace_dynevent.h" =20 #define MAX_BUF_LEN 256 =20 @@ -172,6 +173,109 @@ trace_boot_add_synth_event(struct xbc_node *node, con= st char *event) } #endif =20 +#ifdef CONFIG_EPROBE_EVENTS +static int __init +trace_boot_add_eprobe_event(struct xbc_node *node, const char *group, + const char *event) +{ + struct xbc_node *anode; + char buf[MAX_BUF_LEN]; + const char *val; + int ret =3D 0; + + xbc_node_for_each_array_value(node, "probes", anode, val) { + if (val[0] =3D=3D 'e' && (val[1] =3D=3D ':' || isdigit(val[1]))) + strscpy(buf, val, MAX_BUF_LEN); + else + snprintf(buf, MAX_BUF_LEN, "e:%s/%s %s", group, event, val); + + ret =3D dyn_event_create(buf, NULL); + if (ret) { + pr_err("Failed to add eprobe: %s\n", buf); + break; + } + } + + return ret; +} +#else +static inline int __init +trace_boot_add_eprobe_event(struct xbc_node *node, const char *group, + const char *event) +{ + pr_err("Event probe is not supported.\n"); + return -EOPNOTSUPP; +} +#endif + +#ifdef CONFIG_FPROBE_EVENTS +static int __init +trace_boot_add_fprobe_event(struct xbc_node *node, const char *group, + const char *event) +{ + struct xbc_node *anode; + char buf[MAX_BUF_LEN]; + const char *val; + int ret =3D 0; + + xbc_node_for_each_array_value(node, "probes", anode, val) { + if (val[0] =3D=3D 'f' && (val[1] =3D=3D ':' || isdigit(val[1]))) + strscpy(buf, val, MAX_BUF_LEN); + else + snprintf(buf, MAX_BUF_LEN, "f:%s/%s %s", group, event, val); + + ret =3D dyn_event_create(buf, NULL); + if (ret) { + pr_err("Failed to add fprobe: %s\n", buf); + break; + } + } + + return ret; +} + +static int __init +trace_boot_add_tprobe_event(struct xbc_node *node, const char *group, + const char *event) +{ + struct xbc_node *anode; + char buf[MAX_BUF_LEN]; + const char *val; + int ret =3D 0; + + xbc_node_for_each_array_value(node, "probes", anode, val) { + if (val[0] =3D=3D 't' && (val[1] =3D=3D ':' || isdigit(val[1]))) + strscpy(buf, val, MAX_BUF_LEN); + else + snprintf(buf, MAX_BUF_LEN, "t:%s/%s %s", group, event, val); + + ret =3D dyn_event_create(buf, NULL); + if (ret) { + pr_err("Failed to add tprobe: %s\n", buf); + break; + } + } + + return ret; +} +#else +static inline int __init +trace_boot_add_fprobe_event(struct xbc_node *node, const char *group, + const char *event) +{ + pr_err("Fprobe event is not supported.\n"); + return -EOPNOTSUPP; +} + +static inline int __init +trace_boot_add_tprobe_event(struct xbc_node *node, const char *group, + const char *event) +{ + pr_err("Tracepoint probe is not supported.\n"); + return -EOPNOTSUPP; +} +#endif + #ifdef CONFIG_HIST_TRIGGERS static int __init __printf(3, 4) append_printf(char **bufp, char *end, const char *fmt, ...) @@ -477,6 +581,15 @@ trace_boot_init_one_event(struct trace_array *tr, stru= ct xbc_node *gnode, if (!strcmp(group, "synthetic")) if (trace_boot_add_synth_event(enode, event) < 0) return; + if (!strcmp(group, "eprobes")) + if (trace_boot_add_eprobe_event(enode, group, event) < 0) + return; + if (!strcmp(group, "fprobes")) + if (trace_boot_add_fprobe_event(enode, group, event) < 0) + return; + if (!strcmp(group, "tracepoints") || !strcmp(group, "tprobes")) + if (trace_boot_add_tprobe_event(enode, group, event) < 0) + return; =20 mutex_lock(&event_mutex); file =3D find_event_file(tr, group, event); diff --git a/kernel/trace/trace_dynevent.c b/kernel/trace/trace_dynevent.c index c4dfbc293bae..6f2e39b797e5 100644 --- a/kernel/trace/trace_dynevent.c +++ b/kernel/trace/trace_dynevent.c @@ -116,6 +116,8 @@ int dyn_event_release(const char *raw_command, struct d= yn_event_operations *type return ret; } =20 +static int create_dyn_event(const char *raw_command); + /* * Locked version of event creation. The event creation must be protected = by * dyn_event_ops_mutex because of protecting trace_probe_log. @@ -124,6 +126,9 @@ int dyn_event_create(const char *raw_command, struct dy= n_event_operations *type) { int ret; =20 + if (!type) + return create_dyn_event(raw_command); + mutex_lock(&dyn_event_ops_mutex); ret =3D type->create(raw_command); mutex_unlock(&dyn_event_ops_mutex); From nobody Fri Oct 2 03:36:50 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 861613A1A3B; Thu, 6 Aug 2026 01:07:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785978437; cv=none; b=A7Bj8+dTiIrZtEGtB5iRQK9RHbt0pa2O51bhXaT80m7EV8FwqhuiW5EpzY3vrGYx46FFzCxVub18o+dnfLFk5rMChWsRMakkh0NIQ6exgHPzl66NdNZLXyx3An7nWBrvAk7SDR0F5N3G9fUwxbbw/DFqZvjPPiICorlyen5IBY0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785978437; c=relaxed/simple; bh=EcFHNNOCECfMjbLjSLKBDOpr7luif1xFAAh+Y2QtGVw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=iNjpv1RIdGzaS+Y2j0lmGYA2zjIETA59ee+HBQOjQLUXP0v8aSKG9GSw2kDJK+y8fQy3s23jr9l9wr5wpstUdGtZbm0DbFa6tFioXLp90OJ8a31IRAGC8PflskST6JMqbFdzMj9apI6F+ogasaXuz82MNqF/Daq4h4CzLBz7FKo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=MLWKnRV9; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="MLWKnRV9" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 13D691F000E9; Thu, 6 Aug 2026 01:07:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785978435; bh=egClkRG0rWBlFH/FWmWM7obY1gv6+ZKgafn3zgJGUPg=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=MLWKnRV9Imz4zG2C/08wKnmzmZ8uk7jUdIRbIMHpHDTtP8NlD6A1/NXrsQ8f1rSxm cD83R3T+7Lag0MCYTt5Npar8HUhld5aMoPYf4m5BDZw+tm6JKVa4BVoObh4tMn6jYC mE5KKUddqbJrtVp3GpSGCehrn2rtNDhRtnof7uP1qEtIg2vzZUY+71r5kVfjvUHMlL T8yGq4JlDRTCQCqZnxoEc21SYu4T0QIVCDZ5+g1ZJ0jyGZRF31UToE8qfw57O3s0pV 8CP72L8JhyG1QDjNszEfMFJbk2bAXVIDJIF2FjUMDoDKUN3IgDa1RKMQdUjw4CShu5 dVR9icGd2rLSQ== From: "Masami Hiramatsu (Google)" To: Steven Rostedt , Masami Hiramatsu , Jonathan Corbet , Shuah Khan Cc: Mathieu Desnoyers , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: [PATCH 2/2] selftests/ftrace: Add boot-time tracing test framework Date: Thu, 6 Aug 2026 10:07:10 +0900 Message-ID: <178597843076.123558.16725675716123941033.stgit@devnote2> X-Mailer: git-send-email 2.43.0 In-Reply-To: <178597841107.123558.13065821394773752510.stgit@devnote2> References: <178597841107.123558.13065821394773752510.stgit@devnote2> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Masami Hiramatsu (Google) Add an automated test framework under tools/testing/selftests/ftrace/boottime/ to verify boot-time tracing configuration parsing. The test runner (run_boottime_test.sh) sources ktap_helpers.sh to generate output in TAP version 13 format. It builds a minimal initramfs with busybox, attaches bootconfig examples using tools/bootconfig/bootconfig, boots QEMU, and runs corresponding tracefs checker scripts. Assisted-by: Antigravity:gemini-3.6-flash Signed-off-by: Masami Hiramatsu (Google) --- tools/testing/selftests/ftrace/Makefile | 2=20 tools/testing/selftests/ftrace/boottime/Makefile | 10 + tools/testing/selftests/ftrace/boottime/README | 58 +++++ .../ftrace/boottime/bootconfigs/01-kprobe.bconf | 5=20 .../ftrace/boottime/bootconfigs/02-synth.bconf | 4=20 .../ftrace/boottime/bootconfigs/03-eprobe.bconf | 4=20 .../ftrace/boottime/bootconfigs/04-fprobe.bconf | 4=20 .../ftrace/boottime/bootconfigs/05-tprobe.bconf | 4=20 .../ftrace/boottime/bootconfigs/06-instance.bconf | 5=20 .../selftests/ftrace/boottime/run_boottime_test.sh | 218 ++++++++++++++++= ++++ .../selftests/ftrace/boottime/tests/01-kprobe.sh | 18 ++ .../selftests/ftrace/boottime/tests/02-synth.sh | 18 ++ .../selftests/ftrace/boottime/tests/03-eprobe.sh | 18 ++ .../selftests/ftrace/boottime/tests/04-fprobe.sh | 18 ++ .../selftests/ftrace/boottime/tests/05-tprobe.sh | 18 ++ .../selftests/ftrace/boottime/tests/06-instance.sh | 23 ++ tools/testing/selftests/ftrace/config | 4=20 17 files changed, 430 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/ftrace/boottime/Makefile create mode 100644 tools/testing/selftests/ftrace/boottime/README create mode 100644 tools/testing/selftests/ftrace/boottime/bootconfigs/01-= kprobe.bconf create mode 100644 tools/testing/selftests/ftrace/boottime/bootconfigs/02-= synth.bconf create mode 100644 tools/testing/selftests/ftrace/boottime/bootconfigs/03-= eprobe.bconf create mode 100644 tools/testing/selftests/ftrace/boottime/bootconfigs/04-= fprobe.bconf create mode 100644 tools/testing/selftests/ftrace/boottime/bootconfigs/05-= tprobe.bconf create mode 100644 tools/testing/selftests/ftrace/boottime/bootconfigs/06-= instance.bconf create mode 100755 tools/testing/selftests/ftrace/boottime/run_boottime_te= st.sh create mode 100755 tools/testing/selftests/ftrace/boottime/tests/01-kprobe= .sh create mode 100755 tools/testing/selftests/ftrace/boottime/tests/02-synth.= sh create mode 100755 tools/testing/selftests/ftrace/boottime/tests/03-eprobe= .sh create mode 100755 tools/testing/selftests/ftrace/boottime/tests/04-fprobe= .sh create mode 100755 tools/testing/selftests/ftrace/boottime/tests/05-tprobe= .sh create mode 100755 tools/testing/selftests/ftrace/boottime/tests/06-instan= ce.sh diff --git a/tools/testing/selftests/ftrace/Makefile b/tools/testing/selfte= sts/ftrace/Makefile index 7c12263f8260..8d8881744149 100644 --- a/tools/testing/selftests/ftrace/Makefile +++ b/tools/testing/selftests/ftrace/Makefile @@ -3,7 +3,7 @@ all: =20 TEST_PROGS_EXTENDED :=3D ftracetest TEST_PROGS :=3D ftracetest-ktap -TEST_FILES :=3D test.d settings +TEST_FILES :=3D test.d settings boottime EXTRA_CLEAN :=3D $(OUTPUT)/logs/* =20 TEST_GEN_FILES :=3D poll diff --git a/tools/testing/selftests/ftrace/boottime/Makefile b/tools/testi= ng/selftests/ftrace/boottime/Makefile new file mode 100644 index 000000000000..fd0975350f10 --- /dev/null +++ b/tools/testing/selftests/ftrace/boottime/Makefile @@ -0,0 +1,10 @@ +# SPDX-License-Identifier: GPL-2.0 + +all: + +run_tests: + @./run_boottime_test.sh + +clean: + +.PHONY: all run_tests clean diff --git a/tools/testing/selftests/ftrace/boottime/README b/tools/testing= /selftests/ftrace/boottime/README new file mode 100644 index 000000000000..a6f930a6e44c --- /dev/null +++ b/tools/testing/selftests/ftrace/boottime/README @@ -0,0 +1,58 @@ +Boot-Time Tracing Test Suite +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D + +This directory contains an automated test framework to verify kernel boot-= time +tracing configuration parsing and tracefs application during early boot. + +Overview +-------- +The test runner (`run_boottime_test.sh`) constructs a lightweight initramf= s with +busybox and a tracefs checker script from `tests/`, attaches a bootconfig = example +from `bootconfigs/` using the `bootconfig` tool, boots the target kernel i= mage under +QEMU, and reports results according to the TAP version 13 format. + +Required Tools +-------------- +- Host Architecture: x86 (x86_64/i686/i386/x86; tests skip on non-x86 host= s) +- `qemu-system-x86_64` (or custom QEMU executable) +- `busybox` (host binary at `/usr/bin/busybox` or custom path) +- `bootconfig` (compiled from `tools/bootconfig/bootconfig` or in PATH) +- `cpio` (standard archiver) + +Required Kernel Configurations +------------------------------ +The kernel binary under test must be compiled with: +- `CONFIG_BOOT_CONFIG=3Dy` +- `CONFIG_BOOTTIME_TRACING=3Dy` + +Additional feature-specific config options enable respective testcases: +- `CONFIG_KPROBE_EVENTS=3Dy` (for `01-kprobe`) +- `CONFIG_SYNTH_EVENTS=3Dy` (for `02-synth`) +- `CONFIG_EPROBE_EVENTS=3Dy` (for `03-eprobe`) +- `CONFIG_FPROBE_EVENTS=3Dy` (for `04-fprobe` and `05-tprobe`) +- `CONFIG_FUNCTION_TRACER=3Dy` (for tracer options in `06-instance`) + +Usage +----- +To run all test cases with a compiled kernel image: + + $ ./run_boottime_test.sh -k /path/to/bzImage + +To run a specific test case (e.g. `01-kprobe`): + + $ ./run_boottime_test.sh -k /path/to/bzImage -t 01-kprobe + +Customizing Tool Paths: + + $ ./run_boottime_test.sh -b /path/to/bootconfig \ + -k /path/to/bzImage \ + -q /path/to/qemu-system-x86_64 \ + -B /path/to/busybox + +Environment Variables +--------------------- +Tool locations and kernel paths can also be set via environment variables: +- `BOOTCONFIG`: Path to the `bootconfig` tool +- `KERNEL`: Path to the `bzImage` kernel binary +- `QEMU`: Path to the QEMU binary +- `BUSYBOX`: Path to the `busybox` binary diff --git a/tools/testing/selftests/ftrace/boottime/bootconfigs/01-kprobe.= bconf b/tools/testing/selftests/ftrace/boottime/bootconfigs/01-kprobe.bconf new file mode 100644 index 000000000000..f607840e3858 --- /dev/null +++ b/tools/testing/selftests/ftrace/boottime/bootconfigs/01-kprobe.bconf @@ -0,0 +1,5 @@ +ftrace.event.kprobes.vfs_read { + probes =3D "vfs_read $arg1 $arg2" + filter =3D "common_pid < 200" + enable +} diff --git a/tools/testing/selftests/ftrace/boottime/bootconfigs/02-synth.b= conf b/tools/testing/selftests/ftrace/boottime/bootconfigs/02-synth.bconf new file mode 100644 index 000000000000..b1f37713f33c --- /dev/null +++ b/tools/testing/selftests/ftrace/boottime/bootconfigs/02-synth.bconf @@ -0,0 +1,4 @@ +ftrace.event.synthetic.boot_lat { + fields =3D "unsigned long id", "u64 delta" + enable +} diff --git a/tools/testing/selftests/ftrace/boottime/bootconfigs/03-eprobe.= bconf b/tools/testing/selftests/ftrace/boottime/bootconfigs/03-eprobe.bconf new file mode 100644 index 000000000000..f954aa7fb8bd --- /dev/null +++ b/tools/testing/selftests/ftrace/boottime/bootconfigs/03-eprobe.bconf @@ -0,0 +1,4 @@ +ftrace.event.eprobes.ep_read { + probes =3D "syscalls/sys_enter_openat" + enable +} diff --git a/tools/testing/selftests/ftrace/boottime/bootconfigs/04-fprobe.= bconf b/tools/testing/selftests/ftrace/boottime/bootconfigs/04-fprobe.bconf new file mode 100644 index 000000000000..82ae2ac0629f --- /dev/null +++ b/tools/testing/selftests/ftrace/boottime/bootconfigs/04-fprobe.bconf @@ -0,0 +1,4 @@ +ftrace.event.fprobes.fp_read { + probes =3D "vfs_read" + enable +} diff --git a/tools/testing/selftests/ftrace/boottime/bootconfigs/05-tprobe.= bconf b/tools/testing/selftests/ftrace/boottime/bootconfigs/05-tprobe.bconf new file mode 100644 index 000000000000..02a2803c770a --- /dev/null +++ b/tools/testing/selftests/ftrace/boottime/bootconfigs/05-tprobe.bconf @@ -0,0 +1,4 @@ +ftrace.event.tracepoints.tp_sched { + probes =3D "sched_switch" + enable +} diff --git a/tools/testing/selftests/ftrace/boottime/bootconfigs/06-instanc= e.bconf b/tools/testing/selftests/ftrace/boottime/bootconfigs/06-instance.b= conf new file mode 100644 index 000000000000..31f81da570ea --- /dev/null +++ b/tools/testing/selftests/ftrace/boottime/bootconfigs/06-instance.bconf @@ -0,0 +1,5 @@ +ftrace.instance.foo { + event.sched.sched_switch.enable + buffer_size =3D 1MB + tracing_on =3D 1 +} diff --git a/tools/testing/selftests/ftrace/boottime/run_boottime_test.sh b= /tools/testing/selftests/ftrace/boottime/run_boottime_test.sh new file mode 100755 index 000000000000..0bf95a47c5d6 --- /dev/null +++ b/tools/testing/selftests/ftrace/boottime/run_boottime_test.sh @@ -0,0 +1,218 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 +# +# Boot-time tracing test runner +# Builds a lightweight initramfs, attaches a bootconfig, boots QEMU, +# and verifies tracefs configuration using test scripts. + +set -e + +SCRIPT_DIR=3D"$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +KERNEL_SRC=3D"$(cd "$SCRIPT_DIR/../../../../.." && pwd)" + +# Source KTAP helpers +KSELFTEST_DIR=3D"$(cd "$SCRIPT_DIR/../../kselftest" && pwd)" +if [ -f "$KSELFTEST_DIR/ktap_helpers.sh" ]; then + . "$KSELFTEST_DIR/ktap_helpers.sh" +else + echo "Error: ktap_helpers.sh not found at $KSELFTEST_DIR" + exit 1 +fi + +BOOTCONFIG=3D"${BOOTCONFIG:-"$KERNEL_SRC/tools/bootconfig/bootconfig"}" +KERNEL=3D"${KERNEL:-"$KERNEL_SRC/arch/x86/boot/bzImage"}" +QEMU=3D"${QEMU:-"qemu-system-x86_64"}" +BUSYBOX=3D"${BUSYBOX:-"$(which busybox 2>/dev/null || echo "/usr/bin/busyb= ox")"}" +TARGET_TEST=3D"all" + +usage() { + echo "Usage: $0 [options]" + echo "Options:" + echo " -b, --bootconfig PATH Path to bootconfig tool (default: $BOOTCO= NFIG)" + echo " -k, --kernel PATH Path to kernel image (default: $KERNEL)" + echo " -q, --qemu PATH Path to QEMU executable (default: $QEMU)" + echo " -B, --busybox PATH Path to busybox binary (default: $BUSYBOX= )" + echo " -t, --test NAME Run specific test (e.g. 01-kprobe) or 'al= l'" + echo " -h, --help Show this help message" + exit 1 +} + +while [[ $# -gt 0 ]]; do + case "$1" in + -b|--bootconfig) + BOOTCONFIG=3D"$2" + shift 2 + ;; + -k|--kernel) + KERNEL=3D"$2" + shift 2 + ;; + -q|--qemu) + QEMU=3D"$2" + shift 2 + ;; + -B|--busybox) + BUSYBOX=3D"$2" + shift 2 + ;; + -t|--test) + TARGET_TEST=3D"$2" + shift 2 + ;; + -h|--help) + usage + ;; + *) + echo "Unknown option: $1" + usage + ;; + esac +done + +# Check host architecture +HOST_ARCH=3D"$(uname -m)" +case "$HOST_ARCH" in + x86_64|i686|i386|x86) + ;; + *) + ktap_print_header + ktap_skip_all \ + "Boot-time tracing tests currently support x86 host architecture only (= $HOST_ARCH)" + exit 0 + ;; +esac + +# Ensure bootconfig tool is built if Makefile exists +if [ ! -x "$BOOTCONFIG" ]; then + if [ -f "$KERNEL_SRC/tools/bootconfig/Makefile" ]; then + make -C "$KERNEL_SRC/tools/bootconfig" > /dev/null 2>&1 || true + fi + if [ ! -x "$BOOTCONFIG" ]; then + BOOTCONFIG=3D"$(which bootconfig 2>/dev/null || true)" + fi +fi + +if [ ! -x "$BOOTCONFIG" ]; then + ktap_print_header + ktap_skip_all "bootconfig tool not found at $BOOTCONFIG" + exit 0 +fi + +if [ ! -f "$KERNEL" ]; then + ktap_print_header + ktap_skip_all "Kernel image not found at $KERNEL" + exit 0 +fi + +if ! command -v "$QEMU" >/dev/null 2>&1; then + ktap_print_header + ktap_skip_all "QEMU binary not found: $QEMU" + exit 0 +fi + +if [ ! -x "$BUSYBOX" ]; then + ktap_print_header + ktap_skip_all "busybox binary not found at $BUSYBOX" + exit 0 +fi + +run_single_test() { + local bconf_file=3D"$1" + local test_script=3D"$2" + local name=3D"$(basename "$bconf_file" .bconf)" + + local workdir=3D"$(mktemp -d)" + trap 'rm -rf "$workdir"' EXIT + + local rootfs=3D"$workdir/rootfs" + mkdir -p "$rootfs"/{bin,sbin,etc,proc,sys,dev,tmp} + + cp "$BUSYBOX" "$rootfs/bin/busybox" + chmod +x "$rootfs/bin/busybox" + (cd "$rootfs/bin" && for applet in sh cat mount umount echo sync reboot \ + poweroff cpio grep; do ln -s busybox $applet; done) + + cat << 'EOF' > "$rootfs/init" +#!/bin/sh +mount -t proc proc /proc 2>/dev/null +mount -t sysfs sys /sys 2>/dev/null +mount -t tracefs nodev /sys/kernel/tracing 2>/dev/null + +/bin/check_test.sh +RET=3D$? + +if [ $RET -eq 0 ]; then + echo "TEST RESULT: PASS" +else + echo "TEST RESULT: FAIL" +fi + +sync +echo o > /proc/sysrq-trigger 2>/dev/null || reboot -f 2>/dev/null || power= off -f 2>/dev/null +EOF + chmod +x "$rootfs/init" + + cp "$test_script" "$rootfs/bin/check_test.sh" + chmod +x "$rootfs/bin/check_test.sh" + + local initramfs=3D"$workdir/initramfs.cpio" + (cd "$rootfs" && find . | cpio -o -H newc --quiet) > "$initramfs" + + # Attach bootconfig + "$BOOTCONFIG" -a "$bconf_file" "$initramfs" > /dev/null + + # Run QEMU + local logfile=3D"$workdir/qemu.log" + "$QEMU" -kernel "$KERNEL" \ + -initrd "$initramfs" \ + -append "bootconfig console=3DttyS0 quiet panic=3D-1" \ + -nographic \ + -no-reboot > "$logfile" 2>&1 || true + + if grep -q "TEST RESULT: PASS" "$logfile"; then + ktap_test_pass "$name" + rm -rf "$workdir" + trap - EXIT + return 0 + else + ktap_test_fail "$name" + ktap_print_msg "QEMU Console Output for $name:" + while IFS=3D read -r line; do + ktap_print_msg "$line" + done < "$logfile" + rm -rf "$workdir" + trap - EXIT + return 1 + fi +} + +TEST_FILES=3D("$SCRIPT_DIR/bootconfigs"/*.bconf) +TOTAL_TESTS=3D0 +for bconf in "${TEST_FILES[@]}"; do + name=3D"$(basename "$bconf" .bconf)" + if [ "$TARGET_TEST" !=3D "all" ] && [ "$TARGET_TEST" !=3D "$name" ]; then + continue + fi + TOTAL_TESTS=3D$((TOTAL_TESTS + 1)) +done + +ktap_print_header +ktap_set_plan "$TOTAL_TESTS" + +for bconf in "${TEST_FILES[@]}"; do + name=3D"$(basename "$bconf" .bconf)" + test_script=3D"$SCRIPT_DIR/tests/$name.sh" + + if [ "$TARGET_TEST" !=3D "all" ] && [ "$TARGET_TEST" !=3D "$name" ]; then + continue + fi + + if [ ! -f "$test_script" ]; then + ktap_test_skip "$name (test script missing)" + continue + fi + + run_single_test "$bconf" "$test_script" || true +done + +ktap_finished diff --git a/tools/testing/selftests/ftrace/boottime/tests/01-kprobe.sh b/t= ools/testing/selftests/ftrace/boottime/tests/01-kprobe.sh new file mode 100755 index 000000000000..a20e7e82d158 --- /dev/null +++ b/tools/testing/selftests/ftrace/boottime/tests/01-kprobe.sh @@ -0,0 +1,18 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# Check kprobe bootconfig settings on tracefs +TRACEDIR=3D"/sys/kernel/tracing" + +if [ ! -d "$TRACEDIR/events/kprobes/vfs_read" ]; then + echo "FAIL: kprobe event kprobes/vfs_read does not exist" + exit 1 +fi + +ENABLE=3D$(cat "$TRACEDIR/events/kprobes/vfs_read/enable") +if [ "$ENABLE" !=3D "1" ]; then + echo "FAIL: kprobe event kprobes/vfs_read is not enabled ($ENABLE)" + exit 1 +fi + +echo "PASS: 01-kprobe" +exit 0 diff --git a/tools/testing/selftests/ftrace/boottime/tests/02-synth.sh b/to= ols/testing/selftests/ftrace/boottime/tests/02-synth.sh new file mode 100755 index 000000000000..46d3b152cbea --- /dev/null +++ b/tools/testing/selftests/ftrace/boottime/tests/02-synth.sh @@ -0,0 +1,18 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# Check synthetic event bootconfig settings on tracefs +TRACEDIR=3D"/sys/kernel/tracing" + +if [ ! -d "$TRACEDIR/events/synthetic/boot_lat" ]; then + echo "FAIL: synthetic event synthetic/boot_lat does not exist" + exit 1 +fi + +ENABLE=3D$(cat "$TRACEDIR/events/synthetic/boot_lat/enable") +if [ "$ENABLE" !=3D "1" ]; then + echo "FAIL: synthetic event synthetic/boot_lat is not enabled ($ENABLE)" + exit 1 +fi + +echo "PASS: 02-synth" +exit 0 diff --git a/tools/testing/selftests/ftrace/boottime/tests/03-eprobe.sh b/t= ools/testing/selftests/ftrace/boottime/tests/03-eprobe.sh new file mode 100755 index 000000000000..108f9ba31c06 --- /dev/null +++ b/tools/testing/selftests/ftrace/boottime/tests/03-eprobe.sh @@ -0,0 +1,18 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# Check eprobe event bootconfig settings on tracefs +TRACEDIR=3D"/sys/kernel/tracing" + +if [ ! -d "$TRACEDIR/events/eprobes/ep_read" ]; then + echo "FAIL: eprobe event eprobes/ep_read does not exist" + exit 1 +fi + +ENABLE=3D$(cat "$TRACEDIR/events/eprobes/ep_read/enable") +if [ "$ENABLE" !=3D "1" ]; then + echo "FAIL: eprobe event eprobes/ep_read is not enabled ($ENABLE)" + exit 1 +fi + +echo "PASS: 03-eprobe" +exit 0 diff --git a/tools/testing/selftests/ftrace/boottime/tests/04-fprobe.sh b/t= ools/testing/selftests/ftrace/boottime/tests/04-fprobe.sh new file mode 100755 index 000000000000..c0a316bf7dde --- /dev/null +++ b/tools/testing/selftests/ftrace/boottime/tests/04-fprobe.sh @@ -0,0 +1,18 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# Check fprobe event bootconfig settings on tracefs +TRACEDIR=3D"/sys/kernel/tracing" + +if [ ! -d "$TRACEDIR/events/fprobes/fp_read" ]; then + echo "FAIL: fprobe event fprobes/fp_read does not exist" + exit 1 +fi + +ENABLE=3D$(cat "$TRACEDIR/events/fprobes/fp_read/enable") +if [ "$ENABLE" !=3D "1" ]; then + echo "FAIL: fprobe event fprobes/fp_read is not enabled ($ENABLE)" + exit 1 +fi + +echo "PASS: 04-fprobe" +exit 0 diff --git a/tools/testing/selftests/ftrace/boottime/tests/05-tprobe.sh b/t= ools/testing/selftests/ftrace/boottime/tests/05-tprobe.sh new file mode 100755 index 000000000000..b29119b81e07 --- /dev/null +++ b/tools/testing/selftests/ftrace/boottime/tests/05-tprobe.sh @@ -0,0 +1,18 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# Check tracepoint probe event bootconfig settings on tracefs +TRACEDIR=3D"/sys/kernel/tracing" + +if [ ! -d "$TRACEDIR/events/tracepoints/tp_sched" ]; then + echo "FAIL: tracepoint probe event tracepoints/tp_sched does not exist" + exit 1 +fi + +ENABLE=3D$(cat "$TRACEDIR/events/tracepoints/tp_sched/enable") +if [ "$ENABLE" !=3D "1" ]; then + echo "FAIL: tracepoint probe event tracepoints/tp_sched is not enabled ($= ENABLE)" + exit 1 +fi + +echo "PASS: 05-tprobe" +exit 0 diff --git a/tools/testing/selftests/ftrace/boottime/tests/06-instance.sh b= /tools/testing/selftests/ftrace/boottime/tests/06-instance.sh new file mode 100755 index 000000000000..a95fdddaa6a6 --- /dev/null +++ b/tools/testing/selftests/ftrace/boottime/tests/06-instance.sh @@ -0,0 +1,23 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# Check instance bootconfig settings on tracefs +TRACEDIR=3D"/sys/kernel/tracing" + +if [ ! -d "$TRACEDIR/instances/foo" ]; then + echo "FAIL: trace instance foo does not exist" + exit 1 +fi + +if [ ! -d "$TRACEDIR/instances/foo/events/sched/sched_switch" ]; then + echo "FAIL: event sched_switch does not exist in instance foo" + exit 1 +fi + +ENABLE=3D$(cat "$TRACEDIR/instances/foo/events/sched/sched_switch/enable") +if [ "$ENABLE" !=3D "1" ]; then + echo "FAIL: event sched_switch is not enabled in instance foo ($ENABLE)" + exit 1 +fi + +echo "PASS: 06-instance" +exit 0 diff --git a/tools/testing/selftests/ftrace/config b/tools/testing/selftest= s/ftrace/config index 544de0db5f58..fec41c6b290e 100644 --- a/tools/testing/selftests/ftrace/config +++ b/tools/testing/selftests/ftrace/config @@ -1,3 +1,5 @@ +CONFIG_BOOT_CONFIG=3Dy +CONFIG_BOOTTIME_TRACING=3Dy CONFIG_BPF_SYSCALL=3Dy CONFIG_DEBUG_INFO_BTF=3Dy CONFIG_DEBUG_INFO_DWARF4=3Dy @@ -8,6 +10,7 @@ CONFIG_FTRACE=3Dy CONFIG_FTRACE_SYSCALLS=3Dy CONFIG_FUNCTION_GRAPH_RETVAL=3Dy CONFIG_FUNCTION_PROFILER=3Dy +CONFIG_FUNCTION_TRACER=3Dy CONFIG_HIST_TRIGGERS=3Dy CONFIG_IRQSOFF_TRACER=3Dy CONFIG_KALLSYMS_ALL=3Dy @@ -24,6 +27,7 @@ CONFIG_SAMPLE_TRACE_EVENTS=3Dm CONFIG_SAMPLE_TRACE_PRINTK=3Dm CONFIG_SCHED_TRACER=3Dy CONFIG_STACK_TRACER=3Dy +CONFIG_SYNTH_EVENTS=3Dy CONFIG_TRACER_SNAPSHOT=3Dy CONFIG_UPROBES=3Dy CONFIG_UPROBE_EVENTS=3Dy