tracing/user_events: Track fork/exec/exit for mm lifetime
authorBeau Belgrave <beaub@linux.microsoft.com>
Tue, 28 Mar 2023 23:52:09 +0000 (16:52 -0700)
committerSteven Rostedt (Google) <rostedt@goodmis.org>
Wed, 29 Mar 2023 10:52:08 +0000 (06:52 -0400)
During tracefs discussions it was decided instead of requiring a mapping
within a user-process to track the lifetime of memory descriptors we
should hook the appropriate calls. Do this by adding the minimal stubs
required for task fork, exec, and exit. Currently this is just a NOP.
Future patches will implement these calls fully.

Link: https://lkml.kernel.org/r/20230328235219.203-3-beaub@linux.microsoft.com
Suggested-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: Beau Belgrave <beaub@linux.microsoft.com>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
fs/exec.c
include/linux/sched.h
include/linux/user_events.h
kernel/exit.c
kernel/fork.c

index 7c44d0c65b1b4c7bcb91905110afc330d52a2bc8..2b0042f8deec359fc21a08dd6f5f25de64e8c7d6 100644 (file)
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -65,6 +65,7 @@
 #include <linux/syscall_user_dispatch.h>
 #include <linux/coredump.h>
 #include <linux/time_namespace.h>
+#include <linux/user_events.h>
 
 #include <linux/uaccess.h>
 #include <asm/mmu_context.h>
@@ -1859,6 +1860,7 @@ static int bprm_execve(struct linux_binprm *bprm,
        current->fs->in_exec = 0;
        current->in_execve = 0;
        rseq_execve(current);
+       user_events_execve(current);
        acct_update_integrals(current);
        task_numa_free(current, false);
        return retval;
index 63d242164b1a91af1fcb89c3cf6e146b32cda391..bf37846e90c2a0da1e990bb3082fdfaea62caf3a 100644 (file)
@@ -69,6 +69,7 @@ struct sighand_struct;
 struct signal_struct;
 struct task_delay_info;
 struct task_group;
+struct user_event_mm;
 
 /*
  * Task state bitmask. NOTE! These bits are also
@@ -1528,6 +1529,10 @@ struct task_struct {
        union rv_task_monitor           rv[RV_PER_TASK_MONITORS];
 #endif
 
+#ifdef CONFIG_USER_EVENTS
+       struct user_event_mm            *user_event_mm;
+#endif
+
        /*
         * New fields for task_struct should be added above here, so that
         * they are included in the randomized portion of task_struct.
index 13689589d36e75092b89f92b40e0179cf7fa61c5..3d747c45d2fae480563469e5fca656e500d32192 100644 (file)
 
 #include <uapi/linux/user_events.h>
 
+#ifdef CONFIG_USER_EVENTS
+struct user_event_mm {
+};
+#endif
+
+static inline void user_events_fork(struct task_struct *t,
+                                   unsigned long clone_flags)
+{
+}
+
+static inline void user_events_execve(struct task_struct *t)
+{
+}
+
+static inline void user_events_exit(struct task_struct *t)
+{
+}
+
 #endif /* _LINUX_USER_EVENTS_H */
index f2afdb0add7c5173956940c2a49342807c6407e7..875d6a134df8c157c78da621760a2c52fef06914 100644 (file)
@@ -68,6 +68,7 @@
 #include <linux/kprobes.h>
 #include <linux/rethook.h>
 #include <linux/sysfs.h>
+#include <linux/user_events.h>
 
 #include <linux/uaccess.h>
 #include <asm/unistd.h>
@@ -818,6 +819,7 @@ void __noreturn do_exit(long code)
 
        coredump_task_exit(tsk);
        ptrace_event(PTRACE_EVENT_EXIT, code);
+       user_events_exit(tsk);
 
        validate_creds_for_do_exit(tsk);
 
index d8cda4c6de6c705051ffa2c14aa83a68c989da2f..efb1f2257772e3117633cc1318f504adbcb0cba6 100644 (file)
@@ -97,6 +97,7 @@
 #include <linux/io_uring.h>
 #include <linux/bpf.h>
 #include <linux/stackprotector.h>
+#include <linux/user_events.h>
 
 #include <asm/pgalloc.h>
 #include <linux/uaccess.h>
@@ -2505,6 +2506,7 @@ static __latent_entropy struct task_struct *copy_process(
 
        trace_task_newtask(p, clone_flags);
        uprobe_copy_process(p, clone_flags);
+       user_events_fork(p, clone_flags);
 
        copy_oom_score_adj(clone_flags, p);