Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/init/init_task.c
29264 views
1
// SPDX-License-Identifier: GPL-2.0
2
#include <linux/init_task.h>
3
#include <linux/export.h>
4
#include <linux/mqueue.h>
5
#include <linux/sched.h>
6
#include <linux/sched/sysctl.h>
7
#include <linux/sched/rt.h>
8
#include <linux/sched/task.h>
9
#include <linux/sched/ext.h>
10
#include <linux/init.h>
11
#include <linux/fs.h>
12
#include <linux/mm.h>
13
#include <linux/audit.h>
14
#include <linux/numa.h>
15
#include <linux/scs.h>
16
#include <linux/plist.h>
17
18
#include <linux/uaccess.h>
19
20
static struct signal_struct init_signals = {
21
.nr_threads = 1,
22
.thread_head = LIST_HEAD_INIT(init_task.thread_node),
23
.wait_chldexit = __WAIT_QUEUE_HEAD_INITIALIZER(init_signals.wait_chldexit),
24
.shared_pending = {
25
.list = LIST_HEAD_INIT(init_signals.shared_pending.list),
26
.signal = {{0}}
27
},
28
.multiprocess = HLIST_HEAD_INIT,
29
.rlim = INIT_RLIMITS,
30
#ifdef CONFIG_CGROUPS
31
.cgroup_threadgroup_rwsem = __RWSEM_INITIALIZER(init_signals.cgroup_threadgroup_rwsem),
32
#endif
33
.cred_guard_mutex = __MUTEX_INITIALIZER(init_signals.cred_guard_mutex),
34
.exec_update_lock = __RWSEM_INITIALIZER(init_signals.exec_update_lock),
35
#ifdef CONFIG_POSIX_TIMERS
36
.posix_timers = HLIST_HEAD_INIT,
37
.ignored_posix_timers = HLIST_HEAD_INIT,
38
.cputimer = {
39
.cputime_atomic = INIT_CPUTIME_ATOMIC,
40
},
41
#endif
42
INIT_CPU_TIMERS(init_signals)
43
.pids = {
44
[PIDTYPE_PID] = &init_struct_pid,
45
[PIDTYPE_TGID] = &init_struct_pid,
46
[PIDTYPE_PGID] = &init_struct_pid,
47
[PIDTYPE_SID] = &init_struct_pid,
48
},
49
INIT_PREV_CPUTIME(init_signals)
50
};
51
52
static struct sighand_struct init_sighand = {
53
.count = REFCOUNT_INIT(1),
54
.action = { { { .sa_handler = SIG_DFL, } }, },
55
.siglock = __SPIN_LOCK_UNLOCKED(init_sighand.siglock),
56
.signalfd_wqh = __WAIT_QUEUE_HEAD_INITIALIZER(init_sighand.signalfd_wqh),
57
};
58
59
#ifdef CONFIG_SHADOW_CALL_STACK
60
unsigned long init_shadow_call_stack[SCS_SIZE / sizeof(long)] = {
61
[(SCS_SIZE / sizeof(long)) - 1] = SCS_END_MAGIC
62
};
63
#endif
64
65
/*
66
* Set up the first task table, touch at your own risk!. Base=0,
67
* limit=0x1fffff (=2MB)
68
*/
69
struct task_struct init_task __aligned(L1_CACHE_BYTES) = {
70
#ifdef CONFIG_THREAD_INFO_IN_TASK
71
.thread_info = INIT_THREAD_INFO(init_task),
72
.stack_refcount = REFCOUNT_INIT(1),
73
#endif
74
.__state = 0,
75
.stack = init_stack,
76
.usage = REFCOUNT_INIT(2),
77
.flags = PF_KTHREAD,
78
.prio = MAX_PRIO - 20,
79
.static_prio = MAX_PRIO - 20,
80
.normal_prio = MAX_PRIO - 20,
81
.policy = SCHED_NORMAL,
82
.cpus_ptr = &init_task.cpus_mask,
83
.user_cpus_ptr = NULL,
84
.cpus_mask = CPU_MASK_ALL,
85
.max_allowed_capacity = SCHED_CAPACITY_SCALE,
86
.nr_cpus_allowed= NR_CPUS,
87
.mm = NULL,
88
.active_mm = &init_mm,
89
.faults_disabled_mapping = NULL,
90
.restart_block = {
91
.fn = do_no_restart_syscall,
92
},
93
.se = {
94
.group_node = LIST_HEAD_INIT(init_task.se.group_node),
95
},
96
.rt = {
97
.run_list = LIST_HEAD_INIT(init_task.rt.run_list),
98
.time_slice = RR_TIMESLICE,
99
},
100
.tasks = LIST_HEAD_INIT(init_task.tasks),
101
#ifdef CONFIG_SMP
102
.pushable_tasks = PLIST_NODE_INIT(init_task.pushable_tasks, MAX_PRIO),
103
#endif
104
#ifdef CONFIG_CGROUP_SCHED
105
.sched_task_group = &root_task_group,
106
#endif
107
#ifdef CONFIG_SCHED_CLASS_EXT
108
.scx = {
109
.dsq_list.node = LIST_HEAD_INIT(init_task.scx.dsq_list.node),
110
.sticky_cpu = -1,
111
.holding_cpu = -1,
112
.runnable_node = LIST_HEAD_INIT(init_task.scx.runnable_node),
113
.runnable_at = INITIAL_JIFFIES,
114
.ddsp_dsq_id = SCX_DSQ_INVALID,
115
.slice = SCX_SLICE_DFL,
116
},
117
#endif
118
.ptraced = LIST_HEAD_INIT(init_task.ptraced),
119
.ptrace_entry = LIST_HEAD_INIT(init_task.ptrace_entry),
120
.real_parent = &init_task,
121
.parent = &init_task,
122
.children = LIST_HEAD_INIT(init_task.children),
123
.sibling = LIST_HEAD_INIT(init_task.sibling),
124
.group_leader = &init_task,
125
RCU_POINTER_INITIALIZER(real_cred, &init_cred),
126
RCU_POINTER_INITIALIZER(cred, &init_cred),
127
.comm = INIT_TASK_COMM,
128
.thread = INIT_THREAD,
129
.fs = &init_fs,
130
.files = &init_files,
131
#ifdef CONFIG_IO_URING
132
.io_uring = NULL,
133
#endif
134
.signal = &init_signals,
135
.sighand = &init_sighand,
136
.nsproxy = &init_nsproxy,
137
.pending = {
138
.list = LIST_HEAD_INIT(init_task.pending.list),
139
.signal = {{0}}
140
},
141
.blocked = {{0}},
142
.alloc_lock = __SPIN_LOCK_UNLOCKED(init_task.alloc_lock),
143
.journal_info = NULL,
144
INIT_CPU_TIMERS(init_task)
145
.pi_lock = __RAW_SPIN_LOCK_UNLOCKED(init_task.pi_lock),
146
.timer_slack_ns = 50000, /* 50 usec default slack */
147
.thread_pid = &init_struct_pid,
148
.thread_node = LIST_HEAD_INIT(init_signals.thread_head),
149
#ifdef CONFIG_AUDIT
150
.loginuid = INVALID_UID,
151
.sessionid = AUDIT_SID_UNSET,
152
#endif
153
#ifdef CONFIG_PERF_EVENTS
154
.perf_event_mutex = __MUTEX_INITIALIZER(init_task.perf_event_mutex),
155
.perf_event_list = LIST_HEAD_INIT(init_task.perf_event_list),
156
#endif
157
#ifdef CONFIG_PREEMPT_RCU
158
.rcu_read_lock_nesting = 0,
159
.rcu_read_unlock_special.s = 0,
160
.rcu_node_entry = LIST_HEAD_INIT(init_task.rcu_node_entry),
161
.rcu_blocked_node = NULL,
162
#endif
163
#ifdef CONFIG_TASKS_RCU
164
.rcu_tasks_holdout = false,
165
.rcu_tasks_holdout_list = LIST_HEAD_INIT(init_task.rcu_tasks_holdout_list),
166
.rcu_tasks_idle_cpu = -1,
167
.rcu_tasks_exit_list = LIST_HEAD_INIT(init_task.rcu_tasks_exit_list),
168
#endif
169
#ifdef CONFIG_TASKS_TRACE_RCU
170
.trc_reader_nesting = 0,
171
.trc_reader_special.s = 0,
172
.trc_holdout_list = LIST_HEAD_INIT(init_task.trc_holdout_list),
173
.trc_blkd_node = LIST_HEAD_INIT(init_task.trc_blkd_node),
174
#endif
175
#ifdef CONFIG_CPUSETS
176
.mems_allowed_seq = SEQCNT_SPINLOCK_ZERO(init_task.mems_allowed_seq,
177
&init_task.alloc_lock),
178
#endif
179
#ifdef CONFIG_RT_MUTEXES
180
.pi_waiters = RB_ROOT_CACHED,
181
.pi_top_task = NULL,
182
#endif
183
INIT_PREV_CPUTIME(init_task)
184
#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN
185
.vtime.seqcount = SEQCNT_ZERO(init_task.vtime_seqcount),
186
.vtime.starttime = 0,
187
.vtime.state = VTIME_SYS,
188
#endif
189
#ifdef CONFIG_NUMA_BALANCING
190
.numa_preferred_nid = NUMA_NO_NODE,
191
.numa_group = NULL,
192
.numa_faults = NULL,
193
#endif
194
#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)
195
.kasan_depth = 1,
196
#endif
197
#ifdef CONFIG_KCSAN
198
.kcsan_ctx = {
199
.scoped_accesses = {LIST_POISON1, NULL},
200
},
201
#endif
202
#ifdef CONFIG_TRACE_IRQFLAGS
203
.softirqs_enabled = 1,
204
#endif
205
#ifdef CONFIG_LOCKDEP
206
.lockdep_depth = 0, /* no locks held yet */
207
.curr_chain_key = INITIAL_CHAIN_KEY,
208
.lockdep_recursion = 0,
209
#endif
210
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
211
.ret_stack = NULL,
212
.tracing_graph_pause = ATOMIC_INIT(0),
213
#endif
214
#if defined(CONFIG_TRACING) && defined(CONFIG_PREEMPTION)
215
.trace_recursion = 0,
216
#endif
217
#ifdef CONFIG_LIVEPATCH
218
.patch_state = KLP_TRANSITION_IDLE,
219
#endif
220
#ifdef CONFIG_SECURITY
221
.security = NULL,
222
#endif
223
#ifdef CONFIG_SECCOMP_FILTER
224
.seccomp = { .filter_count = ATOMIC_INIT(0) },
225
#endif
226
};
227
EXPORT_SYMBOL(init_task);
228
229
/*
230
* Initial thread structure. Alignment of this is handled by a special
231
* linker map entry.
232
*/
233
#ifndef CONFIG_THREAD_INFO_IN_TASK
234
struct thread_info init_thread_info __init_thread_info = INIT_THREAD_INFO(init_task);
235
#endif
236
237