hc
2023-12-08 01573e231f18eb2d99162747186f59511f56b64d
kernel/include/linux/sched/task.h
....@@ -8,10 +8,33 @@
88 */
99
1010 #include <linux/sched.h>
11
+#include <linux/uaccess.h>
1112
1213 struct task_struct;
1314 struct rusage;
1415 union thread_union;
16
+struct css_set;
17
+
18
+/* All the bits taken by the old clone syscall. */
19
+#define CLONE_LEGACY_FLAGS 0xffffffffULL
20
+
21
+struct kernel_clone_args {
22
+ u64 flags;
23
+ int __user *pidfd;
24
+ int __user *child_tid;
25
+ int __user *parent_tid;
26
+ int exit_signal;
27
+ unsigned long stack;
28
+ unsigned long stack_size;
29
+ unsigned long tls;
30
+ pid_t *set_tid;
31
+ /* Number of elements in *set_tid */
32
+ size_t set_tid_size;
33
+ int cgroup;
34
+ int io_thread;
35
+ struct cgroup *cgrp;
36
+ struct css_set *cset;
37
+};
1538
1639 /*
1740 * This serializes "schedule()" and also protects
....@@ -33,6 +56,8 @@
3356 extern void init_idle(struct task_struct *idle, int cpu);
3457
3558 extern int sched_fork(unsigned long clone_flags, struct task_struct *p);
59
+extern void sched_cgroup_fork(struct task_struct *p, struct kernel_clone_args *kargs);
60
+extern void sched_post_fork(struct task_struct *p);
3661 extern void sched_dead(struct task_struct *p);
3762
3863 void __noreturn do_task_dead(void);
....@@ -43,22 +68,9 @@
4368
4469 extern void release_task(struct task_struct * p);
4570
46
-#ifdef CONFIG_HAVE_COPY_THREAD_TLS
47
-extern int copy_thread_tls(unsigned long, unsigned long, unsigned long,
48
- struct task_struct *, unsigned long);
49
-#else
5071 extern int copy_thread(unsigned long, unsigned long, unsigned long,
51
- struct task_struct *);
72
+ struct task_struct *, unsigned long);
5273
53
-/* Architectures that haven't opted into copy_thread_tls get the tls argument
54
- * via pt_regs, so ignore the tls argument passed via C. */
55
-static inline int copy_thread_tls(
56
- unsigned long clone_flags, unsigned long sp, unsigned long arg,
57
- struct task_struct *p, unsigned long tls)
58
-{
59
- return copy_thread(clone_flags, sp, arg, p);
60
-}
61
-#endif
6274 extern void flush_thread(void);
6375
6476 #ifdef CONFIG_HAVE_EXIT_THREAD
....@@ -71,13 +83,15 @@
7183 extern void do_group_exit(int);
7284
7385 extern void exit_files(struct task_struct *);
74
-extern void exit_itimers(struct signal_struct *);
86
+extern void exit_itimers(struct task_struct *);
7587
76
-extern long _do_fork(unsigned long, unsigned long, unsigned long, int __user *, int __user *, unsigned long);
77
-extern long do_fork(unsigned long, unsigned long, unsigned long, int __user *, int __user *);
88
+extern pid_t kernel_clone(struct kernel_clone_args *kargs);
89
+struct task_struct *create_io_thread(int (*fn)(void *), void *arg, int node);
7890 struct task_struct *fork_idle(int);
91
+struct mm_struct *copy_init_mm(void);
7992 extern pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
8093 extern long kernel_wait4(pid_t, int __user *, int, struct rusage *);
94
+int kernel_wait(pid_t pid, int *stat);
8195
8296 extern void free_task(struct task_struct *tsk);
8397
....@@ -88,26 +102,27 @@
88102 #define sched_exec() {}
89103 #endif
90104
91
-#define get_task_struct(tsk) do { atomic_inc(&(tsk)->usage); } while(0)
92
-
93
-#ifdef CONFIG_PREEMPT_RT_BASE
94
-extern void __put_task_struct_cb(struct rcu_head *rhp);
95
-
96
-static inline void put_task_struct(struct task_struct *t)
105
+static inline struct task_struct *get_task_struct(struct task_struct *t)
97106 {
98
- if (atomic_dec_and_test(&t->usage))
99
- call_rcu(&t->put_rcu, __put_task_struct_cb);
107
+ refcount_inc(&t->usage);
108
+ return t;
100109 }
101
-#else
110
+
102111 extern void __put_task_struct(struct task_struct *t);
103112
104113 static inline void put_task_struct(struct task_struct *t)
105114 {
106
- if (atomic_dec_and_test(&t->usage))
115
+ if (refcount_dec_and_test(&t->usage))
107116 __put_task_struct(t);
108117 }
109
-#endif
110
-struct task_struct *task_rcu_dereference(struct task_struct **ptask);
118
+
119
+static inline void put_task_struct_many(struct task_struct *t, int nr)
120
+{
121
+ if (refcount_sub_and_test(nr, &t->usage))
122
+ __put_task_struct(t);
123
+}
124
+
125
+void put_task_struct_rcu_user(struct task_struct *task);
111126
112127 #ifdef CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT
113128 extern int arch_task_struct_size __read_mostly;