1 /* SPDX-License-Identifier: GPL-2.0-only */
3 * Copyright (c) 2022, Microsoft Corporation.
9 #ifndef _LINUX_USER_EVENTS_H
10 #define _LINUX_USER_EVENTS_H
12 #include <linux/list.h>
13 #include <linux/refcount.h>
14 #include <linux/mm_types.h>
15 #include <linux/workqueue.h>
16 #include <uapi/linux/user_events.h>
18 #ifdef CONFIG_USER_EVENTS
19 struct user_event_mm {
20 struct list_head link;
21 struct list_head enablers;
23 struct user_event_mm *next;
26 struct rcu_work put_rwork;
29 extern void user_event_mm_dup(struct task_struct *t,
30 struct user_event_mm *old_mm);
32 extern void user_event_mm_remove(struct task_struct *t);
34 static inline void user_events_fork(struct task_struct *t,
35 unsigned long clone_flags)
37 struct user_event_mm *old_mm;
39 if (!t || !current->user_event_mm)
42 old_mm = current->user_event_mm;
44 if (clone_flags & CLONE_VM) {
45 t->user_event_mm = old_mm;
46 refcount_inc(&old_mm->tasks);
50 user_event_mm_dup(t, old_mm);
53 static inline void user_events_execve(struct task_struct *t)
55 if (!t || !t->user_event_mm)
58 user_event_mm_remove(t);
61 static inline void user_events_exit(struct task_struct *t)
63 if (!t || !t->user_event_mm)
66 user_event_mm_remove(t);
69 static inline void user_events_fork(struct task_struct *t,
70 unsigned long clone_flags)
74 static inline void user_events_execve(struct task_struct *t)
78 static inline void user_events_exit(struct task_struct *t)
81 #endif /* CONFIG_USER_EVENTS */
83 #endif /* _LINUX_USER_EVENTS_H */