Re: [PATCH v5 02/11] tracing/user_events: Track fork/exec/exit for mm lifetime

Mathieu Desnoyers
2022-12-05T21:17:28Z

On 2022-12-05 16:00, Beau Belgrave wrote:
> 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.

Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>

>
> Suggested-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
> Signed-off-by: Beau Belgrave <beaub@linux.microsoft.com>
> ---
> fs/exec.c | 2 ++
> include/linux/sched.h | 5 +++++
> include/linux/user_events.h | 16 +++++++++++++++-
> kernel/exit.c | 2 ++
> kernel/fork.c | 2 ++
> 5 files changed, 26 insertions(+), 1 deletion(-)
>
> diff --git a/fs/exec.c b/fs/exec.c
> index a0b1f0337a62..75ca6fbd195c 100644
> --- a/fs/exec.c
> +++ b/fs/exec.c
> @@ -64,6 +64,7 @@
> #include <linux/io_uring.h>
> #include <linux/syscall_user_dispatch.h>
> #include <linux/coredump.h>
> +#include <linux/user_events.h>
>
> #include <linux/uaccess.h>
> #include <asm/mmu_context.h>
> @@ -1842,6 +1843,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;
> diff --git a/include/linux/sched.h b/include/linux/sched.h
> index ffb6eb55cd13..61ed2f9deb26 100644
> --- a/include/linux/sched.h
> +++ b/include/linux/sched.h
> @@ -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.
> diff --git a/include/linux/user_events.h b/include/linux/user_events.h
> index 036b360f3d97..3d747c45d2fa 100644
> --- a/include/linux/user_events.h
> +++ b/include/linux/user_events.h
> @@ -12,7 +12,21 @@
> #include <uapi/linux/user_events.h>
>
> #ifdef CONFIG_USER_EVENTS
> -#else
> +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 */
> diff --git a/kernel/exit.c b/kernel/exit.c
> index 35e0a31a0315..0bfadc26d278 100644
> --- a/kernel/exit.c
> +++ b/kernel/exit.c
> @@ -67,6 +67,7 @@
> #include <linux/io_uring.h>
> #include <linux/kprobes.h>
> #include <linux/rethook.h>
> +#include <linux/user_events.h>
>
> #include <linux/uaccess.h>
> #include <asm/unistd.h>
> @@ -769,6 +770,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);
>
> diff --git a/kernel/fork.c b/kernel/fork.c
> index 08969f5aa38d..a4be76276ccb 100644
> --- a/kernel/fork.c
> +++ b/kernel/fork.c
> @@ -97,6 +97,7 @@
> #include <linux/scs.h>
> #include <linux/io_uring.h>
> #include <linux/bpf.h>
> +#include <linux/user_events.h>
>
> #include <asm/pgalloc.h>
> #include <linux/uaccess.h>
> @@ -2487,6 +2488,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);
>

--
Mathieu Desnoyers
EfficiOS Inc.