diff options
Diffstat (limited to 'include/linux/user_events.h')
-rw-r--r-- | include/linux/user_events.h | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/include/linux/user_events.h b/include/linux/user_events.h new file mode 100644 index 000000000000..8afa8c3a0973 --- /dev/null +++ b/include/linux/user_events.h @@ -0,0 +1,84 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2022, Microsoft Corporation. + * + * Authors: + * Beau Belgrave <beaub@linux.microsoft.com> + */ + +#ifndef _LINUX_USER_EVENTS_H +#define _LINUX_USER_EVENTS_H + +#include <linux/list.h> +#include <linux/refcount.h> +#include <linux/mm_types.h> +#include <linux/workqueue.h> +#include <uapi/linux/user_events.h> + +#ifdef CONFIG_USER_EVENTS +struct user_event_mm { + struct list_head mms_link; + struct list_head enablers; + struct mm_struct *mm; + /* Used for one-shot lists, protected by event_mutex */ + struct user_event_mm *next; + refcount_t refcnt; + refcount_t tasks; + struct rcu_work put_rwork; +}; + +extern void user_event_mm_dup(struct task_struct *t, + struct user_event_mm *old_mm); + +extern void user_event_mm_remove(struct task_struct *t); + +static inline void user_events_fork(struct task_struct *t, + unsigned long clone_flags) +{ + struct user_event_mm *old_mm; + + if (!t || !current->user_event_mm) + return; + + old_mm = current->user_event_mm; + + if (clone_flags & CLONE_VM) { + t->user_event_mm = old_mm; + refcount_inc(&old_mm->tasks); + return; + } + + user_event_mm_dup(t, old_mm); +} + +static inline void user_events_execve(struct task_struct *t) +{ + if (!t || !t->user_event_mm) + return; + + user_event_mm_remove(t); +} + +static inline void user_events_exit(struct task_struct *t) +{ + if (!t || !t->user_event_mm) + return; + + user_event_mm_remove(t); +} +#else +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 /* CONFIG_USER_EVENTS */ + +#endif /* _LINUX_USER_EVENTS_H */ |