1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Copyright (c) 2022, Microsoft Corporation.
4 *
5 * Authors:
6 * Beau Belgrave <beaub@linux.microsoft.com>
7 */
8
9#ifndef _LINUX_USER_EVENTS_H
10#define _LINUX_USER_EVENTS_H
11
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>
17
18#ifdef CONFIG_USER_EVENTS
19struct user_event_mm {
20 struct list_head mms_link;
21 struct list_head enablers;
22 struct mm_struct *mm;
23 /* Used for one-shot lists, protected by event_mutex */
24 struct user_event_mm *next;
25 refcount_t refcnt;
26 refcount_t tasks;
27 struct rcu_work put_rwork;
28};
29
30extern void user_event_mm_dup(struct task_struct *t,
31 struct user_event_mm *old_mm);
32
33extern void user_event_mm_remove(struct task_struct *t);
34
35static inline void user_events_fork(struct task_struct *t,
36 unsigned long clone_flags)
37{
38 struct user_event_mm *old_mm;
39
40 if (!t || !current->user_event_mm)
41 return;
42
43 old_mm = current->user_event_mm;
44
45 if (clone_flags & CLONE_VM) {
46 t->user_event_mm = old_mm;
47 refcount_inc(r: &old_mm->tasks);
48 return;
49 }
50
51 user_event_mm_dup(t, old_mm);
52}
53
54static inline void user_events_execve(struct task_struct *t)
55{
56 if (!t || !t->user_event_mm)
57 return;
58
59 user_event_mm_remove(t);
60}
61
62static inline void user_events_exit(struct task_struct *t)
63{
64 if (!t || !t->user_event_mm)
65 return;
66
67 user_event_mm_remove(t);
68}
69#else
70static inline void user_events_fork(struct task_struct *t,
71 unsigned long clone_flags)
72{
73}
74
75static inline void user_events_execve(struct task_struct *t)
76{
77}
78
79static inline void user_events_exit(struct task_struct *t)
80{
81}
82#endif /* CONFIG_USER_EVENTS */
83
84#endif /* _LINUX_USER_EVENTS_H */
85

source code of linux/include/linux/user_events.h