11da177e4SLinus Torvalds #ifndef _LINUX__INIT_TASK_H 21da177e4SLinus Torvalds #define _LINUX__INIT_TASK_H 31da177e4SLinus Torvalds 4ab2af1f5SDipankar Sarma #include <linux/rcupdate.h> 5de30a2b3SIngo Molnar #include <linux/irqflags.h> 64865ecf1SSerge E. Hallyn #include <linux/utsname.h> 7fbb9ce95SIngo Molnar #include <linux/lockdep.h> 85ac9f622SSteven Rostedt #include <linux/ftrace.h> 973ea4130SKirill Korotaev #include <linux/ipc.h> 109a575a92SCedric Le Goater #include <linux/pid_namespace.h> 11acce292cSCedric Le Goater #include <linux/user_namespace.h> 123898b1b4SAndrew G. Morgan #include <linux/securebits.h> 136a61671bSFrederic Weisbecker #include <linux/seqlock.h> 14fb00aca4SPeter Zijlstra #include <linux/rbtree.h> 15772698f6SEric W. Biederman #include <net/net_namespace.h> 1677852feaSIngo Molnar #include <linux/sched/rt.h> 171da177e4SLinus Torvalds 18c65eacbeSAndy Lutomirski #include <asm/thread_info.h> 19c65eacbeSAndy Lutomirski 20806c09a7SDario Faggioli #ifdef CONFIG_SMP 21806c09a7SDario Faggioli # define INIT_PUSHABLE_TASKS(tsk) \ 22806c09a7SDario Faggioli .pushable_tasks = PLIST_NODE_INIT(tsk.pushable_tasks, MAX_PRIO), 23806c09a7SDario Faggioli #else 24806c09a7SDario Faggioli # define INIT_PUSHABLE_TASKS(tsk) 25806c09a7SDario Faggioli #endif 26806c09a7SDario Faggioli 27f52111b1SAl Viro extern struct files_struct init_files; 2818d8fda7SAl Viro extern struct fs_struct init_fs; 291da177e4SLinus Torvalds 30cc9a6c87SMel Gorman #ifdef CONFIG_CPUSETS 311ca7d67cSJohn Stultz #define INIT_CPUSET_SEQ(tsk) \ 321ca7d67cSJohn Stultz .mems_allowed_seq = SEQCNT_ZERO(tsk.mems_allowed_seq), 33cc9a6c87SMel Gorman #else 341ca7d67cSJohn Stultz #define INIT_CPUSET_SEQ(tsk) 35cc9a6c87SMel Gorman #endif 36cc9a6c87SMel Gorman 379d7fb042SPeter Zijlstra #ifndef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE 389d7fb042SPeter Zijlstra #define INIT_PREV_CPUTIME(x) .prev_cputime = { \ 399d7fb042SPeter Zijlstra .lock = __RAW_SPIN_LOCK_UNLOCKED(x.prev_cputime.lock), \ 409d7fb042SPeter Zijlstra }, 419d7fb042SPeter Zijlstra #else 429d7fb042SPeter Zijlstra #define INIT_PREV_CPUTIME(x) 439d7fb042SPeter Zijlstra #endif 449d7fb042SPeter Zijlstra 451da177e4SLinus Torvalds #define INIT_SIGNALS(sig) { \ 46b3ac022cSOleg Nesterov .nr_threads = 1, \ 470c740d0aSOleg Nesterov .thread_head = LIST_HEAD_INIT(init_task.thread_node), \ 481da177e4SLinus Torvalds .wait_chldexit = __WAIT_QUEUE_HEAD_INITIALIZER(sig.wait_chldexit),\ 491da177e4SLinus Torvalds .shared_pending = { \ 501da177e4SLinus Torvalds .list = LIST_HEAD_INIT(sig.shared_pending.list), \ 511da177e4SLinus Torvalds .signal = {{0}}}, \ 521da177e4SLinus Torvalds .posix_timers = LIST_HEAD_INIT(sig.posix_timers), \ 531da177e4SLinus Torvalds .cpu_timers = INIT_CPU_TIMERS(sig.cpu_timers), \ 541da177e4SLinus Torvalds .rlim = INIT_RLIMITS, \ 554cd4c1b4SPeter Zijlstra .cputimer = { \ 5671107445SJason Low .cputime_atomic = INIT_CPUTIME_ATOMIC, \ 57d5c373ebSJason Low .running = false, \ 58c8d75aa4SJason Low .checking_timer = false, \ 594cd4c1b4SPeter Zijlstra }, \ 609d7fb042SPeter Zijlstra INIT_PREV_CPUTIME(sig) \ 619b1bf12dSKOSAKI Motohiro .cred_guard_mutex = \ 629b1bf12dSKOSAKI Motohiro __MUTEX_INITIALIZER(sig.cred_guard_mutex), \ 631da177e4SLinus Torvalds } 641da177e4SLinus Torvalds 65ab516013SSerge E. Hallyn extern struct nsproxy init_nsproxy; 66ab516013SSerge E. Hallyn 671da177e4SLinus Torvalds #define INIT_SIGHAND(sighand) { \ 681da177e4SLinus Torvalds .count = ATOMIC_INIT(1), \ 690a14a130SOleg Nesterov .action = { { { .sa_handler = SIG_DFL, } }, }, \ 70e4d91918SIngo Molnar .siglock = __SPIN_LOCK_UNLOCKED(sighand.siglock), \ 71b8fceee1SDavide Libenzi .signalfd_wqh = __WAIT_QUEUE_HEAD_INITIALIZER(sighand.signalfd_wqh), \ 721da177e4SLinus Torvalds } 731da177e4SLinus Torvalds 741da177e4SLinus Torvalds extern struct group_info init_groups; 751da177e4SLinus Torvalds 76820e45dbSSukadev Bhattiprolu #define INIT_STRUCT_PID { \ 77820e45dbSSukadev Bhattiprolu .count = ATOMIC_INIT(1), \ 78820e45dbSSukadev Bhattiprolu .tasks = { \ 79f2001145SOleg Nesterov { .first = NULL }, \ 80f2001145SOleg Nesterov { .first = NULL }, \ 81f2001145SOleg Nesterov { .first = NULL }, \ 82820e45dbSSukadev Bhattiprolu }, \ 834c3f2eadSSukadev Bhattiprolu .level = 0, \ 844c3f2eadSSukadev Bhattiprolu .numbers = { { \ 854c3f2eadSSukadev Bhattiprolu .nr = 0, \ 864c3f2eadSSukadev Bhattiprolu .ns = &init_pid_ns, \ 874c3f2eadSSukadev Bhattiprolu .pid_chain = { .next = NULL, .pprev = NULL }, \ 884c3f2eadSSukadev Bhattiprolu }, } \ 89820e45dbSSukadev Bhattiprolu } 90820e45dbSSukadev Bhattiprolu 91820e45dbSSukadev Bhattiprolu #define INIT_PID_LINK(type) \ 92820e45dbSSukadev Bhattiprolu { \ 93820e45dbSSukadev Bhattiprolu .node = { \ 94820e45dbSSukadev Bhattiprolu .next = NULL, \ 95f2001145SOleg Nesterov .pprev = NULL, \ 96820e45dbSSukadev Bhattiprolu }, \ 97820e45dbSSukadev Bhattiprolu .pid = &init_struct_pid, \ 98820e45dbSSukadev Bhattiprolu } 99820e45dbSSukadev Bhattiprolu 100bfef93a5SAl Viro #ifdef CONFIG_AUDITSYSCALL 101bfef93a5SAl Viro #define INIT_IDS \ 102e1760bd5SEric W. Biederman .loginuid = INVALID_UID, \ 1034440e854SEric Paris .sessionid = (unsigned int)-1, 104bfef93a5SAl Viro #else 105bfef93a5SAl Viro #define INIT_IDS 106bfef93a5SAl Viro #endif 1073b7391deSSerge E. Hallyn 10828f6569aSPranith Kumar #ifdef CONFIG_PREEMPT_RCU 109a57eb940SPaul E. McKenney #define INIT_TASK_RCU_TREE_PREEMPT() \ 110a57eb940SPaul E. McKenney .rcu_blocked_node = NULL, 111a57eb940SPaul E. McKenney #else 112a57eb940SPaul E. McKenney #define INIT_TASK_RCU_TREE_PREEMPT(tsk) 113a57eb940SPaul E. McKenney #endif 114a57eb940SPaul E. McKenney #ifdef CONFIG_PREEMPT_RCU 115f41d911fSPaul E. McKenney #define INIT_TASK_RCU_PREEMPT(tsk) \ 116f41d911fSPaul E. McKenney .rcu_read_lock_nesting = 0, \ 1171d082fd0SPaul E. McKenney .rcu_read_unlock_special.s = 0, \ 118a57eb940SPaul E. McKenney .rcu_node_entry = LIST_HEAD_INIT(tsk.rcu_node_entry), \ 119abaa93d9SPaul E. McKenney INIT_TASK_RCU_TREE_PREEMPT() 120f41d911fSPaul E. McKenney #else 121f41d911fSPaul E. McKenney #define INIT_TASK_RCU_PREEMPT(tsk) 122f41d911fSPaul E. McKenney #endif 1238315f422SPaul E. McKenney #ifdef CONFIG_TASKS_RCU 1248315f422SPaul E. McKenney #define INIT_TASK_RCU_TASKS(tsk) \ 1258315f422SPaul E. McKenney .rcu_tasks_holdout = false, \ 1268315f422SPaul E. McKenney .rcu_tasks_holdout_list = \ 127176f8f7aSPaul E. McKenney LIST_HEAD_INIT(tsk.rcu_tasks_holdout_list), \ 128176f8f7aSPaul E. McKenney .rcu_tasks_idle_cpu = -1, 1298315f422SPaul E. McKenney #else 1308315f422SPaul E. McKenney #define INIT_TASK_RCU_TASKS(tsk) 1318315f422SPaul E. McKenney #endif 132f41d911fSPaul E. McKenney 133b6dff3ecSDavid Howells extern struct cred init_cred; 134b6dff3ecSDavid Howells 1358323f26cSPeter Zijlstra extern struct task_group root_task_group; 1368323f26cSPeter Zijlstra 1378323f26cSPeter Zijlstra #ifdef CONFIG_CGROUP_SCHED 1388323f26cSPeter Zijlstra # define INIT_CGROUP_SCHED(tsk) \ 1398323f26cSPeter Zijlstra .sched_task_group = &root_task_group, 1408323f26cSPeter Zijlstra #else 1418323f26cSPeter Zijlstra # define INIT_CGROUP_SCHED(tsk) 1428323f26cSPeter Zijlstra #endif 1438323f26cSPeter Zijlstra 144cdd6c482SIngo Molnar #ifdef CONFIG_PERF_EVENTS 145cdd6c482SIngo Molnar # define INIT_PERF_EVENTS(tsk) \ 146cdd6c482SIngo Molnar .perf_event_mutex = \ 147cdd6c482SIngo Molnar __MUTEX_INITIALIZER(tsk.perf_event_mutex), \ 148cdd6c482SIngo Molnar .perf_event_list = LIST_HEAD_INIT(tsk.perf_event_list), 149082ff5a2SPeter Zijlstra #else 150cdd6c482SIngo Molnar # define INIT_PERF_EVENTS(tsk) 151082ff5a2SPeter Zijlstra #endif 152082ff5a2SPeter Zijlstra 1536a61671bSFrederic Weisbecker #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN 1546a61671bSFrederic Weisbecker # define INIT_VTIME(tsk) \ 155b7ce2277SFrederic Weisbecker .vtime_seqcount = SEQCNT_ZERO(tsk.vtime_seqcount), \ 1566a61671bSFrederic Weisbecker .vtime_snap = 0, \ 1576a61671bSFrederic Weisbecker .vtime_snap_whence = VTIME_SYS, 1586a61671bSFrederic Weisbecker #else 1596a61671bSFrederic Weisbecker # define INIT_VTIME(tsk) 1606a61671bSFrederic Weisbecker #endif 1616a61671bSFrederic Weisbecker 162f1c6f1a7SCarsten Emde #define INIT_TASK_COMM "swapper" 163f1c6f1a7SCarsten Emde 164fb00aca4SPeter Zijlstra #ifdef CONFIG_RT_MUTEXES 165fb00aca4SPeter Zijlstra # define INIT_RT_MUTEXES(tsk) \ 166fb00aca4SPeter Zijlstra .pi_waiters = RB_ROOT, \ 167fb00aca4SPeter Zijlstra .pi_waiters_leftmost = NULL, 168fb00aca4SPeter Zijlstra #else 169fb00aca4SPeter Zijlstra # define INIT_RT_MUTEXES(tsk) 170fb00aca4SPeter Zijlstra #endif 171fb00aca4SPeter Zijlstra 172d8b163c4SKirill Tkhai #ifdef CONFIG_NUMA_BALANCING 173d8b163c4SKirill Tkhai # define INIT_NUMA_BALANCING(tsk) \ 174d8b163c4SKirill Tkhai .numa_preferred_nid = -1, \ 175d8b163c4SKirill Tkhai .numa_group = NULL, \ 176d8b163c4SKirill Tkhai .numa_faults = NULL, 177d8b163c4SKirill Tkhai #else 178d8b163c4SKirill Tkhai # define INIT_NUMA_BALANCING(tsk) 179d8b163c4SKirill Tkhai #endif 180d8b163c4SKirill Tkhai 181c420f167SAndrey Ryabinin #ifdef CONFIG_KASAN 182c420f167SAndrey Ryabinin # define INIT_KASAN(tsk) \ 183c420f167SAndrey Ryabinin .kasan_depth = 1, 184c420f167SAndrey Ryabinin #else 185c420f167SAndrey Ryabinin # define INIT_KASAN(tsk) 186c420f167SAndrey Ryabinin #endif 187c420f167SAndrey Ryabinin 188c65eacbeSAndy Lutomirski #ifdef CONFIG_THREAD_INFO_IN_TASK 189*68f24b08SAndy Lutomirski # define INIT_TASK_TI(tsk) \ 190*68f24b08SAndy Lutomirski .thread_info = INIT_THREAD_INFO(tsk), \ 191*68f24b08SAndy Lutomirski .stack_refcount = ATOMIC_INIT(1), 192c65eacbeSAndy Lutomirski #else 193c65eacbeSAndy Lutomirski # define INIT_TASK_TI(tsk) 194c65eacbeSAndy Lutomirski #endif 195c65eacbeSAndy Lutomirski 1961da177e4SLinus Torvalds /* 1971da177e4SLinus Torvalds * INIT_TASK is used to set up the first task table, touch at 1981da177e4SLinus Torvalds * your own risk!. Base=0, limit=0x1fffff (=2MB) 1991da177e4SLinus Torvalds */ 2001da177e4SLinus Torvalds #define INIT_TASK(tsk) \ 2011da177e4SLinus Torvalds { \ 202c65eacbeSAndy Lutomirski INIT_TASK_TI(tsk) \ 2031da177e4SLinus Torvalds .state = 0, \ 2047f1a00b6SLinus Torvalds .stack = init_stack, \ 2051da177e4SLinus Torvalds .usage = ATOMIC_INIT(2), \ 2067b34e428SOleg Nesterov .flags = PF_KTHREAD, \ 2071da177e4SLinus Torvalds .prio = MAX_PRIO-20, \ 2081da177e4SLinus Torvalds .static_prio = MAX_PRIO-20, \ 209b29739f9SIngo Molnar .normal_prio = MAX_PRIO-20, \ 2101da177e4SLinus Torvalds .policy = SCHED_NORMAL, \ 2111da177e4SLinus Torvalds .cpus_allowed = CPU_MASK_ALL, \ 21229baa747SPeter Zijlstra .nr_cpus_allowed= NR_CPUS, \ 2131da177e4SLinus Torvalds .mm = NULL, \ 2141da177e4SLinus Torvalds .active_mm = &init_mm, \ 215f56141e3SAndy Lutomirski .restart_block = { \ 216f56141e3SAndy Lutomirski .fn = do_no_restart_syscall, \ 217f56141e3SAndy Lutomirski }, \ 2184a55bd5eSPeter Zijlstra .se = { \ 2194a55bd5eSPeter Zijlstra .group_node = LIST_HEAD_INIT(tsk.se.group_node), \ 2204a55bd5eSPeter Zijlstra }, \ 221fa717060SPeter Zijlstra .rt = { \ 222fa717060SPeter Zijlstra .run_list = LIST_HEAD_INIT(tsk.rt.run_list), \ 223de5bdff7SHiroshi Shimamoto .time_slice = RR_TIMESLICE, \ 2246f505b16SPeter Zijlstra }, \ 2251da177e4SLinus Torvalds .tasks = LIST_HEAD_INIT(tsk.tasks), \ 226806c09a7SDario Faggioli INIT_PUSHABLE_TASKS(tsk) \ 2278323f26cSPeter Zijlstra INIT_CGROUP_SCHED(tsk) \ 228f470021aSRoland McGrath .ptraced = LIST_HEAD_INIT(tsk.ptraced), \ 229f470021aSRoland McGrath .ptrace_entry = LIST_HEAD_INIT(tsk.ptrace_entry), \ 2301da177e4SLinus Torvalds .real_parent = &tsk, \ 2311da177e4SLinus Torvalds .parent = &tsk, \ 2321da177e4SLinus Torvalds .children = LIST_HEAD_INIT(tsk.children), \ 2331da177e4SLinus Torvalds .sibling = LIST_HEAD_INIT(tsk.sibling), \ 2341da177e4SLinus Torvalds .group_leader = &tsk, \ 235d36cc701SPaul E. McKenney RCU_POINTER_INITIALIZER(real_cred, &init_cred), \ 236d36cc701SPaul E. McKenney RCU_POINTER_INITIALIZER(cred, &init_cred), \ 237f1c6f1a7SCarsten Emde .comm = INIT_TASK_COMM, \ 2381da177e4SLinus Torvalds .thread = INIT_THREAD, \ 2391da177e4SLinus Torvalds .fs = &init_fs, \ 2401da177e4SLinus Torvalds .files = &init_files, \ 2411da177e4SLinus Torvalds .signal = &init_signals, \ 2421da177e4SLinus Torvalds .sighand = &init_sighand, \ 243ab516013SSerge E. Hallyn .nsproxy = &init_nsproxy, \ 2441da177e4SLinus Torvalds .pending = { \ 2451da177e4SLinus Torvalds .list = LIST_HEAD_INIT(tsk.pending.list), \ 2461da177e4SLinus Torvalds .signal = {{0}}}, \ 2471da177e4SLinus Torvalds .blocked = {{0}}, \ 248e4d91918SIngo Molnar .alloc_lock = __SPIN_LOCK_UNLOCKED(tsk.alloc_lock), \ 249b6e3224fSLinus Torvalds .journal_info = NULL, \ 2501da177e4SLinus Torvalds .cpu_timers = INIT_CPU_TIMERS(tsk.cpu_timers), \ 2511d615482SThomas Gleixner .pi_lock = __RAW_SPIN_LOCK_UNLOCKED(tsk.pi_lock), \ 2526976675dSArjan van de Ven .timer_slack_ns = 50000, /* 50 usec default slack */ \ 253820e45dbSSukadev Bhattiprolu .pids = { \ 254820e45dbSSukadev Bhattiprolu [PIDTYPE_PID] = INIT_PID_LINK(PIDTYPE_PID), \ 255820e45dbSSukadev Bhattiprolu [PIDTYPE_PGID] = INIT_PID_LINK(PIDTYPE_PGID), \ 256820e45dbSSukadev Bhattiprolu [PIDTYPE_SID] = INIT_PID_LINK(PIDTYPE_SID), \ 257820e45dbSSukadev Bhattiprolu }, \ 258fa2755e2SOleg Nesterov .thread_group = LIST_HEAD_INIT(tsk.thread_group), \ 2590c740d0aSOleg Nesterov .thread_node = LIST_HEAD_INIT(init_signals.thread_head), \ 260bfef93a5SAl Viro INIT_IDS \ 261cdd6c482SIngo Molnar INIT_PERF_EVENTS(tsk) \ 262de30a2b3SIngo Molnar INIT_TRACE_IRQFLAGS \ 263fbb9ce95SIngo Molnar INIT_LOCKDEP \ 2645ac9f622SSteven Rostedt INIT_FTRACE_GRAPH \ 265261842b7SSteven Rostedt INIT_TRACE_RECURSION \ 266f41d911fSPaul E. McKenney INIT_TASK_RCU_PREEMPT(tsk) \ 2678315f422SPaul E. McKenney INIT_TASK_RCU_TASKS(tsk) \ 2681ca7d67cSJohn Stultz INIT_CPUSET_SEQ(tsk) \ 269fb00aca4SPeter Zijlstra INIT_RT_MUTEXES(tsk) \ 2709d7fb042SPeter Zijlstra INIT_PREV_CPUTIME(tsk) \ 2716a61671bSFrederic Weisbecker INIT_VTIME(tsk) \ 272d8b163c4SKirill Tkhai INIT_NUMA_BALANCING(tsk) \ 273c420f167SAndrey Ryabinin INIT_KASAN(tsk) \ 2741da177e4SLinus Torvalds } 2751da177e4SLinus Torvalds 2761da177e4SLinus Torvalds 2771da177e4SLinus Torvalds #define INIT_CPU_TIMERS(cpu_timers) \ 2781da177e4SLinus Torvalds { \ 2791da177e4SLinus Torvalds LIST_HEAD_INIT(cpu_timers[0]), \ 2801da177e4SLinus Torvalds LIST_HEAD_INIT(cpu_timers[1]), \ 2811da177e4SLinus Torvalds LIST_HEAD_INIT(cpu_timers[2]), \ 2821da177e4SLinus Torvalds } 2831da177e4SLinus Torvalds 284857eceebSTim Abbott /* Attach to the init_task data structure for proper alignment */ 2852af7687fSTim Abbott #define __init_task_data __attribute__((__section__(".data..init_task"))) 286857eceebSTim Abbott 2871da177e4SLinus Torvalds 2881da177e4SLinus Torvalds #endif 289