init_task out-of-lining

-----BEGIN PGP SIGNATURE-----
 
 iQIVAwUAWl80tvSw1s6N8H32AQJq8A//ViRN5fExrd678Eh2Bz1ytrJYMUfYY3Hv
 QTH5TH9zFyLFyWLB1Iwe13sdLVTTM88O0qcDb54Lx9fWUqeMZyYvBhLtWPc00lTU
 0m3EyYR87MFWaEV+VxaVWgWaWkMDkd39KubDitcS+YIBDszTuMpYodhPUsgLt7lr
 pePX7eurXKdQPTh4NUOjGA2NaZot3tga76J6D8NKruGYUstQCGxpP1ryiFfACnwf
 NLWNO8ZBMtlDwX1mHYOOMFMaBzFzXorPm7jY4HJDf3mUM84xI3ach6CuH9RTSzfq
 A+qB1U3QILPVFo2HtqOHui4bFjRwqOf6uIrI/KcnioJ37w1O+KFcMJeDnX2I211q
 f2lXehJLQA7kPmxQw8T3//HDRaLXc0Qxt7IPZRFinrlkcN4oh3DD5euMfCFBSoZG
 PTbjxlgMfzJPoZtqAcy0rV5L54a/F4h915OQPJCKLwujIsXD2nT993vNmGDyq4zh
 BzNMxSXJC8p+jYvQpNhWyyxwDBBT/YsVQo/ACwg4eJnD3blVTAioRT9ZZcAcsY0F
 0z1eWW5RiknzIaXQWvjfK0gYKpO+aMSu9+gipHfMbU3yXG+sPj/H6zAHYzqX3uQZ
 jb5Iujjnu49W/YD+RiMenuu59lNXUnLSeRnlV7dw0qxGK1FzGo24+ZzKFhJhKvzG
 tdfUsev1Mc8=
 =jhWg
 -----END PGP SIGNATURE-----

Merge tag 'init_task-20180117' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs

Pull init_task initializer cleanups from David Howells:
 "It doesn't seem useful to have the init_task in a header file rather
  than in a normal source file. We could consolidate init_task handling
  instead and expand out various macros.

  Here's a series of patches that consolidate init_task handling:

   (1) Make THREAD_SIZE available to vmlinux.lds for cris, hexagon and
       openrisc.

   (2) Alter the INIT_TASK_DATA linker script macro to set
       init_thread_union and init_stack rather than defining these in C.

       Insert init_task and init_thread_into into the init_stack area in
       the linker script as appropriate to the configuration, with
       different section markers so that they end up correctly ordered.

       We can then get merge ia64's init_task.c into the main one.

       We then have a bunch of single-use INIT_*() macros that seem only
       to be macros because they used to be used per-arch. We can then
       expand these in place of the user and get rid of a few lines and
       a lot of backslashes.

   (3) Expand INIT_TASK() in place.

   (4) Expand in place various small INIT_*() macros that are defined
       conditionally. Expand them and surround them by #if[n]def/#endif
       in the .c file as it takes fewer lines.

   (5) Expand INIT_SIGNALS() and INIT_SIGHAND() in place.

   (6) Expand INIT_STRUCT_PID in place.

  These macros can then be discarded"

* tag 'init_task-20180117' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs:
  Expand INIT_STRUCT_PID and remove
  Expand the INIT_SIGNALS and INIT_SIGHAND macros and remove
  Expand various INIT_* macros and remove
  Expand INIT_TASK() in init/init_task.c and remove
  Construct init thread stack in the linker script rather than by union
  openrisc: Make THREAD_SIZE available to vmlinux.lds
  hexagon: Make THREAD_SIZE available to vmlinux.lds
  cris: Make THREAD_SIZE available to vmlinux.lds
This commit is contained in:
Linus Torvalds 2018-01-29 09:08:34 -08:00
commit 49f9c3552c
57 changed files with 230 additions and 431 deletions

View File

@ -234,8 +234,8 @@ config ARCH_HAS_FORTIFY_SOURCE
config ARCH_HAS_SET_MEMORY config ARCH_HAS_SET_MEMORY
bool bool
# Select if arch init_task initializer is different to init/init_task.c # Select if arch init_task must go in the __init_task_data section
config ARCH_INIT_TASK config ARCH_TASK_STRUCT_ON_STACK
bool bool
# Select if arch has its private alloc_task_struct() function # Select if arch has its private alloc_task_struct() function

View File

@ -39,9 +39,6 @@ struct thread_info {
.preempt_count = INIT_PREEMPT_COUNT, \ .preempt_count = INIT_PREEMPT_COUNT, \
} }
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack)
/* How to get the thread information struct from C. */ /* How to get the thread information struct from C. */
register struct thread_info *__current_thread_info __asm__("$8"); register struct thread_info *__current_thread_info __asm__("$8");
#define current_thread_info() __current_thread_info #define current_thread_info() __current_thread_info

View File

@ -62,9 +62,6 @@ struct thread_info {
.addr_limit = KERNEL_DS, \ .addr_limit = KERNEL_DS, \
} }
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack)
static inline __attribute_const__ struct thread_info *current_thread_info(void) static inline __attribute_const__ struct thread_info *current_thread_info(void)
{ {
register unsigned long sp asm("sp"); register unsigned long sp asm("sp");

View File

@ -75,9 +75,6 @@ struct thread_info {
.addr_limit = KERNEL_DS, \ .addr_limit = KERNEL_DS, \
} }
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack)
/* /*
* how to get the current stack pointer in C * how to get the current stack pointer in C
*/ */

View File

@ -51,8 +51,6 @@ struct thread_info {
.addr_limit = KERNEL_DS, \ .addr_limit = KERNEL_DS, \
} }
#define init_stack (init_thread_union.stack)
#define thread_saved_pc(tsk) \ #define thread_saved_pc(tsk) \
((unsigned long)(tsk->thread.cpu_context.pc)) ((unsigned long)(tsk->thread.cpu_context.pc))
#define thread_saved_sp(tsk) \ #define thread_saved_sp(tsk) \

View File

@ -56,8 +56,6 @@ struct thread_info {
.cpu = 0, \ .cpu = 0, \
.preempt_count = INIT_PREEMPT_COUNT, \ .preempt_count = INIT_PREEMPT_COUNT, \
} }
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack)
/* Given a task stack pointer, you can find its corresponding /* Given a task stack pointer, you can find its corresponding
* thread_info structure just by masking it to the THREAD_SIZE * thread_info structure just by masking it to the THREAD_SIZE

View File

@ -60,9 +60,6 @@ struct thread_info {
.addr_limit = KERNEL_DS, \ .addr_limit = KERNEL_DS, \
} }
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack)
/* get the thread information struct of current task */ /* get the thread information struct of current task */
static inline __attribute__((const)) static inline __attribute__((const))
struct thread_info *current_thread_info(void) struct thread_info *current_thread_info(void)

View File

@ -26,13 +26,6 @@ struct task_struct;
*/ */
#define TASK_UNMAPPED_BASE (PAGE_ALIGN(TASK_SIZE / 3)) #define TASK_UNMAPPED_BASE (PAGE_ALIGN(TASK_SIZE / 3))
/* THREAD_SIZE is the size of the thread_info/kernel_stack combo.
* normally, the stack is found by doing something like p + THREAD_SIZE
* in CRIS, a page is 8192 bytes, which seems like a sane size
*/
#define THREAD_SIZE PAGE_SIZE
#define THREAD_SIZE_ORDER (0)
/* /*
* At user->kernel entry, the pt_regs struct is stacked on the top of the kernel-stack. * At user->kernel entry, the pt_regs struct is stacked on the top of the kernel-stack.
* This macro allows us to find those regs for a task. * This macro allows us to find those regs for a task.
@ -59,8 +52,6 @@ static inline void release_thread(struct task_struct *dead_task)
/* Nothing needs to be done. */ /* Nothing needs to be done. */
} }
#define init_stack (init_thread_union.stack)
#define cpu_relax() barrier() #define cpu_relax() barrier()
void default_idle(void); void default_idle(void);

View File

@ -20,6 +20,13 @@
#endif #endif
/* THREAD_SIZE is the size of the thread_info/kernel_stack combo.
* normally, the stack is found by doing something like p + THREAD_SIZE
* in CRIS, a page is 8192 bytes, which seems like a sane size
*/
#define THREAD_SIZE PAGE_SIZE
#define THREAD_SIZE_ORDER (0)
/* /*
* low level task data that entry.S needs immediate access to * low level task data that entry.S needs immediate access to
* - this struct should fit entirely inside of one cache line * - this struct should fit entirely inside of one cache line
@ -56,8 +63,6 @@ struct thread_info {
.addr_limit = KERNEL_DS, \ .addr_limit = KERNEL_DS, \
} }
#define init_thread_info (init_thread_union.thread_info)
#endif /* !__ASSEMBLY__ */ #endif /* !__ASSEMBLY__ */
/* /*

View File

@ -11,6 +11,7 @@
#include <asm-generic/vmlinux.lds.h> #include <asm-generic/vmlinux.lds.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/thread_info.h>
#ifdef CONFIG_ETRAX_VMEM_SIZE #ifdef CONFIG_ETRAX_VMEM_SIZE
#define __CONFIG_ETRAX_VMEM_SIZE CONFIG_ETRAX_VMEM_SIZE #define __CONFIG_ETRAX_VMEM_SIZE CONFIG_ETRAX_VMEM_SIZE

View File

@ -64,9 +64,6 @@ struct thread_info {
.addr_limit = KERNEL_DS, \ .addr_limit = KERNEL_DS, \
} }
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack)
/* how to get the thread information struct from C */ /* how to get the thread information struct from C */
register struct thread_info *__current_thread_info asm("gr15"); register struct thread_info *__current_thread_info asm("gr15");

View File

@ -46,9 +46,6 @@ struct thread_info {
.addr_limit = KERNEL_DS, \ .addr_limit = KERNEL_DS, \
} }
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack)
/* how to get the thread information struct from C */ /* how to get the thread information struct from C */
static inline struct thread_info *current_thread_info(void) static inline struct thread_info *current_thread_info(void)
{ {

View File

@ -84,9 +84,6 @@ struct thread_info {
.regs = NULL, \ .regs = NULL, \
} }
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack)
/* Tacky preprocessor trickery */ /* Tacky preprocessor trickery */
#define qqstr(s) qstr(s) #define qqstr(s) qstr(s)
#define qstr(s) #s #define qstr(s) #s

View File

@ -22,6 +22,8 @@
#include <asm/asm-offsets.h> /* Most of the kernel defines are here */ #include <asm/asm-offsets.h> /* Most of the kernel defines are here */
#include <asm/mem-layout.h> /* except for page_offset */ #include <asm/mem-layout.h> /* except for page_offset */
#include <asm/cache.h> /* and now we're pulling cache line size */ #include <asm/cache.h> /* and now we're pulling cache line size */
#include <asm/thread_info.h> /* and we need THREAD_SIZE too */
OUTPUT_ARCH(hexagon) OUTPUT_ARCH(hexagon)
ENTRY(stext) ENTRY(stext)

View File

@ -43,7 +43,7 @@ config IA64
select ARCH_HAVE_NMI_SAFE_CMPXCHG select ARCH_HAVE_NMI_SAFE_CMPXCHG
select GENERIC_IOMAP select GENERIC_IOMAP
select GENERIC_SMP_IDLE_THREAD select GENERIC_SMP_IDLE_THREAD
select ARCH_INIT_TASK select ARCH_TASK_STRUCT_ON_STACK
select ARCH_TASK_STRUCT_ALLOCATOR select ARCH_TASK_STRUCT_ALLOCATOR
select ARCH_THREAD_STACK_ALLOCATOR select ARCH_THREAD_STACK_ALLOCATOR
select ARCH_CLOCKSOURCE_DATA select ARCH_CLOCKSOURCE_DATA

View File

@ -42,7 +42,7 @@ $(error Sorry, you need a newer version of the assember, one that is built from
endif endif
KBUILD_CFLAGS += $(cflags-y) KBUILD_CFLAGS += $(cflags-y)
head-y := arch/ia64/kernel/head.o arch/ia64/kernel/init_task.o head-y := arch/ia64/kernel/head.o
libs-y += arch/ia64/lib/ libs-y += arch/ia64/lib/
core-y += arch/ia64/kernel/ arch/ia64/mm/ core-y += arch/ia64/kernel/ arch/ia64/mm/

View File

@ -12,6 +12,8 @@
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/ptrace.h> #include <asm/ptrace.h>
#define THREAD_SIZE KERNEL_STACK_SIZE
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
/* /*
@ -41,8 +43,6 @@ struct thread_info {
#endif #endif
}; };
#define THREAD_SIZE KERNEL_STACK_SIZE
#define INIT_THREAD_INFO(tsk) \ #define INIT_THREAD_INFO(tsk) \
{ \ { \
.task = &tsk, \ .task = &tsk, \

View File

@ -7,7 +7,7 @@ ifdef CONFIG_DYNAMIC_FTRACE
CFLAGS_REMOVE_ftrace.o = -pg CFLAGS_REMOVE_ftrace.o = -pg
endif endif
extra-y := head.o init_task.o vmlinux.lds extra-y := head.o vmlinux.lds
obj-y := entry.o efi.o efi_stub.o gate-data.o fsys.o ia64_ksyms.o irq.o irq_ia64.o \ obj-y := entry.o efi.o efi_stub.o gate-data.o fsys.o ia64_ksyms.o irq.o irq_ia64.o \
irq_lsapic.o ivt.o machvec.o pal.o patch.o process.o perfmon.o ptrace.o sal.o \ irq_lsapic.o ivt.o machvec.o pal.o patch.o process.o perfmon.o ptrace.o sal.o \

View File

@ -1,44 +0,0 @@
// SPDX-License-Identifier: GPL-2.0
/*
* This is where we statically allocate and initialize the initial
* task.
*
* Copyright (C) 1999, 2002-2003 Hewlett-Packard Co
* David Mosberger-Tang <davidm@hpl.hp.com>
*/
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/init_task.h>
#include <linux/mqueue.h>
#include <linux/uaccess.h>
#include <asm/pgtable.h>
static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
/*
* Initial task structure.
*
* We need to make sure that this is properly aligned due to the way process stacks are
* handled. This is done by having a special ".data..init_task" section...
*/
#define init_thread_info init_task_mem.s.thread_info
#define init_stack init_task_mem.stack
union {
struct {
struct task_struct task;
struct thread_info thread_info;
} s;
unsigned long stack[KERNEL_STACK_SIZE/sizeof (unsigned long)];
} init_task_mem asm ("init_task") __init_task_data =
{{
.task = INIT_TASK(init_task_mem.s.task),
.thread_info = INIT_THREAD_INFO(init_task_mem.s.task)
}};
EXPORT_SYMBOL(init_task);

View File

@ -3,6 +3,7 @@
#include <asm/cache.h> #include <asm/cache.h>
#include <asm/ptrace.h> #include <asm/ptrace.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/thread_info.h>
#include <asm-generic/vmlinux.lds.h> #include <asm-generic/vmlinux.lds.h>

View File

@ -56,9 +56,6 @@ struct thread_info {
.addr_limit = KERNEL_DS, \ .addr_limit = KERNEL_DS, \
} }
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack)
/* how to get the thread information struct from C */ /* how to get the thread information struct from C */
static inline struct thread_info *current_thread_info(void) static inline struct thread_info *current_thread_info(void)
{ {

View File

@ -41,8 +41,6 @@ struct thread_info {
.preempt_count = INIT_PREEMPT_COUNT, \ .preempt_count = INIT_PREEMPT_COUNT, \
} }
#define init_stack (init_thread_union.stack)
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
/* how to get the thread information struct from C */ /* how to get the thread information struct from C */
static inline struct thread_info *current_thread_info(void) static inline struct thread_info *current_thread_info(void)
@ -58,8 +56,6 @@ static inline struct thread_info *current_thread_info(void)
} }
#endif #endif
#define init_thread_info (init_thread_union.thread_info)
/* entry.S relies on these definitions! /* entry.S relies on these definitions!
* bits 0-7 are tested at every exception exit * bits 0-7 are tested at every exception exit
* bits 8-15 are also tested at syscall exit * bits 8-15 are also tested at syscall exit

View File

@ -74,9 +74,6 @@ struct thread_info {
.addr_limit = KERNEL_DS, \ .addr_limit = KERNEL_DS, \
} }
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack)
/* how to get the current stack pointer from C */ /* how to get the current stack pointer from C */
register unsigned long current_stack_pointer asm("A0StP") __used; register unsigned long current_stack_pointer asm("A0StP") __used;

View File

@ -86,9 +86,6 @@ struct thread_info {
.addr_limit = KERNEL_DS, \ .addr_limit = KERNEL_DS, \
} }
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack)
/* how to get the thread information struct from C */ /* how to get the thread information struct from C */
static inline struct thread_info *current_thread_info(void) static inline struct thread_info *current_thread_info(void)
{ {

View File

@ -49,9 +49,6 @@ struct thread_info {
.addr_limit = KERNEL_DS, \ .addr_limit = KERNEL_DS, \
} }
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack)
/* How to get the thread information struct from C. */ /* How to get the thread information struct from C. */
register struct thread_info *__current_thread_info __asm__("$28"); register struct thread_info *__current_thread_info __asm__("$28");

View File

@ -79,8 +79,6 @@ struct thread_info {
.addr_limit = KERNEL_DS, \ .addr_limit = KERNEL_DS, \
} }
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack)
#define init_uregs \ #define init_uregs \
((struct pt_regs *) \ ((struct pt_regs *) \
((unsigned long) init_stack + THREAD_SIZE - sizeof(struct pt_regs))) ((unsigned long) init_stack + THREAD_SIZE - sizeof(struct pt_regs)))

View File

@ -63,9 +63,6 @@ struct thread_info {
.addr_limit = KERNEL_DS, \ .addr_limit = KERNEL_DS, \
} }
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack)
/* how to get the thread information struct from C */ /* how to get the thread information struct from C */
static inline struct thread_info *current_thread_info(void) static inline struct thread_info *current_thread_info(void)
{ {

View File

@ -84,8 +84,6 @@ void start_thread(struct pt_regs *regs, unsigned long nip, unsigned long sp);
void release_thread(struct task_struct *); void release_thread(struct task_struct *);
unsigned long get_wchan(struct task_struct *p); unsigned long get_wchan(struct task_struct *p);
#define init_stack (init_thread_union.stack)
#define cpu_relax() barrier() #define cpu_relax() barrier()
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */

View File

@ -79,8 +79,6 @@ struct thread_info {
.ksp = 0, \ .ksp = 0, \
} }
#define init_thread_info (init_thread_union.thread_info)
/* how to get the thread information struct from C */ /* how to get the thread information struct from C */
register struct thread_info *current_thread_info_reg asm("r10"); register struct thread_info *current_thread_info_reg asm("r10");
#define current_thread_info() (current_thread_info_reg) #define current_thread_info() (current_thread_info_reg)

View File

@ -28,6 +28,7 @@
#include <asm/page.h> #include <asm/page.h>
#include <asm/cache.h> #include <asm/cache.h>
#include <asm/thread_info.h>
#include <asm-generic/vmlinux.lds.h> #include <asm-generic/vmlinux.lds.h>
#ifdef __OR1K__ #ifdef __OR1K__

View File

@ -25,9 +25,6 @@ struct thread_info {
.preempt_count = INIT_PREEMPT_COUNT, \ .preempt_count = INIT_PREEMPT_COUNT, \
} }
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack)
/* how to get the thread information struct from C */ /* how to get the thread information struct from C */
#define current_thread_info() ((struct thread_info *)mfctl(30)) #define current_thread_info() ((struct thread_info *)mfctl(30))

View File

@ -58,9 +58,6 @@ struct thread_info {
.flags = 0, \ .flags = 0, \
} }
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack)
#define THREAD_SIZE_ORDER (THREAD_SHIFT - PAGE_SHIFT) #define THREAD_SIZE_ORDER (THREAD_SHIFT - PAGE_SHIFT)
/* how to get the thread information struct from C */ /* how to get the thread information struct from C */

View File

@ -64,8 +64,6 @@ struct thread_info {
.addr_limit = KERNEL_DS, \ .addr_limit = KERNEL_DS, \
} }
#define init_stack (init_thread_union.stack)
#endif /* !__ASSEMBLY__ */ #endif /* !__ASSEMBLY__ */
/* /*

View File

@ -42,8 +42,6 @@ struct thread_info {
.flags = 0, \ .flags = 0, \
} }
#define init_stack (init_thread_union.stack)
void arch_release_task_struct(struct task_struct *tsk); void arch_release_task_struct(struct task_struct *tsk);
int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src); int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src);

View File

@ -58,9 +58,6 @@ struct thread_info {
.addr_limit = KERNEL_DS, \ .addr_limit = KERNEL_DS, \
} }
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack)
/* How to get the thread information struct from C. */ /* How to get the thread information struct from C. */
register struct thread_info *__current_thread_info __asm__("r28"); register struct thread_info *__current_thread_info __asm__("r28");
#define current_thread_info() __current_thread_info #define current_thread_info() __current_thread_info

View File

@ -63,9 +63,6 @@ struct thread_info {
.addr_limit = KERNEL_DS, \ .addr_limit = KERNEL_DS, \
} }
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack)
/* how to get the current stack pointer from C */ /* how to get the current stack pointer from C */
register unsigned long current_stack_pointer asm("r15") __used; register unsigned long current_stack_pointer asm("r15") __used;

View File

@ -63,9 +63,6 @@ struct thread_info {
.preempt_count = INIT_PREEMPT_COUNT, \ .preempt_count = INIT_PREEMPT_COUNT, \
} }
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack)
/* how to get the thread information struct from C */ /* how to get the thread information struct from C */
register struct thread_info *current_thread_info_reg asm("g6"); register struct thread_info *current_thread_info_reg asm("g6");
#define current_thread_info() (current_thread_info_reg) #define current_thread_info() (current_thread_info_reg)

View File

@ -120,9 +120,6 @@ struct thread_info {
.preempt_count = INIT_PREEMPT_COUNT, \ .preempt_count = INIT_PREEMPT_COUNT, \
} }
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack)
/* how to get the thread information struct from C */ /* how to get the thread information struct from C */
register struct thread_info *current_thread_info_reg asm("g6"); register struct thread_info *current_thread_info_reg asm("g6");
#define current_thread_info() (current_thread_info_reg) #define current_thread_info() (current_thread_info_reg)

View File

@ -59,9 +59,6 @@ struct thread_info {
.align_ctl = 0, \ .align_ctl = 0, \
} }
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack)
#endif /* !__ASSEMBLY__ */ #endif /* !__ASSEMBLY__ */
#if PAGE_SIZE < 8192 #if PAGE_SIZE < 8192

View File

@ -58,7 +58,10 @@ static inline void release_thread(struct task_struct *task)
{ {
} }
#define init_stack (init_thread_union.stack) static inline void mm_copy_segments(struct mm_struct *from_mm,
struct mm_struct *new_mm)
{
}
/* /*
* User space process size: 3GB (default). * User space process size: 3GB (default).

View File

@ -6,6 +6,9 @@
#ifndef __UM_THREAD_INFO_H #ifndef __UM_THREAD_INFO_H
#define __UM_THREAD_INFO_H #define __UM_THREAD_INFO_H
#define THREAD_SIZE_ORDER CONFIG_KERNEL_STACK_ORDER
#define THREAD_SIZE ((1 << CONFIG_KERNEL_STACK_ORDER) * PAGE_SIZE)
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#include <asm/types.h> #include <asm/types.h>
@ -37,10 +40,6 @@ struct thread_info {
.real_thread = NULL, \ .real_thread = NULL, \
} }
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack)
#define THREAD_SIZE ((1 << CONFIG_KERNEL_STACK_ORDER) * PAGE_SIZE)
/* how to get the thread information struct from C */ /* how to get the thread information struct from C */
static inline struct thread_info *current_thread_info(void) static inline struct thread_info *current_thread_info(void)
{ {
@ -53,8 +52,6 @@ static inline struct thread_info *current_thread_info(void)
return ti; return ti;
} }
#define THREAD_SIZE_ORDER CONFIG_KERNEL_STACK_ORDER
#endif #endif
#define TIF_SYSCALL_TRACE 0 /* syscall trace active */ #define TIF_SYSCALL_TRACE 0 /* syscall trace active */

View File

@ -0,0 +1,2 @@
#include <asm/thread_info.h>
#include <asm-generic/vmlinux.lds.h>

View File

@ -1,5 +1,4 @@
/* SPDX-License-Identifier: GPL-2.0 */ #include <asm/vmlinux.lds.h>
#include <asm-generic/vmlinux.lds.h>
#include <asm/page.h> #include <asm/page.h>
OUTPUT_FORMAT(ELF_FORMAT) OUTPUT_FORMAT(ELF_FORMAT)

View File

@ -54,7 +54,7 @@ struct cpuinfo_um boot_cpu_data = {
union thread_union cpu0_irqstack union thread_union cpu0_irqstack
__attribute__((__section__(".data..init_irqstack"))) = __attribute__((__section__(".data..init_irqstack"))) =
{ INIT_THREAD_INFO(init_task) }; { .thread_info = INIT_THREAD_INFO(init_task) };
/* Changed in setup_arch, which is called in early boot */ /* Changed in setup_arch, which is called in early boot */
static char host_info[(__NEW_UTS_LEN + 1) * 5]; static char host_info[(__NEW_UTS_LEN + 1) * 5];

View File

@ -1,5 +1,5 @@
/* SPDX-License-Identifier: GPL-2.0 */ /* SPDX-License-Identifier: GPL-2.0 */
#include <asm-generic/vmlinux.lds.h> #include <asm/vmlinux.lds.h>
#include <asm/page.h> #include <asm/page.h>
OUTPUT_FORMAT(ELF_FORMAT) OUTPUT_FORMAT(ELF_FORMAT)

View File

@ -87,9 +87,6 @@ struct thread_info {
.addr_limit = KERNEL_DS, \ .addr_limit = KERNEL_DS, \
} }
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack)
/* /*
* how to get the thread information struct from C * how to get the thread information struct from C
*/ */

View File

@ -62,8 +62,6 @@ struct thread_info {
.flags = 0, \ .flags = 0, \
} }
#define init_stack (init_thread_union.stack)
#else /* !__ASSEMBLY__ */ #else /* !__ASSEMBLY__ */
#include <asm/asm-offsets.h> #include <asm/asm-offsets.h>

View File

@ -77,9 +77,6 @@ struct thread_info {
.addr_limit = KERNEL_DS, \ .addr_limit = KERNEL_DS, \
} }
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack)
/* how to get the thread information struct from C */ /* how to get the thread information struct from C */
static inline struct thread_info *current_thread_info(void) static inline struct thread_info *current_thread_info(void)
{ {

View File

@ -268,7 +268,11 @@
#define INIT_TASK_DATA(align) \ #define INIT_TASK_DATA(align) \
. = ALIGN(align); \ . = ALIGN(align); \
VMLINUX_SYMBOL(__start_init_task) = .; \ VMLINUX_SYMBOL(__start_init_task) = .; \
VMLINUX_SYMBOL(init_thread_union) = .; \
VMLINUX_SYMBOL(init_stack) = .; \
*(.data..init_task) \ *(.data..init_task) \
*(.data..init_thread_info) \
. = VMLINUX_SYMBOL(__start_init_task) + THREAD_SIZE; \
VMLINUX_SYMBOL(__end_init_task) = .; VMLINUX_SYMBOL(__end_init_task) = .;
/* /*

View File

@ -766,9 +766,6 @@ typedef int (*trace_func_graph_ent_t)(struct ftrace_graph_ent *); /* entry */
#ifdef CONFIG_FUNCTION_GRAPH_TRACER #ifdef CONFIG_FUNCTION_GRAPH_TRACER
/* for init task */
#define INIT_FTRACE_GRAPH .ret_stack = NULL,
/* /*
* Stack of return addresses for functions * Stack of return addresses for functions
* of a thread. * of a thread.
@ -846,7 +843,6 @@ static inline void unpause_graph_tracing(void)
#else /* !CONFIG_FUNCTION_GRAPH_TRACER */ #else /* !CONFIG_FUNCTION_GRAPH_TRACER */
#define __notrace_funcgraph #define __notrace_funcgraph
#define INIT_FTRACE_GRAPH
static inline void ftrace_graph_init_task(struct task_struct *t) { } static inline void ftrace_graph_init_task(struct task_struct *t) { }
static inline void ftrace_graph_exit_task(struct task_struct *t) { } static inline void ftrace_graph_exit_task(struct task_struct *t) { }
@ -925,10 +921,6 @@ extern int tracepoint_printk;
extern void disable_trace_on_warning(void); extern void disable_trace_on_warning(void);
extern int __disable_trace_on_warning; extern int __disable_trace_on_warning;
#ifdef CONFIG_PREEMPT
#define INIT_TRACE_RECURSION .trace_recursion = 0,
#endif
int tracepoint_printk_sysctl(struct ctl_table *table, int write, int tracepoint_printk_sysctl(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, void __user *buffer, size_t *lenp,
loff_t *ppos); loff_t *ppos);
@ -937,10 +929,6 @@ int tracepoint_printk_sysctl(struct ctl_table *table, int write,
static inline void disable_trace_on_warning(void) { } static inline void disable_trace_on_warning(void) { }
#endif /* CONFIG_TRACING */ #endif /* CONFIG_TRACING */
#ifndef INIT_TRACE_RECURSION
#define INIT_TRACE_RECURSION
#endif
#ifdef CONFIG_FTRACE_SYSCALLS #ifdef CONFIG_FTRACE_SYSCALLS
unsigned long arch_syscall_addr(int nr); unsigned long arch_syscall_addr(int nr);

View File

@ -21,22 +21,11 @@
#include <asm/thread_info.h> #include <asm/thread_info.h>
#ifdef CONFIG_SMP
# define INIT_PUSHABLE_TASKS(tsk) \
.pushable_tasks = PLIST_NODE_INIT(tsk.pushable_tasks, MAX_PRIO),
#else
# define INIT_PUSHABLE_TASKS(tsk)
#endif
extern struct files_struct init_files; extern struct files_struct init_files;
extern struct fs_struct init_fs; extern struct fs_struct init_fs;
extern struct nsproxy init_nsproxy;
#ifdef CONFIG_CPUSETS extern struct group_info init_groups;
#define INIT_CPUSET_SEQ(tsk) \ extern struct cred init_cred;
.mems_allowed_seq = SEQCNT_ZERO(tsk.mems_allowed_seq),
#else
#define INIT_CPUSET_SEQ(tsk)
#endif
#ifndef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE #ifndef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
#define INIT_PREV_CPUTIME(x) .prev_cputime = { \ #define INIT_PREV_CPUTIME(x) .prev_cputime = { \
@ -47,67 +36,16 @@ extern struct fs_struct init_fs;
#endif #endif
#ifdef CONFIG_POSIX_TIMERS #ifdef CONFIG_POSIX_TIMERS
#define INIT_POSIX_TIMERS(s) \
.posix_timers = LIST_HEAD_INIT(s.posix_timers),
#define INIT_CPU_TIMERS(s) \ #define INIT_CPU_TIMERS(s) \
.cpu_timers = { \ .cpu_timers = { \
LIST_HEAD_INIT(s.cpu_timers[0]), \ LIST_HEAD_INIT(s.cpu_timers[0]), \
LIST_HEAD_INIT(s.cpu_timers[1]), \ LIST_HEAD_INIT(s.cpu_timers[1]), \
LIST_HEAD_INIT(s.cpu_timers[2]), \ LIST_HEAD_INIT(s.cpu_timers[2]), \
},
#define INIT_CPUTIMER(s) \
.cputimer = { \
.cputime_atomic = INIT_CPUTIME_ATOMIC, \
.running = false, \
.checking_timer = false, \
}, },
#else #else
#define INIT_POSIX_TIMERS(s)
#define INIT_CPU_TIMERS(s) #define INIT_CPU_TIMERS(s)
#define INIT_CPUTIMER(s)
#endif #endif
#define INIT_SIGNALS(sig) { \
.nr_threads = 1, \
.thread_head = LIST_HEAD_INIT(init_task.thread_node), \
.wait_chldexit = __WAIT_QUEUE_HEAD_INITIALIZER(sig.wait_chldexit),\
.shared_pending = { \
.list = LIST_HEAD_INIT(sig.shared_pending.list), \
.signal = {{0}}}, \
INIT_POSIX_TIMERS(sig) \
INIT_CPU_TIMERS(sig) \
.rlim = INIT_RLIMITS, \
INIT_CPUTIMER(sig) \
INIT_PREV_CPUTIME(sig) \
.cred_guard_mutex = \
__MUTEX_INITIALIZER(sig.cred_guard_mutex), \
}
extern struct nsproxy init_nsproxy;
#define INIT_SIGHAND(sighand) { \
.count = ATOMIC_INIT(1), \
.action = { { { .sa_handler = SIG_DFL, } }, }, \
.siglock = __SPIN_LOCK_UNLOCKED(sighand.siglock), \
.signalfd_wqh = __WAIT_QUEUE_HEAD_INITIALIZER(sighand.signalfd_wqh), \
}
extern struct group_info init_groups;
#define INIT_STRUCT_PID { \
.count = ATOMIC_INIT(1), \
.tasks = { \
{ .first = NULL }, \
{ .first = NULL }, \
{ .first = NULL }, \
}, \
.level = 0, \
.numbers = { { \
.nr = 0, \
.ns = &init_pid_ns, \
}, } \
}
#define INIT_PID_LINK(type) \ #define INIT_PID_LINK(type) \
{ \ { \
.node = { \ .node = { \
@ -117,192 +55,16 @@ extern struct group_info init_groups;
.pid = &init_struct_pid, \ .pid = &init_struct_pid, \
} }
#ifdef CONFIG_AUDITSYSCALL
#define INIT_IDS \
.loginuid = INVALID_UID, \
.sessionid = (unsigned int)-1,
#else
#define INIT_IDS
#endif
#ifdef CONFIG_PREEMPT_RCU
#define INIT_TASK_RCU_PREEMPT(tsk) \
.rcu_read_lock_nesting = 0, \
.rcu_read_unlock_special.s = 0, \
.rcu_node_entry = LIST_HEAD_INIT(tsk.rcu_node_entry), \
.rcu_blocked_node = NULL,
#else
#define INIT_TASK_RCU_PREEMPT(tsk)
#endif
#ifdef CONFIG_TASKS_RCU
#define INIT_TASK_RCU_TASKS(tsk) \
.rcu_tasks_holdout = false, \
.rcu_tasks_holdout_list = \
LIST_HEAD_INIT(tsk.rcu_tasks_holdout_list), \
.rcu_tasks_idle_cpu = -1,
#else
#define INIT_TASK_RCU_TASKS(tsk)
#endif
extern struct cred init_cred;
#ifdef CONFIG_CGROUP_SCHED
# define INIT_CGROUP_SCHED(tsk) \
.sched_task_group = &root_task_group,
#else
# define INIT_CGROUP_SCHED(tsk)
#endif
#ifdef CONFIG_PERF_EVENTS
# define INIT_PERF_EVENTS(tsk) \
.perf_event_mutex = \
__MUTEX_INITIALIZER(tsk.perf_event_mutex), \
.perf_event_list = LIST_HEAD_INIT(tsk.perf_event_list),
#else
# define INIT_PERF_EVENTS(tsk)
#endif
#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN
# define INIT_VTIME(tsk) \
.vtime.seqcount = SEQCNT_ZERO(tsk.vtime.seqcount), \
.vtime.starttime = 0, \
.vtime.state = VTIME_SYS,
#else
# define INIT_VTIME(tsk)
#endif
#define INIT_TASK_COMM "swapper" #define INIT_TASK_COMM "swapper"
#ifdef CONFIG_RT_MUTEXES
# define INIT_RT_MUTEXES(tsk) \
.pi_waiters = RB_ROOT_CACHED, \
.pi_top_task = NULL,
#else
# define INIT_RT_MUTEXES(tsk)
#endif
#ifdef CONFIG_NUMA_BALANCING
# define INIT_NUMA_BALANCING(tsk) \
.numa_preferred_nid = -1, \
.numa_group = NULL, \
.numa_faults = NULL,
#else
# define INIT_NUMA_BALANCING(tsk)
#endif
#ifdef CONFIG_KASAN
# define INIT_KASAN(tsk) \
.kasan_depth = 1,
#else
# define INIT_KASAN(tsk)
#endif
#ifdef CONFIG_LIVEPATCH
# define INIT_LIVEPATCH(tsk) \
.patch_state = KLP_UNDEFINED,
#else
# define INIT_LIVEPATCH(tsk)
#endif
#ifdef CONFIG_THREAD_INFO_IN_TASK
# define INIT_TASK_TI(tsk) \
.thread_info = INIT_THREAD_INFO(tsk), \
.stack_refcount = ATOMIC_INIT(1),
#else
# define INIT_TASK_TI(tsk)
#endif
#ifdef CONFIG_SECURITY
#define INIT_TASK_SECURITY .security = NULL,
#else
#define INIT_TASK_SECURITY
#endif
/*
* INIT_TASK is used to set up the first task table, touch at
* your own risk!. Base=0, limit=0x1fffff (=2MB)
*/
#define INIT_TASK(tsk) \
{ \
INIT_TASK_TI(tsk) \
.state = 0, \
.stack = init_stack, \
.usage = ATOMIC_INIT(2), \
.flags = PF_KTHREAD, \
.prio = MAX_PRIO-20, \
.static_prio = MAX_PRIO-20, \
.normal_prio = MAX_PRIO-20, \
.policy = SCHED_NORMAL, \
.cpus_allowed = CPU_MASK_ALL, \
.nr_cpus_allowed= NR_CPUS, \
.mm = NULL, \
.active_mm = &init_mm, \
.restart_block = { \
.fn = do_no_restart_syscall, \
}, \
.se = { \
.group_node = LIST_HEAD_INIT(tsk.se.group_node), \
}, \
.rt = { \
.run_list = LIST_HEAD_INIT(tsk.rt.run_list), \
.time_slice = RR_TIMESLICE, \
}, \
.tasks = LIST_HEAD_INIT(tsk.tasks), \
INIT_PUSHABLE_TASKS(tsk) \
INIT_CGROUP_SCHED(tsk) \
.ptraced = LIST_HEAD_INIT(tsk.ptraced), \
.ptrace_entry = LIST_HEAD_INIT(tsk.ptrace_entry), \
.real_parent = &tsk, \
.parent = &tsk, \
.children = LIST_HEAD_INIT(tsk.children), \
.sibling = LIST_HEAD_INIT(tsk.sibling), \
.group_leader = &tsk, \
RCU_POINTER_INITIALIZER(real_cred, &init_cred), \
RCU_POINTER_INITIALIZER(cred, &init_cred), \
.comm = INIT_TASK_COMM, \
.thread = INIT_THREAD, \
.fs = &init_fs, \
.files = &init_files, \
.signal = &init_signals, \
.sighand = &init_sighand, \
.nsproxy = &init_nsproxy, \
.pending = { \
.list = LIST_HEAD_INIT(tsk.pending.list), \
.signal = {{0}}}, \
.blocked = {{0}}, \
.alloc_lock = __SPIN_LOCK_UNLOCKED(tsk.alloc_lock), \
.journal_info = NULL, \
INIT_CPU_TIMERS(tsk) \
.pi_lock = __RAW_SPIN_LOCK_UNLOCKED(tsk.pi_lock), \
.timer_slack_ns = 50000, /* 50 usec default slack */ \
.pids = { \
[PIDTYPE_PID] = INIT_PID_LINK(PIDTYPE_PID), \
[PIDTYPE_PGID] = INIT_PID_LINK(PIDTYPE_PGID), \
[PIDTYPE_SID] = INIT_PID_LINK(PIDTYPE_SID), \
}, \
.thread_group = LIST_HEAD_INIT(tsk.thread_group), \
.thread_node = LIST_HEAD_INIT(init_signals.thread_head), \
INIT_IDS \
INIT_PERF_EVENTS(tsk) \
INIT_TRACE_IRQFLAGS \
INIT_LOCKDEP \
INIT_FTRACE_GRAPH \
INIT_TRACE_RECURSION \
INIT_TASK_RCU_PREEMPT(tsk) \
INIT_TASK_RCU_TASKS(tsk) \
INIT_CPUSET_SEQ(tsk) \
INIT_RT_MUTEXES(tsk) \
INIT_PREV_CPUTIME(tsk) \
INIT_VTIME(tsk) \
INIT_NUMA_BALANCING(tsk) \
INIT_KASAN(tsk) \
INIT_LIVEPATCH(tsk) \
INIT_TASK_SECURITY \
}
/* Attach to the init_task data structure for proper alignment */ /* Attach to the init_task data structure for proper alignment */
#ifdef CONFIG_ARCH_TASK_STRUCT_ON_STACK
#define __init_task_data __attribute__((__section__(".data..init_task"))) #define __init_task_data __attribute__((__section__(".data..init_task")))
#else
#define __init_task_data /**/
#endif
/* Attach to the thread_info data structure for proper alignment */
#define __init_thread_info __attribute__((__section__(".data..init_thread_info")))
#endif #endif

View File

@ -40,7 +40,6 @@ do { \
do { \ do { \
current->softirq_context--; \ current->softirq_context--; \
} while (0) } while (0)
# define INIT_TRACE_IRQFLAGS .softirqs_enabled = 1,
#else #else
# define trace_hardirqs_on() do { } while (0) # define trace_hardirqs_on() do { } while (0)
# define trace_hardirqs_off() do { } while (0) # define trace_hardirqs_off() do { } while (0)
@ -54,7 +53,6 @@ do { \
# define trace_hardirq_exit() do { } while (0) # define trace_hardirq_exit() do { } while (0)
# define lockdep_softirq_enter() do { } while (0) # define lockdep_softirq_enter() do { } while (0)
# define lockdep_softirq_exit() do { } while (0) # define lockdep_softirq_exit() do { } while (0)
# define INIT_TRACE_IRQFLAGS
#endif #endif
#if defined(CONFIG_IRQSOFF_TRACER) || \ #if defined(CONFIG_IRQSOFF_TRACER) || \

View File

@ -367,8 +367,6 @@ extern struct pin_cookie lock_pin_lock(struct lockdep_map *lock);
extern void lock_repin_lock(struct lockdep_map *lock, struct pin_cookie); extern void lock_repin_lock(struct lockdep_map *lock, struct pin_cookie);
extern void lock_unpin_lock(struct lockdep_map *lock, struct pin_cookie); extern void lock_unpin_lock(struct lockdep_map *lock, struct pin_cookie);
# define INIT_LOCKDEP .lockdep_recursion = 0,
#define lockdep_depth(tsk) (debug_locks ? (tsk)->lockdep_depth : 0) #define lockdep_depth(tsk) (debug_locks ? (tsk)->lockdep_depth : 0)
#define lockdep_assert_held(l) do { \ #define lockdep_assert_held(l) do { \
@ -426,7 +424,6 @@ static inline void lockdep_on(void)
* #ifdef the call himself. * #ifdef the call himself.
*/ */
# define INIT_LOCKDEP
# define lockdep_reset() do { debug_locks = 1; } while (0) # define lockdep_reset() do { debug_locks = 1; } while (0)
# define lockdep_free_key_range(start, size) do { } while (0) # define lockdep_free_key_range(start, size) do { } while (0)
# define lockdep_sys_exit() do { } while (0) # define lockdep_sys_exit() do { } while (0)

View File

@ -1446,12 +1446,21 @@ extern void ia64_set_curr_task(int cpu, struct task_struct *p);
void yield(void); void yield(void);
union thread_union { union thread_union {
#ifndef CONFIG_ARCH_TASK_STRUCT_ON_STACK
struct task_struct task;
#endif
#ifndef CONFIG_THREAD_INFO_IN_TASK #ifndef CONFIG_THREAD_INFO_IN_TASK
struct thread_info thread_info; struct thread_info thread_info;
#endif #endif
unsigned long stack[THREAD_SIZE/sizeof(long)]; unsigned long stack[THREAD_SIZE/sizeof(long)];
}; };
#ifndef CONFIG_THREAD_INFO_IN_TASK
extern struct thread_info init_thread_info;
#endif
extern unsigned long init_stack[THREAD_SIZE / sizeof(unsigned long)];
#ifdef CONFIG_THREAD_INFO_IN_TASK #ifdef CONFIG_THREAD_INFO_IN_TASK
static inline struct thread_info *task_thread_info(struct task_struct *task) static inline struct thread_info *task_thread_info(struct task_struct *task)
{ {

View File

@ -13,9 +13,7 @@ obj-$(CONFIG_BLK_DEV_INITRD) += initramfs.o
endif endif
obj-$(CONFIG_GENERIC_CALIBRATE_DELAY) += calibrate.o obj-$(CONFIG_GENERIC_CALIBRATE_DELAY) += calibrate.o
ifneq ($(CONFIG_ARCH_INIT_TASK),y)
obj-y += init_task.o obj-y += init_task.o
endif
mounts-y := do_mounts.o mounts-y := do_mounts.o
mounts-$(CONFIG_BLK_DEV_RAM) += do_mounts_rd.o mounts-$(CONFIG_BLK_DEV_RAM) += do_mounts_rd.o

View File

@ -13,19 +13,175 @@
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
static struct signal_struct init_signals = INIT_SIGNALS(init_signals); static struct signal_struct init_signals = {
static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); .nr_threads = 1,
.thread_head = LIST_HEAD_INIT(init_task.thread_node),
.wait_chldexit = __WAIT_QUEUE_HEAD_INITIALIZER(init_signals.wait_chldexit),
.shared_pending = {
.list = LIST_HEAD_INIT(init_signals.shared_pending.list),
.signal = {{0}}
},
.rlim = INIT_RLIMITS,
.cred_guard_mutex = __MUTEX_INITIALIZER(init_signals.cred_guard_mutex),
#ifdef CONFIG_POSIX_TIMERS
.posix_timers = LIST_HEAD_INIT(init_signals.posix_timers),
.cputimer = {
.cputime_atomic = INIT_CPUTIME_ATOMIC,
.running = false,
.checking_timer = false,
},
#endif
INIT_CPU_TIMERS(init_signals)
INIT_PREV_CPUTIME(init_signals)
};
/* Initial task structure */ static struct sighand_struct init_sighand = {
struct task_struct init_task = INIT_TASK(init_task); .count = ATOMIC_INIT(1),
.action = { { { .sa_handler = SIG_DFL, } }, },
.siglock = __SPIN_LOCK_UNLOCKED(init_sighand.siglock),
.signalfd_wqh = __WAIT_QUEUE_HEAD_INITIALIZER(init_sighand.signalfd_wqh),
};
/*
* Set up the first task table, touch at your own risk!. Base=0,
* limit=0x1fffff (=2MB)
*/
struct task_struct init_task
#ifdef CONFIG_ARCH_TASK_STRUCT_ON_STACK
__init_task_data
#endif
= {
#ifdef CONFIG_THREAD_INFO_IN_TASK
.thread_info = INIT_THREAD_INFO(init_task),
.stack_refcount = ATOMIC_INIT(1),
#endif
.state = 0,
.stack = init_stack,
.usage = ATOMIC_INIT(2),
.flags = PF_KTHREAD,
.prio = MAX_PRIO - 20,
.static_prio = MAX_PRIO - 20,
.normal_prio = MAX_PRIO - 20,
.policy = SCHED_NORMAL,
.cpus_allowed = CPU_MASK_ALL,
.nr_cpus_allowed= NR_CPUS,
.mm = NULL,
.active_mm = &init_mm,
.restart_block = {
.fn = do_no_restart_syscall,
},
.se = {
.group_node = LIST_HEAD_INIT(init_task.se.group_node),
},
.rt = {
.run_list = LIST_HEAD_INIT(init_task.rt.run_list),
.time_slice = RR_TIMESLICE,
},
.tasks = LIST_HEAD_INIT(init_task.tasks),
#ifdef CONFIG_SMP
.pushable_tasks = PLIST_NODE_INIT(init_task.pushable_tasks, MAX_PRIO),
#endif
#ifdef CONFIG_CGROUP_SCHED
.sched_task_group = &root_task_group,
#endif
.ptraced = LIST_HEAD_INIT(init_task.ptraced),
.ptrace_entry = LIST_HEAD_INIT(init_task.ptrace_entry),
.real_parent = &init_task,
.parent = &init_task,
.children = LIST_HEAD_INIT(init_task.children),
.sibling = LIST_HEAD_INIT(init_task.sibling),
.group_leader = &init_task,
RCU_POINTER_INITIALIZER(real_cred, &init_cred),
RCU_POINTER_INITIALIZER(cred, &init_cred),
.comm = INIT_TASK_COMM,
.thread = INIT_THREAD,
.fs = &init_fs,
.files = &init_files,
.signal = &init_signals,
.sighand = &init_sighand,
.nsproxy = &init_nsproxy,
.pending = {
.list = LIST_HEAD_INIT(init_task.pending.list),
.signal = {{0}}
},
.blocked = {{0}},
.alloc_lock = __SPIN_LOCK_UNLOCKED(init_task.alloc_lock),
.journal_info = NULL,
INIT_CPU_TIMERS(init_task)
.pi_lock = __RAW_SPIN_LOCK_UNLOCKED(init_task.pi_lock),
.timer_slack_ns = 50000, /* 50 usec default slack */
.pids = {
[PIDTYPE_PID] = INIT_PID_LINK(PIDTYPE_PID),
[PIDTYPE_PGID] = INIT_PID_LINK(PIDTYPE_PGID),
[PIDTYPE_SID] = INIT_PID_LINK(PIDTYPE_SID),
},
.thread_group = LIST_HEAD_INIT(init_task.thread_group),
.thread_node = LIST_HEAD_INIT(init_signals.thread_head),
#ifdef CONFIG_AUDITSYSCALL
.loginuid = INVALID_UID,
.sessionid = (unsigned int)-1,
#endif
#ifdef CONFIG_PERF_EVENTS
.perf_event_mutex = __MUTEX_INITIALIZER(init_task.perf_event_mutex),
.perf_event_list = LIST_HEAD_INIT(init_task.perf_event_list),
#endif
#ifdef CONFIG_PREEMPT_RCU
.rcu_read_lock_nesting = 0,
.rcu_read_unlock_special.s = 0,
.rcu_node_entry = LIST_HEAD_INIT(init_task.rcu_node_entry),
.rcu_blocked_node = NULL,
#endif
#ifdef CONFIG_TASKS_RCU
.rcu_tasks_holdout = false,
.rcu_tasks_holdout_list = LIST_HEAD_INIT(init_task.rcu_tasks_holdout_list),
.rcu_tasks_idle_cpu = -1,
#endif
#ifdef CONFIG_CPUSETS
.mems_allowed_seq = SEQCNT_ZERO(init_task.mems_allowed_seq),
#endif
#ifdef CONFIG_RT_MUTEXES
.pi_waiters = RB_ROOT_CACHED,
.pi_top_task = NULL,
#endif
INIT_PREV_CPUTIME(init_task)
#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN
.vtime.seqcount = SEQCNT_ZERO(init_task.vtime_seqcount),
.vtime.starttime = 0,
.vtime.state = VTIME_SYS,
#endif
#ifdef CONFIG_NUMA_BALANCING
.numa_preferred_nid = -1,
.numa_group = NULL,
.numa_faults = NULL,
#endif
#ifdef CONFIG_KASAN
.kasan_depth = 1,
#endif
#ifdef CONFIG_TRACE_IRQFLAGS
.softirqs_enabled = 1,
#endif
#ifdef CONFIG_LOCKDEP
.lockdep_recursion = 0,
#endif
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
.ret_stack = NULL,
#endif
#if defined(CONFIG_TRACING) && defined(CONFIG_PREEMPT)
.trace_recursion = 0,
#endif
#ifdef CONFIG_LIVEPATCH
.patch_state = KLP_UNDEFINED,
#endif
#ifdef CONFIG_SECURITY
.security = NULL,
#endif
};
EXPORT_SYMBOL(init_task); EXPORT_SYMBOL(init_task);
/* /*
* Initial thread structure. Alignment of this is handled by a special * Initial thread structure. Alignment of this is handled by a special
* linker map entry. * linker map entry.
*/ */
union thread_union init_thread_union __init_task_data = {
#ifndef CONFIG_THREAD_INFO_IN_TASK #ifndef CONFIG_THREAD_INFO_IN_TASK
INIT_THREAD_INFO(init_task) struct thread_info init_thread_info __init_thread_info = INIT_THREAD_INFO(init_task);
#endif #endif
};

View File

@ -41,7 +41,19 @@
#include <linux/sched/task.h> #include <linux/sched/task.h>
#include <linux/idr.h> #include <linux/idr.h>
struct pid init_struct_pid = INIT_STRUCT_PID; struct pid init_struct_pid = {
.count = ATOMIC_INIT(1),
.tasks = {
{ .first = NULL },
{ .first = NULL },
{ .first = NULL },
},
.level = 0,
.numbers = { {
.nr = 0,
.ns = &init_pid_ns,
}, }
};
int pid_max = PID_MAX_DEFAULT; int pid_max = PID_MAX_DEFAULT;