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