| .. | .. |
|---|
| 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) |
|---|
| 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) |
|---|
| 97 | 106 | { |
|---|
| 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; |
|---|
| 100 | 109 | } |
|---|
| 101 | | -#else |
|---|
| 110 | + |
|---|
| 102 | 111 | extern void __put_task_struct(struct task_struct *t); |
|---|
| 103 | 112 | |
|---|
| 104 | 113 | static inline void put_task_struct(struct task_struct *t) |
|---|
| 105 | 114 | { |
|---|
| 106 | | - if (atomic_dec_and_test(&t->usage)) |
|---|
| 115 | + if (refcount_dec_and_test(&t->usage)) |
|---|
| 107 | 116 | __put_task_struct(t); |
|---|
| 108 | 117 | } |
|---|
| 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); |
|---|
| 111 | 126 | |
|---|
| 112 | 127 | #ifdef CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT |
|---|
| 113 | 128 | extern int arch_task_struct_size __read_mostly; |
|---|