linux/include/linux/init_task.h
<<
>>
Prefs
   1#ifndef _LINUX__INIT_TASK_H
   2#define _LINUX__INIT_TASK_H
   3
   4#include <linux/rcupdate.h>
   5#include <linux/irqflags.h>
   6#include <linux/utsname.h>
   7#include <linux/lockdep.h>
   8#include <linux/ftrace.h>
   9#include <linux/ipc.h>
  10#include <linux/pid_namespace.h>
  11#include <linux/user_namespace.h>
  12#include <linux/securebits.h>
  13#include <linux/seqlock.h>
  14#include <linux/rbtree.h>
  15#include <linux/sched/autogroup.h>
  16#include <net/net_namespace.h>
  17#include <linux/sched/rt.h>
  18#include <linux/livepatch.h>
  19#include <linux/mm_types.h>
  20
  21#include <asm/thread_info.h>
  22
  23#ifdef CONFIG_SMP
  24# define INIT_PUSHABLE_TASKS(tsk)                                       \
  25        .pushable_tasks = PLIST_NODE_INIT(tsk.pushable_tasks, MAX_PRIO),
  26#else
  27# define INIT_PUSHABLE_TASKS(tsk)
  28#endif
  29
  30extern struct files_struct init_files;
  31extern struct fs_struct init_fs;
  32
  33#ifdef CONFIG_CPUSETS
  34#define INIT_CPUSET_SEQ(tsk)                                                    \
  35        .mems_allowed_seq = SEQCNT_ZERO(tsk.mems_allowed_seq),
  36#else
  37#define INIT_CPUSET_SEQ(tsk)
  38#endif
  39
  40#ifndef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
  41#define INIT_PREV_CPUTIME(x)    .prev_cputime = {                       \
  42        .lock = __RAW_SPIN_LOCK_UNLOCKED(x.prev_cputime.lock),          \
  43},
  44#else
  45#define INIT_PREV_CPUTIME(x)
  46#endif
  47
  48#ifdef CONFIG_POSIX_TIMERS
  49#define INIT_POSIX_TIMERS(s)                                            \
  50        .posix_timers = LIST_HEAD_INIT(s.posix_timers),
  51#define INIT_CPU_TIMERS(s)                                              \
  52        .cpu_timers = {                                                 \
  53                LIST_HEAD_INIT(s.cpu_timers[0]),                        \
  54                LIST_HEAD_INIT(s.cpu_timers[1]),                        \
  55                LIST_HEAD_INIT(s.cpu_timers[2]),                                                                \
  56        },
  57#define INIT_CPUTIMER(s)                                                \
  58        .cputimer       = {                                             \
  59                .cputime_atomic = INIT_CPUTIME_ATOMIC,                  \
  60                .running        = false,                                \
  61                .checking_timer = false,                                \
  62        },
  63#else
  64#define INIT_POSIX_TIMERS(s)
  65#define INIT_CPU_TIMERS(s)
  66#define INIT_CPUTIMER(s)
  67#endif
  68
  69#define INIT_SIGNALS(sig) {                                             \
  70        .nr_threads     = 1,                                            \
  71        .thread_head    = LIST_HEAD_INIT(init_task.thread_node),        \
  72        .wait_chldexit  = __WAIT_QUEUE_HEAD_INITIALIZER(sig.wait_chldexit),\
  73        .shared_pending = {                                             \
  74                .list = LIST_HEAD_INIT(sig.shared_pending.list),        \
  75                .signal =  {{0}}},                                      \
  76        INIT_POSIX_TIMERS(sig)                                          \
  77        INIT_CPU_TIMERS(sig)                                            \
  78        .rlim           = INIT_RLIMITS,                                 \
  79        INIT_CPUTIMER(sig)                                              \
  80        INIT_PREV_CPUTIME(sig)                                          \
  81        .cred_guard_mutex =                                             \
  82                 __MUTEX_INITIALIZER(sig.cred_guard_mutex),             \
  83}
  84
  85extern struct nsproxy init_nsproxy;
  86
  87#define INIT_SIGHAND(sighand) {                                         \
  88        .count          = ATOMIC_INIT(1),                               \
  89        .action         = { { { .sa_handler = SIG_DFL, } }, },          \
  90        .siglock        = __SPIN_LOCK_UNLOCKED(sighand.siglock),        \
  91        .signalfd_wqh   = __WAIT_QUEUE_HEAD_INITIALIZER(sighand.signalfd_wqh),  \
  92}
  93
  94extern struct group_info init_groups;
  95
  96#define INIT_STRUCT_PID {                                               \
  97        .count          = ATOMIC_INIT(1),                               \
  98        .tasks          = {                                             \
  99                { .first = NULL },                                      \
 100                { .first = NULL },                                      \
 101                { .first = NULL },                                      \
 102        },                                                              \
 103        .level          = 0,                                            \
 104        .numbers        = { {                                           \
 105                .nr             = 0,                                    \
 106                .ns             = &init_pid_ns,                         \
 107                .pid_chain      = { .next = NULL, .pprev = NULL },      \
 108        }, }                                                            \
 109}
 110
 111#define INIT_PID_LINK(type)                                     \
 112{                                                               \
 113        .node = {                                               \
 114                .next = NULL,                                   \
 115                .pprev = NULL,                                  \
 116        },                                                      \
 117        .pid = &init_struct_pid,                                \
 118}
 119
 120#ifdef CONFIG_AUDITSYSCALL
 121#define INIT_IDS \
 122        .loginuid = INVALID_UID, \
 123        .sessionid = (unsigned int)-1,
 124#else
 125#define INIT_IDS
 126#endif
 127
 128#ifdef CONFIG_PREEMPT_RCU
 129#define INIT_TASK_RCU_TREE_PREEMPT()                                    \
 130        .rcu_blocked_node = NULL,
 131#else
 132#define INIT_TASK_RCU_TREE_PREEMPT(tsk)
 133#endif
 134#ifdef CONFIG_PREEMPT_RCU
 135#define INIT_TASK_RCU_PREEMPT(tsk)                                      \
 136        .rcu_read_lock_nesting = 0,                                     \
 137        .rcu_read_unlock_special.s = 0,                                 \
 138        .rcu_node_entry = LIST_HEAD_INIT(tsk.rcu_node_entry),           \
 139        INIT_TASK_RCU_TREE_PREEMPT()
 140#else
 141#define INIT_TASK_RCU_PREEMPT(tsk)
 142#endif
 143#ifdef CONFIG_TASKS_RCU
 144#define INIT_TASK_RCU_TASKS(tsk)                                        \
 145        .rcu_tasks_holdout = false,                                     \
 146        .rcu_tasks_holdout_list =                                       \
 147                LIST_HEAD_INIT(tsk.rcu_tasks_holdout_list),             \
 148        .rcu_tasks_idle_cpu = -1,
 149#else
 150#define INIT_TASK_RCU_TASKS(tsk)
 151#endif
 152
 153extern struct cred init_cred;
 154
 155#ifdef CONFIG_CGROUP_SCHED
 156# define INIT_CGROUP_SCHED(tsk)                                         \
 157        .sched_task_group = &root_task_group,
 158#else
 159# define INIT_CGROUP_SCHED(tsk)
 160#endif
 161
 162#ifdef CONFIG_PERF_EVENTS
 163# define INIT_PERF_EVENTS(tsk)                                          \
 164        .perf_event_mutex =                                             \
 165                 __MUTEX_INITIALIZER(tsk.perf_event_mutex),             \
 166        .perf_event_list = LIST_HEAD_INIT(tsk.perf_event_list),
 167#else
 168# define INIT_PERF_EVENTS(tsk)
 169#endif
 170
 171#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN
 172# define INIT_VTIME(tsk)                                                \
 173        .vtime_seqcount = SEQCNT_ZERO(tsk.vtime_seqcount),      \
 174        .vtime_snap = 0,                                \
 175        .vtime_snap_whence = VTIME_SYS,
 176#else
 177# define INIT_VTIME(tsk)
 178#endif
 179
 180#define INIT_TASK_COMM "swapper"
 181
 182#ifdef CONFIG_RT_MUTEXES
 183# define INIT_RT_MUTEXES(tsk)                                           \
 184        .pi_waiters = RB_ROOT,                                          \
 185        .pi_top_task = NULL,                                            \
 186        .pi_waiters_leftmost = NULL,
 187#else
 188# define INIT_RT_MUTEXES(tsk)
 189#endif
 190
 191#ifdef CONFIG_NUMA_BALANCING
 192# define INIT_NUMA_BALANCING(tsk)                                       \
 193        .numa_preferred_nid = -1,                                       \
 194        .numa_group = NULL,                                             \
 195        .numa_faults = NULL,
 196#else
 197# define INIT_NUMA_BALANCING(tsk)
 198#endif
 199
 200#ifdef CONFIG_KASAN
 201# define INIT_KASAN(tsk)                                                \
 202        .kasan_depth = 1,
 203#else
 204# define INIT_KASAN(tsk)
 205#endif
 206
 207#ifdef CONFIG_LIVEPATCH
 208# define INIT_LIVEPATCH(tsk)                                            \
 209        .patch_state = KLP_UNDEFINED,
 210#else
 211# define INIT_LIVEPATCH(tsk)
 212#endif
 213
 214#ifdef CONFIG_THREAD_INFO_IN_TASK
 215# define INIT_TASK_TI(tsk)                      \
 216        .thread_info = INIT_THREAD_INFO(tsk),   \
 217        .stack_refcount = ATOMIC_INIT(1),
 218#else
 219# define INIT_TASK_TI(tsk)
 220#endif
 221
 222#ifdef CONFIG_SECURITY
 223#define INIT_TASK_SECURITY .security = NULL,
 224#else
 225#define INIT_TASK_SECURITY
 226#endif
 227
 228/*
 229 *  INIT_TASK is used to set up the first task table, touch at
 230 * your own risk!. Base=0, limit=0x1fffff (=2MB)
 231 */
 232#define INIT_TASK(tsk)  \
 233{                                                                       \
 234        INIT_TASK_TI(tsk)                                               \
 235        .state          = 0,                                            \
 236        .stack          = init_stack,                                   \
 237        .usage          = ATOMIC_INIT(2),                               \
 238        .flags          = PF_KTHREAD,                                   \
 239        .prio           = MAX_PRIO-20,                                  \
 240        .static_prio    = MAX_PRIO-20,                                  \
 241        .normal_prio    = MAX_PRIO-20,                                  \
 242        .policy         = SCHED_NORMAL,                                 \
 243        .cpus_allowed   = CPU_MASK_ALL,                                 \
 244        .nr_cpus_allowed= NR_CPUS,                                      \
 245        .mm             = NULL,                                         \
 246        .active_mm      = &init_mm,                                     \
 247        .restart_block = {                                              \
 248                .fn = do_no_restart_syscall,                            \
 249        },                                                              \
 250        .se             = {                                             \
 251                .group_node     = LIST_HEAD_INIT(tsk.se.group_node),    \
 252        },                                                              \
 253        .rt             = {                                             \
 254                .run_list       = LIST_HEAD_INIT(tsk.rt.run_list),      \
 255                .time_slice     = RR_TIMESLICE,                         \
 256        },                                                              \
 257        .tasks          = LIST_HEAD_INIT(tsk.tasks),                    \
 258        INIT_PUSHABLE_TASKS(tsk)                                        \
 259        INIT_CGROUP_SCHED(tsk)                                          \
 260        .ptraced        = LIST_HEAD_INIT(tsk.ptraced),                  \
 261        .ptrace_entry   = LIST_HEAD_INIT(tsk.ptrace_entry),             \
 262        .real_parent    = &tsk,                                         \
 263        .parent         = &tsk,                                         \
 264        .children       = LIST_HEAD_INIT(tsk.children),                 \
 265        .sibling        = LIST_HEAD_INIT(tsk.sibling),                  \
 266        .group_leader   = &tsk,                                         \
 267        RCU_POINTER_INITIALIZER(real_cred, &init_cred),                 \
 268        RCU_POINTER_INITIALIZER(cred, &init_cred),                      \
 269        .comm           = INIT_TASK_COMM,                               \
 270        .thread         = INIT_THREAD,                                  \
 271        .fs             = &init_fs,                                     \
 272        .files          = &init_files,                                  \
 273        .signal         = &init_signals,                                \
 274        .sighand        = &init_sighand,                                \
 275        .nsproxy        = &init_nsproxy,                                \
 276        .pending        = {                                             \
 277                .list = LIST_HEAD_INIT(tsk.pending.list),               \
 278                .signal = {{0}}},                                       \
 279        .blocked        = {{0}},                                        \
 280        .alloc_lock     = __SPIN_LOCK_UNLOCKED(tsk.alloc_lock),         \
 281        .journal_info   = NULL,                                         \
 282        INIT_CPU_TIMERS(tsk)                                            \
 283        .pi_lock        = __RAW_SPIN_LOCK_UNLOCKED(tsk.pi_lock),        \
 284        .timer_slack_ns = 50000, /* 50 usec default slack */            \
 285        .pids = {                                                       \
 286                [PIDTYPE_PID]  = INIT_PID_LINK(PIDTYPE_PID),            \
 287                [PIDTYPE_PGID] = INIT_PID_LINK(PIDTYPE_PGID),           \
 288                [PIDTYPE_SID]  = INIT_PID_LINK(PIDTYPE_SID),            \
 289        },                                                              \
 290        .thread_group   = LIST_HEAD_INIT(tsk.thread_group),             \
 291        .thread_node    = LIST_HEAD_INIT(init_signals.thread_head),     \
 292        INIT_IDS                                                        \
 293        INIT_PERF_EVENTS(tsk)                                           \
 294        INIT_TRACE_IRQFLAGS                                             \
 295        INIT_LOCKDEP                                                    \
 296        INIT_FTRACE_GRAPH                                               \
 297        INIT_TRACE_RECURSION                                            \
 298        INIT_TASK_RCU_PREEMPT(tsk)                                      \
 299        INIT_TASK_RCU_TASKS(tsk)                                        \
 300        INIT_CPUSET_SEQ(tsk)                                            \
 301        INIT_RT_MUTEXES(tsk)                                            \
 302        INIT_PREV_CPUTIME(tsk)                                          \
 303        INIT_VTIME(tsk)                                                 \
 304        INIT_NUMA_BALANCING(tsk)                                        \
 305        INIT_KASAN(tsk)                                                 \
 306        INIT_LIVEPATCH(tsk)                                             \
 307        INIT_TASK_SECURITY                                              \
 308}
 309
 310
 311/* Attach to the init_task data structure for proper alignment */
 312#define __init_task_data __attribute__((__section__(".data..init_task")))
 313
 314
 315#endif
 316