Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : #ifndef _LINUX_SCHED_TASK_H 3 : : #define _LINUX_SCHED_TASK_H 4 : : 5 : : /* 6 : : * Interface between the scheduler and various task lifetime (fork()/exit()) 7 : : * functionality: 8 : : */ 9 : : 10 : : #include <linux/sched.h> 11 : : #include <linux/uaccess.h> 12 : : 13 : : struct task_struct; 14 : : struct rusage; 15 : : union thread_union; 16 : : 17 : : /* All the bits taken by the old clone syscall. */ 18 : : #define CLONE_LEGACY_FLAGS 0xffffffffULL 19 : : 20 : : struct kernel_clone_args { 21 : : u64 flags; 22 : : int __user *pidfd; 23 : : int __user *child_tid; 24 : : int __user *parent_tid; 25 : : int exit_signal; 26 : : unsigned long stack; 27 : : unsigned long stack_size; 28 : : unsigned long tls; 29 : : }; 30 : : 31 : : /* 32 : : * This serializes "schedule()" and also protects 33 : : * the run-queue from deletions/modifications (but 34 : : * _adding_ to the beginning of the run-queue has 35 : : * a separate lock). 36 : : */ 37 : : extern rwlock_t tasklist_lock; 38 : : extern spinlock_t mmlist_lock; 39 : : 40 : : extern union thread_union init_thread_union; 41 : : extern struct task_struct init_task; 42 : : 43 : : #ifdef CONFIG_PROVE_RCU 44 : : extern int lockdep_tasklist_lock_is_held(void); 45 : : #endif /* #ifdef CONFIG_PROVE_RCU */ 46 : : 47 : : extern asmlinkage void schedule_tail(struct task_struct *prev); 48 : : extern void init_idle(struct task_struct *idle, int cpu); 49 : : 50 : : extern int sched_fork(unsigned long clone_flags, struct task_struct *p); 51 : : extern void sched_dead(struct task_struct *p); 52 : : 53 : : void __noreturn do_task_dead(void); 54 : : 55 : : extern void proc_caches_init(void); 56 : : 57 : : extern void fork_init(void); 58 : : 59 : : extern void release_task(struct task_struct * p); 60 : : 61 : : #ifdef CONFIG_HAVE_COPY_THREAD_TLS 62 : : extern int copy_thread_tls(unsigned long, unsigned long, unsigned long, 63 : : struct task_struct *, unsigned long); 64 : : #else 65 : : extern int copy_thread(unsigned long, unsigned long, unsigned long, 66 : : struct task_struct *); 67 : : 68 : : /* Architectures that haven't opted into copy_thread_tls get the tls argument 69 : : * via pt_regs, so ignore the tls argument passed via C. */ 70 : : static inline int copy_thread_tls( 71 : : unsigned long clone_flags, unsigned long sp, unsigned long arg, 72 : : struct task_struct *p, unsigned long tls) 73 : : { 74 : : return copy_thread(clone_flags, sp, arg, p); 75 : : } 76 : : #endif 77 : : extern void flush_thread(void); 78 : : 79 : : #ifdef CONFIG_HAVE_EXIT_THREAD 80 : : extern void exit_thread(struct task_struct *tsk); 81 : : #else 82 : : static inline void exit_thread(struct task_struct *tsk) 83 : : { 84 : : } 85 : : #endif 86 : : extern void do_group_exit(int); 87 : : 88 : : extern void exit_files(struct task_struct *); 89 : : extern void exit_itimers(struct signal_struct *); 90 : : 91 : : extern long _do_fork(struct kernel_clone_args *kargs); 92 : : extern bool legacy_clone_args_valid(const struct kernel_clone_args *kargs); 93 : : extern long do_fork(unsigned long, unsigned long, unsigned long, int __user *, int __user *); 94 : : struct task_struct *fork_idle(int); 95 : : struct mm_struct *copy_init_mm(void); 96 : : extern pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); 97 : : extern long kernel_wait4(pid_t, int __user *, int, struct rusage *); 98 : : 99 : : extern void free_task(struct task_struct *tsk); 100 : : 101 : : /* sched_exec is called by processes performing an exec */ 102 : : #ifdef CONFIG_SMP 103 : : extern void sched_exec(void); 104 : : #else 105 : : #define sched_exec() {} 106 : : #endif 107 : : 108 : : static inline struct task_struct *get_task_struct(struct task_struct *t) 109 : : { 110 : 3 : refcount_inc(&t->usage); 111 : : return t; 112 : : } 113 : : 114 : : extern void __put_task_struct(struct task_struct *t); 115 : : 116 : 3 : static inline void put_task_struct(struct task_struct *t) 117 : : { 118 : 3 : if (refcount_dec_and_test(&t->usage)) 119 : 3 : __put_task_struct(t); 120 : 3 : } 121 : : 122 : : void put_task_struct_rcu_user(struct task_struct *task); 123 : : 124 : : #ifdef CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT 125 : : extern int arch_task_struct_size __read_mostly; 126 : : #else 127 : : # define arch_task_struct_size (sizeof(struct task_struct)) 128 : : #endif 129 : : 130 : : #ifndef CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST 131 : : /* 132 : : * If an architecture has not declared a thread_struct whitelist we 133 : : * must assume something there may need to be copied to userspace. 134 : : */ 135 : : static inline void arch_thread_struct_whitelist(unsigned long *offset, 136 : : unsigned long *size) 137 : : { 138 : : *offset = 0; 139 : : /* Handle dynamically sized thread_struct. */ 140 : : *size = arch_task_struct_size - offsetof(struct task_struct, thread); 141 : : } 142 : : #endif 143 : : 144 : : #ifdef CONFIG_VMAP_STACK 145 : : static inline struct vm_struct *task_stack_vm_area(const struct task_struct *t) 146 : : { 147 : : return t->stack_vm_area; 148 : : } 149 : : #else 150 : : static inline struct vm_struct *task_stack_vm_area(const struct task_struct *t) 151 : : { 152 : : return NULL; 153 : : } 154 : : #endif 155 : : 156 : : /* 157 : : * Protects ->fs, ->files, ->mm, ->group_info, ->comm, keyring 158 : : * subscriptions and synchronises with wait4(). Also used in procfs. Also 159 : : * pins the final release of task.io_context. Also protects ->cpuset and 160 : : * ->cgroup.subsys[]. And ->vfork_done. 161 : : * 162 : : * Nests both inside and outside of read_lock(&tasklist_lock). 163 : : * It must not be nested with write_lock_irq(&tasklist_lock), 164 : : * neither inside nor outside. 165 : : */ 166 : : static inline void task_lock(struct task_struct *p) 167 : : { 168 : : spin_lock(&p->alloc_lock); 169 : : } 170 : : 171 : : static inline void task_unlock(struct task_struct *p) 172 : : { 173 : : spin_unlock(&p->alloc_lock); 174 : : } 175 : : 176 : : #endif /* _LINUX_SCHED_TASK_H */