[RFC v3 5/5] Tasklist sample module
York Jasper Niebuhr <[email protected]> Mon, 20 Jul 2026 21:13:33 +0200
| Newsgroups | org.kernel.vger.linux-hardening,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
Signed-off-by: York Jasper Niebuhr <[email protected]> --- samples/Kconfig | 3 ++ samples/Makefile | 1 + samples/spslr/Kconfig | 17 ++++++++ samples/spslr/Makefile | 1 + samples/spslr/tasklist/Makefile | 1 + samples/spslr/tasklist/tasklist.c | 67 +++++++++++++++++++++++++++++++ 6 files changed, 90 insertions(+) create mode 100644 samples/spslr/Kconfig create mode 100644 samples/spslr/Makefile create mode 100644 samples/spslr/tasklist/Makefile create mode 100644 samples/spslr/tasklist/tasklist.c diff --git a/samples/Kconfig b/samples/Kconfig index a75e8e78330d..8925820617c9 100644 --- a/samples/Kconfig +++ b/samples/Kconfig @@ -326,6 +326,8 @@ source "samples/rust/Kconfig" source "samples/damon/Kconfig" +source "samples/spslr/Kconfig" + endif # SAMPLES config HAVE_SAMPLE_FTRACE_DIRECT @@ -333,3 +335,4 @@ config HAVE_SAMPLE_FTRACE_DIRECT config HAVE_SAMPLE_FTRACE_DIRECT_MULTI bool + diff --git a/samples/Makefile b/samples/Makefile index 07641e177bd8..1b727ceb2efa 100644 --- a/samples/Makefile +++ b/samples/Makefile @@ -45,3 +45,4 @@ obj-$(CONFIG_SAMPLE_DAMON_PRCL) += damon/ obj-$(CONFIG_SAMPLE_DAMON_MTIER) += damon/ obj-$(CONFIG_SAMPLE_HUNG_TASK) += hung_task/ obj-$(CONFIG_SAMPLE_TSM_MR) += tsm-mr/ +obj-$(CONFIG_SAMPLES_SPSLR) += spslr/ diff --git a/samples/spslr/Kconfig b/samples/spslr/Kconfig new file mode 100644 index 000000000000..ba163ea15006 --- /dev/null +++ b/samples/spslr/Kconfig @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: GPL-2.0 + +menuconfig SAMPLES_SPSLR + bool "SPSLR samples" + depends on SPSLR + help + You can build sample SPSLR kernel code here. + + If unsure, say N. + +if SAMPLES_SPSLR + +config SAMPLE_SPSLR_TASKLIST + tristate "SPSLR tasklist module example" + depends on m + +endif # SAMPLES_SPSLR diff --git a/samples/spslr/Makefile b/samples/spslr/Makefile new file mode 100644 index 000000000000..2d330b105c95 --- /dev/null +++ b/samples/spslr/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_SAMPLE_SPSLR_TASKLIST) += tasklist/ diff --git a/samples/spslr/tasklist/Makefile b/samples/spslr/tasklist/Makefile new file mode 100644 index 000000000000..6a5bc5b29b34 --- /dev/null +++ b/samples/spslr/tasklist/Makefile @@ -0,0 +1 @@ +obj-m += tasklist.o diff --git a/samples/spslr/tasklist/tasklist.c b/samples/spslr/tasklist/tasklist.c new file mode 100644 index 000000000000..ea021742c8e9 --- /dev/null +++ b/samples/spslr/tasklist/tasklist.c @@ -0,0 +1,67 @@ +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/sched/signal.h> +#include <linux/sched/task.h> +#include <linux/cred.h> +#include <linux/uidgid.h> +#include <linux/module.h> +#include <linux/list.h> + +static const struct task_struct module_target_data = { .flags = 42 }; + +static int __init taskinfo_init(void) +{ + struct task_struct *p; + + pr_info("taskinfo: loaded\n"); + pr_info(" offsetof(task_struct, pid)=%zu\n", offsetof(struct task_struct, pid)); + pr_info(" offsetof(task_struct, tgid)=%zu\n", offsetof(struct task_struct, tgid)); + pr_info(" offsetof(task_struct, cred)=%zu\n", offsetof(struct task_struct, cred)); + pr_info(" offsetof(task_struct, real_parent)=%zu\n", offsetof(struct task_struct, real_parent)); + pr_info(" offsetof(task_struct, comm)=%zu\n", offsetof(struct task_struct, comm)); + pr_info(" offsetof(task_struct, __state)=%zu\n", offsetof(struct task_struct, __state)); + pr_info(" offsetof(task_struct, flags)=%zu\n", offsetof(struct task_struct, flags)); + pr_info(" offsetof(task_struct, prio)=%zu\n", offsetof(struct task_struct, prio)); + pr_info(" offsetof(task_struct, policy)=%zu\n", offsetof(struct task_struct, policy)); + + pr_info("datapin flags value is %u (should be 42)\n", module_target_data.flags); + + pr_info("=== Task List ===\n"); + + rcu_read_lock(); + + for_each_process(p) { + const struct cred *cred; + struct task_struct *parent; + + cred = rcu_dereference(p->cred); + parent = rcu_dereference(p->real_parent); + + pr_info("task: pid=%d tgid=%d ppid=%d uid=%u gid=%u comm=%s state=%u flags=0x%x prio=%d policy=%u\n", + p->pid, + p->tgid, + parent ? parent->tgid : -1, + __kuid_val(cred->uid), + __kgid_val(cred->gid), + p->comm, + READ_ONCE(p->__state), + p->flags, + p->prio, + p->policy); + } + + rcu_read_unlock(); + + return 0; +} + +static void __exit taskinfo_exit(void) +{ + pr_info("taskinfo: unloaded\n"); +} + +module_init(taskinfo_init); +module_exit(taskinfo_exit); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("List modules and tasks (task_struct stress)"); -- 2.43.0