.. | .. |
---|
8 | 8 | */ |
---|
9 | 9 | |
---|
10 | 10 | #include <linux/sched.h> |
---|
| 11 | +#include <linux/uaccess.h> |
---|
11 | 12 | |
---|
12 | 13 | struct task_struct; |
---|
13 | 14 | struct rusage; |
---|
14 | 15 | 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 | +}; |
---|
15 | 38 | |
---|
16 | 39 | /* |
---|
17 | 40 | * This serializes "schedule()" and also protects |
---|
.. | .. |
---|
33 | 56 | extern void init_idle(struct task_struct *idle, int cpu); |
---|
34 | 57 | |
---|
35 | 58 | 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); |
---|
36 | 61 | extern void sched_dead(struct task_struct *p); |
---|
37 | 62 | |
---|
38 | 63 | void __noreturn do_task_dead(void); |
---|
.. | .. |
---|
43 | 68 | |
---|
44 | 69 | extern void release_task(struct task_struct * p); |
---|
45 | 70 | |
---|
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 |
---|
50 | 71 | extern int copy_thread(unsigned long, unsigned long, unsigned long, |
---|
51 | | - struct task_struct *); |
---|
| 72 | + struct task_struct *, unsigned long); |
---|
52 | 73 | |
---|
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 |
---|
62 | 74 | extern void flush_thread(void); |
---|
63 | 75 | |
---|
64 | 76 | #ifdef CONFIG_HAVE_EXIT_THREAD |
---|
.. | .. |
---|
71 | 83 | extern void do_group_exit(int); |
---|
72 | 84 | |
---|
73 | 85 | extern void exit_files(struct task_struct *); |
---|
74 | | -extern void exit_itimers(struct signal_struct *); |
---|
| 86 | +extern void exit_itimers(struct task_struct *); |
---|
75 | 87 | |
---|
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); |
---|
78 | 90 | struct task_struct *fork_idle(int); |
---|
| 91 | +struct mm_struct *copy_init_mm(void); |
---|
79 | 92 | extern pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); |
---|
80 | 93 | extern long kernel_wait4(pid_t, int __user *, int, struct rusage *); |
---|
| 94 | +int kernel_wait(pid_t pid, int *stat); |
---|
81 | 95 | |
---|
82 | 96 | extern void free_task(struct task_struct *tsk); |
---|
83 | 97 | |
---|
.. | .. |
---|
88 | 102 | #define sched_exec() {} |
---|
89 | 103 | #endif |
---|
90 | 104 | |
---|
91 | | -#define get_task_struct(tsk) do { atomic_inc(&(tsk)->usage); } while(0) |
---|
| 105 | +static inline struct task_struct *get_task_struct(struct task_struct *t) |
---|
| 106 | +{ |
---|
| 107 | + refcount_inc(&t->usage); |
---|
| 108 | + return t; |
---|
| 109 | +} |
---|
92 | 110 | |
---|
93 | 111 | extern void __put_task_struct(struct task_struct *t); |
---|
94 | 112 | |
---|
95 | 113 | static inline void put_task_struct(struct task_struct *t) |
---|
96 | 114 | { |
---|
97 | | - if (atomic_dec_and_test(&t->usage)) |
---|
| 115 | + if (refcount_dec_and_test(&t->usage)) |
---|
98 | 116 | __put_task_struct(t); |
---|
99 | 117 | } |
---|
100 | 118 | |
---|
101 | | -struct task_struct *task_rcu_dereference(struct task_struct **ptask); |
---|
| 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); |
---|
102 | 126 | |
---|
103 | 127 | #ifdef CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT |
---|
104 | 128 | extern int arch_task_struct_size __read_mostly; |
---|