summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2018-01-02 10:12:01 -0500
committerDavid Howells <dhowells@redhat.com>2018-01-09 18:21:02 -0500
commit0500871f21b237b2bea2d9db405eadf78e5aab05 (patch)
tree6004424368ea44f74d9d9d66fb565a59d3dba970
parent138101932054268a235c6ac7cf474f6a88fcd885 (diff)
Construct init thread stack in the linker script rather than by union
Construct the init thread stack in the linker script rather than doing it by means of a union so that ia64's init_task.c can be got rid of. The following symbols are then made available from INIT_TASK_DATA() linker script macro: init_thread_union init_stack INIT_TASK_DATA() also expands the region to THREAD_SIZE to accommodate the size of the init stack. init_thread_union is given its own section so that it can be placed into the stack space in the right order. I'm assuming that the ia64 ordering is correct and that the task_struct is first and the thread_info second. Signed-off-by: David Howells <dhowells@redhat.com> Tested-by: Tony Luck <tony.luck@intel.com> Tested-by: Will Deacon <will.deacon@arm.com> (arm64) Tested-by: Palmer Dabbelt <palmer@sifive.com> Acked-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r--arch/Kconfig4
-rw-r--r--arch/alpha/include/asm/thread_info.h3
-rw-r--r--arch/arc/include/asm/thread_info.h3
-rw-r--r--arch/arm/include/asm/thread_info.h3
-rw-r--r--arch/arm64/include/asm/thread_info.h2
-rw-r--r--arch/blackfin/include/asm/thread_info.h2
-rw-r--r--arch/c6x/include/asm/thread_info.h3
-rw-r--r--arch/cris/include/asm/processor.h2
-rw-r--r--arch/cris/include/asm/thread_info.h2
-rw-r--r--arch/frv/include/asm/thread_info.h3
-rw-r--r--arch/h8300/include/asm/thread_info.h3
-rw-r--r--arch/hexagon/include/asm/thread_info.h3
-rw-r--r--arch/ia64/Kconfig2
-rw-r--r--arch/ia64/Makefile2
-rw-r--r--arch/ia64/include/asm/thread_info.h4
-rw-r--r--arch/ia64/kernel/Makefile2
-rw-r--r--arch/ia64/kernel/init_task.c44
-rw-r--r--arch/ia64/kernel/vmlinux.lds.S1
-rw-r--r--arch/m32r/include/asm/thread_info.h3
-rw-r--r--arch/m68k/include/asm/thread_info.h4
-rw-r--r--arch/metag/include/asm/thread_info.h3
-rw-r--r--arch/microblaze/include/asm/thread_info.h3
-rw-r--r--arch/mips/include/asm/thread_info.h3
-rw-r--r--arch/mn10300/include/asm/thread_info.h2
-rw-r--r--arch/nios2/include/asm/thread_info.h3
-rw-r--r--arch/openrisc/include/asm/processor.h2
-rw-r--r--arch/openrisc/include/asm/thread_info.h2
-rw-r--r--arch/parisc/include/asm/thread_info.h3
-rw-r--r--arch/powerpc/include/asm/thread_info.h3
-rw-r--r--arch/riscv/include/asm/thread_info.h2
-rw-r--r--arch/s390/include/asm/thread_info.h2
-rw-r--r--arch/score/include/asm/thread_info.h3
-rw-r--r--arch/sh/include/asm/thread_info.h3
-rw-r--r--arch/sparc/include/asm/thread_info_32.h3
-rw-r--r--arch/sparc/include/asm/thread_info_64.h3
-rw-r--r--arch/tile/include/asm/thread_info.h3
-rw-r--r--arch/um/include/asm/processor-generic.h5
-rw-r--r--arch/um/include/asm/thread_info.h9
-rw-r--r--arch/um/include/asm/vmlinux.lds.h2
-rw-r--r--arch/um/kernel/dyn.lds.S3
-rw-r--r--arch/um/kernel/um_arch.c2
-rw-r--r--arch/um/kernel/uml.lds.S2
-rw-r--r--arch/unicore32/include/asm/thread_info.h3
-rw-r--r--arch/x86/include/asm/thread_info.h2
-rw-r--r--arch/xtensa/include/asm/thread_info.h3
-rw-r--r--include/asm-generic/vmlinux.lds.h4
-rw-r--r--include/linux/init_task.h3
-rw-r--r--include/linux/sched.h9
-rw-r--r--init/Makefile2
-rw-r--r--init/init_task.c10
50 files changed, 42 insertions, 155 deletions
diff --git a/arch/Kconfig b/arch/Kconfig
index 400b9e1b2f27..a26d6f8ab967 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -234,8 +234,8 @@ config ARCH_HAS_FORTIFY_SOURCE
234config ARCH_HAS_SET_MEMORY 234config ARCH_HAS_SET_MEMORY
235 bool 235 bool
236 236
237# Select if arch init_task initializer is different to init/init_task.c 237# Select if arch init_task must go in the __init_task_data section
238config ARCH_INIT_TASK 238config ARCH_TASK_STRUCT_ON_STACK
239 bool 239 bool
240 240
241# Select if arch has its private alloc_task_struct() function 241# Select if arch has its private alloc_task_struct() function
diff --git a/arch/alpha/include/asm/thread_info.h b/arch/alpha/include/asm/thread_info.h
index 8c20c5e35432..807d7b9a1860 100644
--- a/arch/alpha/include/asm/thread_info.h
+++ b/arch/alpha/include/asm/thread_info.h
@@ -39,9 +39,6 @@ struct thread_info {
39 .preempt_count = INIT_PREEMPT_COUNT, \ 39 .preempt_count = INIT_PREEMPT_COUNT, \
40} 40}
41 41
42#define init_thread_info (init_thread_union.thread_info)
43#define init_stack (init_thread_union.stack)
44
45/* How to get the thread information struct from C. */ 42/* How to get the thread information struct from C. */
46register struct thread_info *__current_thread_info __asm__("$8"); 43register struct thread_info *__current_thread_info __asm__("$8");
47#define current_thread_info() __current_thread_info 44#define current_thread_info() __current_thread_info
diff --git a/arch/arc/include/asm/thread_info.h b/arch/arc/include/asm/thread_info.h
index 2d79e527fa50..c85947bac5e5 100644
--- a/arch/arc/include/asm/thread_info.h
+++ b/arch/arc/include/asm/thread_info.h
@@ -62,9 +62,6 @@ struct thread_info {
62 .addr_limit = KERNEL_DS, \ 62 .addr_limit = KERNEL_DS, \
63} 63}
64 64
65#define init_thread_info (init_thread_union.thread_info)
66#define init_stack (init_thread_union.stack)
67
68static inline __attribute_const__ struct thread_info *current_thread_info(void) 65static inline __attribute_const__ struct thread_info *current_thread_info(void)
69{ 66{
70 register unsigned long sp asm("sp"); 67 register unsigned long sp asm("sp");
diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h
index 776757d1604a..e71cc35de163 100644
--- a/arch/arm/include/asm/thread_info.h
+++ b/arch/arm/include/asm/thread_info.h
@@ -75,9 +75,6 @@ struct thread_info {
75 .addr_limit = KERNEL_DS, \ 75 .addr_limit = KERNEL_DS, \
76} 76}
77 77
78#define init_thread_info (init_thread_union.thread_info)
79#define init_stack (init_thread_union.stack)
80
81/* 78/*
82 * how to get the current stack pointer in C 79 * how to get the current stack pointer in C
83 */ 80 */
diff --git a/arch/arm64/include/asm/thread_info.h b/arch/arm64/include/asm/thread_info.h
index eb431286bacd..740aa03c5f0d 100644
--- a/arch/arm64/include/asm/thread_info.h
+++ b/arch/arm64/include/asm/thread_info.h
@@ -51,8 +51,6 @@ struct thread_info {
51 .addr_limit = KERNEL_DS, \ 51 .addr_limit = KERNEL_DS, \
52} 52}
53 53
54#define init_stack (init_thread_union.stack)
55
56#define thread_saved_pc(tsk) \ 54#define thread_saved_pc(tsk) \
57 ((unsigned long)(tsk->thread.cpu_context.pc)) 55 ((unsigned long)(tsk->thread.cpu_context.pc))
58#define thread_saved_sp(tsk) \ 56#define thread_saved_sp(tsk) \
diff --git a/arch/blackfin/include/asm/thread_info.h b/arch/blackfin/include/asm/thread_info.h
index 2966b93850a1..a5aeab4e5f2d 100644
--- a/arch/blackfin/include/asm/thread_info.h
+++ b/arch/blackfin/include/asm/thread_info.h
@@ -56,8 +56,6 @@ struct thread_info {
56 .cpu = 0, \ 56 .cpu = 0, \
57 .preempt_count = INIT_PREEMPT_COUNT, \ 57 .preempt_count = INIT_PREEMPT_COUNT, \
58} 58}
59#define init_thread_info (init_thread_union.thread_info)
60#define init_stack (init_thread_union.stack)
61 59
62/* Given a task stack pointer, you can find its corresponding 60/* Given a task stack pointer, you can find its corresponding
63 * thread_info structure just by masking it to the THREAD_SIZE 61 * thread_info structure just by masking it to the THREAD_SIZE
diff --git a/arch/c6x/include/asm/thread_info.h b/arch/c6x/include/asm/thread_info.h
index acc70c135ab8..59a5697fe0f3 100644
--- a/arch/c6x/include/asm/thread_info.h
+++ b/arch/c6x/include/asm/thread_info.h
@@ -60,9 +60,6 @@ struct thread_info {
60 .addr_limit = KERNEL_DS, \ 60 .addr_limit = KERNEL_DS, \
61} 61}
62 62
63#define init_thread_info (init_thread_union.thread_info)
64#define init_stack (init_thread_union.stack)
65
66/* get the thread information struct of current task */ 63/* get the thread information struct of current task */
67static inline __attribute__((const)) 64static inline __attribute__((const))
68struct thread_info *current_thread_info(void) 65struct thread_info *current_thread_info(void)
diff --git a/arch/cris/include/asm/processor.h b/arch/cris/include/asm/processor.h
index b50907799cb2..ee4d8b03d048 100644
--- a/arch/cris/include/asm/processor.h
+++ b/arch/cris/include/asm/processor.h
@@ -52,8 +52,6 @@ static inline void release_thread(struct task_struct *dead_task)
52 /* Nothing needs to be done. */ 52 /* Nothing needs to be done. */
53} 53}
54 54
55#define init_stack (init_thread_union.stack)
56
57#define cpu_relax() barrier() 55#define cpu_relax() barrier()
58 56
59void default_idle(void); 57void default_idle(void);
diff --git a/arch/cris/include/asm/thread_info.h b/arch/cris/include/asm/thread_info.h
index 108f77081a3c..996fef3be1d5 100644
--- a/arch/cris/include/asm/thread_info.h
+++ b/arch/cris/include/asm/thread_info.h
@@ -63,8 +63,6 @@ struct thread_info {
63 .addr_limit = KERNEL_DS, \ 63 .addr_limit = KERNEL_DS, \
64} 64}
65 65
66#define init_thread_info (init_thread_union.thread_info)
67
68#endif /* !__ASSEMBLY__ */ 66#endif /* !__ASSEMBLY__ */
69 67
70/* 68/*
diff --git a/arch/frv/include/asm/thread_info.h b/arch/frv/include/asm/thread_info.h
index ccba3b6ce918..0f950845fad9 100644
--- a/arch/frv/include/asm/thread_info.h
+++ b/arch/frv/include/asm/thread_info.h
@@ -64,9 +64,6 @@ struct thread_info {
64 .addr_limit = KERNEL_DS, \ 64 .addr_limit = KERNEL_DS, \
65} 65}
66 66
67#define init_thread_info (init_thread_union.thread_info)
68#define init_stack (init_thread_union.stack)
69
70/* how to get the thread information struct from C */ 67/* how to get the thread information struct from C */
71register struct thread_info *__current_thread_info asm("gr15"); 68register struct thread_info *__current_thread_info asm("gr15");
72 69
diff --git a/arch/h8300/include/asm/thread_info.h b/arch/h8300/include/asm/thread_info.h
index 072b92c0d8b5..0cdaa302d3d2 100644
--- a/arch/h8300/include/asm/thread_info.h
+++ b/arch/h8300/include/asm/thread_info.h
@@ -46,9 +46,6 @@ struct thread_info {
46 .addr_limit = KERNEL_DS, \ 46 .addr_limit = KERNEL_DS, \
47} 47}
48 48
49#define init_thread_info (init_thread_union.thread_info)
50#define init_stack (init_thread_union.stack)
51
52/* how to get the thread information struct from C */ 49/* how to get the thread information struct from C */
53static inline struct thread_info *current_thread_info(void) 50static inline struct thread_info *current_thread_info(void)
54{ 51{
diff --git a/arch/hexagon/include/asm/thread_info.h b/arch/hexagon/include/asm/thread_info.h
index b80fe1db7b64..f41f9c6f0e31 100644
--- a/arch/hexagon/include/asm/thread_info.h
+++ b/arch/hexagon/include/asm/thread_info.h
@@ -84,9 +84,6 @@ struct thread_info {
84 .regs = NULL, \ 84 .regs = NULL, \
85} 85}
86 86
87#define init_thread_info (init_thread_union.thread_info)
88#define init_stack (init_thread_union.stack)
89
90/* Tacky preprocessor trickery */ 87/* Tacky preprocessor trickery */
91#define qqstr(s) qstr(s) 88#define qqstr(s) qstr(s)
92#define qstr(s) #s 89#define qstr(s) #s
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig
index 49583c5a5d44..315c51f58811 100644
--- a/arch/ia64/Kconfig
+++ b/arch/ia64/Kconfig
@@ -43,7 +43,7 @@ config IA64
43 select ARCH_HAVE_NMI_SAFE_CMPXCHG 43 select ARCH_HAVE_NMI_SAFE_CMPXCHG
44 select GENERIC_IOMAP 44 select GENERIC_IOMAP
45 select GENERIC_SMP_IDLE_THREAD 45 select GENERIC_SMP_IDLE_THREAD
46 select ARCH_INIT_TASK 46 select ARCH_TASK_STRUCT_ON_STACK
47 select ARCH_TASK_STRUCT_ALLOCATOR 47 select ARCH_TASK_STRUCT_ALLOCATOR
48 select ARCH_THREAD_STACK_ALLOCATOR 48 select ARCH_THREAD_STACK_ALLOCATOR
49 select ARCH_CLOCKSOURCE_DATA 49 select ARCH_CLOCKSOURCE_DATA
diff --git a/arch/ia64/Makefile b/arch/ia64/Makefile
index c100d780f1eb..2dd7f519ad0b 100644
--- a/arch/ia64/Makefile
+++ b/arch/ia64/Makefile
@@ -42,7 +42,7 @@ $(error Sorry, you need a newer version of the assember, one that is built from
42endif 42endif
43 43
44KBUILD_CFLAGS += $(cflags-y) 44KBUILD_CFLAGS += $(cflags-y)
45head-y := arch/ia64/kernel/head.o arch/ia64/kernel/init_task.o 45head-y := arch/ia64/kernel/head.o
46 46
47libs-y += arch/ia64/lib/ 47libs-y += arch/ia64/lib/
48core-y += arch/ia64/kernel/ arch/ia64/mm/ 48core-y += arch/ia64/kernel/ arch/ia64/mm/
diff --git a/arch/ia64/include/asm/thread_info.h b/arch/ia64/include/asm/thread_info.h
index 1d172a4119a7..64a1011f6812 100644
--- a/arch/ia64/include/asm/thread_info.h
+++ b/arch/ia64/include/asm/thread_info.h
@@ -12,6 +12,8 @@
12#include <asm/processor.h> 12#include <asm/processor.h>
13#include <asm/ptrace.h> 13#include <asm/ptrace.h>
14 14
15#define THREAD_SIZE KERNEL_STACK_SIZE
16
15#ifndef __ASSEMBLY__ 17#ifndef __ASSEMBLY__
16 18
17/* 19/*
@@ -41,8 +43,6 @@ struct thread_info {
41#endif 43#endif
42}; 44};
43 45
44#define THREAD_SIZE KERNEL_STACK_SIZE
45
46#define INIT_THREAD_INFO(tsk) \ 46#define INIT_THREAD_INFO(tsk) \
47{ \ 47{ \
48 .task = &tsk, \ 48 .task = &tsk, \
diff --git a/arch/ia64/kernel/Makefile b/arch/ia64/kernel/Makefile
index 14ad79f394e5..0b4c65a1af25 100644
--- a/arch/ia64/kernel/Makefile
+++ b/arch/ia64/kernel/Makefile
@@ -7,7 +7,7 @@ ifdef CONFIG_DYNAMIC_FTRACE
7CFLAGS_REMOVE_ftrace.o = -pg 7CFLAGS_REMOVE_ftrace.o = -pg
8endif 8endif
9 9
10extra-y := head.o init_task.o vmlinux.lds 10extra-y := head.o vmlinux.lds
11 11
12obj-y := entry.o efi.o efi_stub.o gate-data.o fsys.o ia64_ksyms.o irq.o irq_ia64.o \ 12obj-y := entry.o efi.o efi_stub.o gate-data.o fsys.o ia64_ksyms.o irq.o irq_ia64.o \
13 irq_lsapic.o ivt.o machvec.o pal.o patch.o process.o perfmon.o ptrace.o sal.o \ 13 irq_lsapic.o ivt.o machvec.o pal.o patch.o process.o perfmon.o ptrace.o sal.o \
diff --git a/arch/ia64/kernel/init_task.c b/arch/ia64/kernel/init_task.c
deleted file mode 100644
index 8df9245e29d9..000000000000
--- a/arch/ia64/kernel/init_task.c
+++ /dev/null
@@ -1,44 +0,0 @@
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * This is where we statically allocate and initialize the initial
4 * task.
5 *
6 * Copyright (C) 1999, 2002-2003 Hewlett-Packard Co
7 * David Mosberger-Tang <davidm@hpl.hp.com>
8 */
9
10#include <linux/init.h>
11#include <linux/mm.h>
12#include <linux/fs.h>
13#include <linux/module.h>
14#include <linux/sched.h>
15#include <linux/init_task.h>
16#include <linux/mqueue.h>
17
18#include <linux/uaccess.h>
19#include <asm/pgtable.h>
20
21static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
22static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
23/*
24 * Initial task structure.
25 *
26 * We need to make sure that this is properly aligned due to the way process stacks are
27 * handled. This is done by having a special ".data..init_task" section...
28 */
29#define init_thread_info init_task_mem.s.thread_info
30#define init_stack init_task_mem.stack
31
32union {
33 struct {
34 struct task_struct task;
35 struct thread_info thread_info;
36 } s;
37 unsigned long stack[KERNEL_STACK_SIZE/sizeof (unsigned long)];
38} init_task_mem asm ("init_task") __init_task_data =
39 {{
40 .task = INIT_TASK(init_task_mem.s.task),
41 .thread_info = INIT_THREAD_INFO(init_task_mem.s.task)
42}};
43
44EXPORT_SYMBOL(init_task);
diff --git a/arch/ia64/kernel/vmlinux.lds.S b/arch/ia64/kernel/vmlinux.lds.S
index 58db59da0bd8..b0b2070e0591 100644
--- a/arch/ia64/kernel/vmlinux.lds.S
+++ b/arch/ia64/kernel/vmlinux.lds.S
@@ -3,6 +3,7 @@
3#include <asm/cache.h> 3#include <asm/cache.h>
4#include <asm/ptrace.h> 4#include <asm/ptrace.h>
5#include <asm/pgtable.h> 5#include <asm/pgtable.h>
6#include <asm/thread_info.h>
6 7
7#include <asm-generic/vmlinux.lds.h> 8#include <asm-generic/vmlinux.lds.h>
8 9
diff --git a/arch/m32r/include/asm/thread_info.h b/arch/m32r/include/asm/thread_info.h
index b3a215b0ce0a..ba00f1032587 100644
--- a/arch/m32r/include/asm/thread_info.h
+++ b/arch/m32r/include/asm/thread_info.h
@@ -56,9 +56,6 @@ struct thread_info {
56 .addr_limit = KERNEL_DS, \ 56 .addr_limit = KERNEL_DS, \
57} 57}
58 58
59#define init_thread_info (init_thread_union.thread_info)
60#define init_stack (init_thread_union.stack)
61
62/* how to get the thread information struct from C */ 59/* how to get the thread information struct from C */
63static inline struct thread_info *current_thread_info(void) 60static inline struct thread_info *current_thread_info(void)
64{ 61{
diff --git a/arch/m68k/include/asm/thread_info.h b/arch/m68k/include/asm/thread_info.h
index 928035591f2e..015f1ca38305 100644
--- a/arch/m68k/include/asm/thread_info.h
+++ b/arch/m68k/include/asm/thread_info.h
@@ -41,8 +41,6 @@ struct thread_info {
41 .preempt_count = INIT_PREEMPT_COUNT, \ 41 .preempt_count = INIT_PREEMPT_COUNT, \
42} 42}
43 43
44#define init_stack (init_thread_union.stack)
45
46#ifndef __ASSEMBLY__ 44#ifndef __ASSEMBLY__
47/* how to get the thread information struct from C */ 45/* how to get the thread information struct from C */
48static inline struct thread_info *current_thread_info(void) 46static inline struct thread_info *current_thread_info(void)
@@ -58,8 +56,6 @@ static inline struct thread_info *current_thread_info(void)
58} 56}
59#endif 57#endif
60 58
61#define init_thread_info (init_thread_union.thread_info)
62
63/* entry.S relies on these definitions! 59/* entry.S relies on these definitions!
64 * bits 0-7 are tested at every exception exit 60 * bits 0-7 are tested at every exception exit
65 * bits 8-15 are also tested at syscall exit 61 * bits 8-15 are also tested at syscall exit
diff --git a/arch/metag/include/asm/thread_info.h b/arch/metag/include/asm/thread_info.h
index 554f73a77e6e..a1a9c7f5ca8c 100644
--- a/arch/metag/include/asm/thread_info.h
+++ b/arch/metag/include/asm/thread_info.h
@@ -74,9 +74,6 @@ struct thread_info {
74 .addr_limit = KERNEL_DS, \ 74 .addr_limit = KERNEL_DS, \
75} 75}
76 76
77#define init_thread_info (init_thread_union.thread_info)
78#define init_stack (init_thread_union.stack)
79
80/* how to get the current stack pointer from C */ 77/* how to get the current stack pointer from C */
81register unsigned long current_stack_pointer asm("A0StP") __used; 78register unsigned long current_stack_pointer asm("A0StP") __used;
82 79
diff --git a/arch/microblaze/include/asm/thread_info.h b/arch/microblaze/include/asm/thread_info.h
index e7e8954e9815..9afe4b5bd6c8 100644
--- a/arch/microblaze/include/asm/thread_info.h
+++ b/arch/microblaze/include/asm/thread_info.h
@@ -86,9 +86,6 @@ struct thread_info {
86 .addr_limit = KERNEL_DS, \ 86 .addr_limit = KERNEL_DS, \
87} 87}
88 88
89#define init_thread_info (init_thread_union.thread_info)
90#define init_stack (init_thread_union.stack)
91
92/* how to get the thread information struct from C */ 89/* how to get the thread information struct from C */
93static inline struct thread_info *current_thread_info(void) 90static inline struct thread_info *current_thread_info(void)
94{ 91{
diff --git a/arch/mips/include/asm/thread_info.h b/arch/mips/include/asm/thread_info.h
index 5e8927f99a76..4993db40482c 100644
--- a/arch/mips/include/asm/thread_info.h
+++ b/arch/mips/include/asm/thread_info.h
@@ -49,9 +49,6 @@ struct thread_info {
49 .addr_limit = KERNEL_DS, \ 49 .addr_limit = KERNEL_DS, \
50} 50}
51 51
52#define init_thread_info (init_thread_union.thread_info)
53#define init_stack (init_thread_union.stack)
54
55/* How to get the thread information struct from C. */ 52/* How to get the thread information struct from C. */
56register struct thread_info *__current_thread_info __asm__("$28"); 53register struct thread_info *__current_thread_info __asm__("$28");
57 54
diff --git a/arch/mn10300/include/asm/thread_info.h b/arch/mn10300/include/asm/thread_info.h
index f5f90bbf019d..1748a7b25bf8 100644
--- a/arch/mn10300/include/asm/thread_info.h
+++ b/arch/mn10300/include/asm/thread_info.h
@@ -79,8 +79,6 @@ struct thread_info {
79 .addr_limit = KERNEL_DS, \ 79 .addr_limit = KERNEL_DS, \
80} 80}
81 81
82#define init_thread_info (init_thread_union.thread_info)
83#define init_stack (init_thread_union.stack)
84#define init_uregs \ 82#define init_uregs \
85 ((struct pt_regs *) \ 83 ((struct pt_regs *) \
86 ((unsigned long) init_stack + THREAD_SIZE - sizeof(struct pt_regs))) 84 ((unsigned long) init_stack + THREAD_SIZE - sizeof(struct pt_regs)))
diff --git a/arch/nios2/include/asm/thread_info.h b/arch/nios2/include/asm/thread_info.h
index d69c338bd19c..7349a4fa635b 100644
--- a/arch/nios2/include/asm/thread_info.h
+++ b/arch/nios2/include/asm/thread_info.h
@@ -63,9 +63,6 @@ struct thread_info {
63 .addr_limit = KERNEL_DS, \ 63 .addr_limit = KERNEL_DS, \
64} 64}
65 65
66#define init_thread_info (init_thread_union.thread_info)
67#define init_stack (init_thread_union.stack)
68
69/* how to get the thread information struct from C */ 66/* how to get the thread information struct from C */
70static inline struct thread_info *current_thread_info(void) 67static inline struct thread_info *current_thread_info(void)
71{ 68{
diff --git a/arch/openrisc/include/asm/processor.h b/arch/openrisc/include/asm/processor.h
index 396d8f306c21..af31a9fe736a 100644
--- a/arch/openrisc/include/asm/processor.h
+++ b/arch/openrisc/include/asm/processor.h
@@ -84,8 +84,6 @@ void start_thread(struct pt_regs *regs, unsigned long nip, unsigned long sp);
84void release_thread(struct task_struct *); 84void release_thread(struct task_struct *);
85unsigned long get_wchan(struct task_struct *p); 85unsigned long get_wchan(struct task_struct *p);
86 86
87#define init_stack (init_thread_union.stack)
88
89#define cpu_relax() barrier() 87#define cpu_relax() barrier()
90 88
91#endif /* __ASSEMBLY__ */ 89#endif /* __ASSEMBLY__ */
diff --git a/arch/openrisc/include/asm/thread_info.h b/arch/openrisc/include/asm/thread_info.h
index c229aa6bb502..5c15dfa2fd4f 100644
--- a/arch/openrisc/include/asm/thread_info.h
+++ b/arch/openrisc/include/asm/thread_info.h
@@ -79,8 +79,6 @@ struct thread_info {
79 .ksp = 0, \ 79 .ksp = 0, \
80} 80}
81 81
82#define init_thread_info (init_thread_union.thread_info)
83
84/* how to get the thread information struct from C */ 82/* how to get the thread information struct from C */
85register struct thread_info *current_thread_info_reg asm("r10"); 83register struct thread_info *current_thread_info_reg asm("r10");
86#define current_thread_info() (current_thread_info_reg) 84#define current_thread_info() (current_thread_info_reg)
diff --git a/arch/parisc/include/asm/thread_info.h b/arch/parisc/include/asm/thread_info.h
index 598c8d60fa5e..285757544cca 100644
--- a/arch/parisc/include/asm/thread_info.h
+++ b/arch/parisc/include/asm/thread_info.h
@@ -25,9 +25,6 @@ struct thread_info {
25 .preempt_count = INIT_PREEMPT_COUNT, \ 25 .preempt_count = INIT_PREEMPT_COUNT, \
26} 26}
27 27
28#define init_thread_info (init_thread_union.thread_info)
29#define init_stack (init_thread_union.stack)
30
31/* how to get the thread information struct from C */ 28/* how to get the thread information struct from C */
32#define current_thread_info() ((struct thread_info *)mfctl(30)) 29#define current_thread_info() ((struct thread_info *)mfctl(30))
33 30
diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h
index a264c3ad366b..4a12c00f8de3 100644
--- a/arch/powerpc/include/asm/thread_info.h
+++ b/arch/powerpc/include/asm/thread_info.h
@@ -58,9 +58,6 @@ struct thread_info {
58 .flags = 0, \ 58 .flags = 0, \
59} 59}
60 60
61#define init_thread_info (init_thread_union.thread_info)
62#define init_stack (init_thread_union.stack)
63
64#define THREAD_SIZE_ORDER (THREAD_SHIFT - PAGE_SHIFT) 61#define THREAD_SIZE_ORDER (THREAD_SHIFT - PAGE_SHIFT)
65 62
66/* how to get the thread information struct from C */ 63/* how to get the thread information struct from C */
diff --git a/arch/riscv/include/asm/thread_info.h b/arch/riscv/include/asm/thread_info.h
index 22c3536ed281..f8fa1cd2dad9 100644
--- a/arch/riscv/include/asm/thread_info.h
+++ b/arch/riscv/include/asm/thread_info.h
@@ -64,8 +64,6 @@ struct thread_info {
64 .addr_limit = KERNEL_DS, \ 64 .addr_limit = KERNEL_DS, \
65} 65}
66 66
67#define init_stack (init_thread_union.stack)
68
69#endif /* !__ASSEMBLY__ */ 67#endif /* !__ASSEMBLY__ */
70 68
71/* 69/*
diff --git a/arch/s390/include/asm/thread_info.h b/arch/s390/include/asm/thread_info.h
index 0880a37b6d3b..25d6ec3aaddd 100644
--- a/arch/s390/include/asm/thread_info.h
+++ b/arch/s390/include/asm/thread_info.h
@@ -42,8 +42,6 @@ struct thread_info {
42 .flags = 0, \ 42 .flags = 0, \
43} 43}
44 44
45#define init_stack (init_thread_union.stack)
46
47void arch_release_task_struct(struct task_struct *tsk); 45void arch_release_task_struct(struct task_struct *tsk);
48int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src); 46int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src);
49 47
diff --git a/arch/score/include/asm/thread_info.h b/arch/score/include/asm/thread_info.h
index ad51b56e51bd..bc4c7c90550f 100644
--- a/arch/score/include/asm/thread_info.h
+++ b/arch/score/include/asm/thread_info.h
@@ -58,9 +58,6 @@ struct thread_info {
58 .addr_limit = KERNEL_DS, \ 58 .addr_limit = KERNEL_DS, \
59} 59}
60 60
61#define init_thread_info (init_thread_union.thread_info)
62#define init_stack (init_thread_union.stack)
63
64/* How to get the thread information struct from C. */ 61/* How to get the thread information struct from C. */
65register struct thread_info *__current_thread_info __asm__("r28"); 62register struct thread_info *__current_thread_info __asm__("r28");
66#define current_thread_info() __current_thread_info 63#define current_thread_info() __current_thread_info
diff --git a/arch/sh/include/asm/thread_info.h b/arch/sh/include/asm/thread_info.h
index becb798f1b04..cf5c792bf70b 100644
--- a/arch/sh/include/asm/thread_info.h
+++ b/arch/sh/include/asm/thread_info.h
@@ -63,9 +63,6 @@ struct thread_info {
63 .addr_limit = KERNEL_DS, \ 63 .addr_limit = KERNEL_DS, \
64} 64}
65 65
66#define init_thread_info (init_thread_union.thread_info)
67#define init_stack (init_thread_union.stack)
68
69/* how to get the current stack pointer from C */ 66/* how to get the current stack pointer from C */
70register unsigned long current_stack_pointer asm("r15") __used; 67register unsigned long current_stack_pointer asm("r15") __used;
71 68
diff --git a/arch/sparc/include/asm/thread_info_32.h b/arch/sparc/include/asm/thread_info_32.h
index febaaeb1a0fe..548b366165dd 100644
--- a/arch/sparc/include/asm/thread_info_32.h
+++ b/arch/sparc/include/asm/thread_info_32.h
@@ -63,9 +63,6 @@ struct thread_info {
63 .preempt_count = INIT_PREEMPT_COUNT, \ 63 .preempt_count = INIT_PREEMPT_COUNT, \
64} 64}
65 65
66#define init_thread_info (init_thread_union.thread_info)
67#define init_stack (init_thread_union.stack)
68
69/* how to get the thread information struct from C */ 66/* how to get the thread information struct from C */
70register struct thread_info *current_thread_info_reg asm("g6"); 67register struct thread_info *current_thread_info_reg asm("g6");
71#define current_thread_info() (current_thread_info_reg) 68#define current_thread_info() (current_thread_info_reg)
diff --git a/arch/sparc/include/asm/thread_info_64.h b/arch/sparc/include/asm/thread_info_64.h
index caf915321ba9..f7e7b0baec9f 100644
--- a/arch/sparc/include/asm/thread_info_64.h
+++ b/arch/sparc/include/asm/thread_info_64.h
@@ -120,9 +120,6 @@ struct thread_info {
120 .preempt_count = INIT_PREEMPT_COUNT, \ 120 .preempt_count = INIT_PREEMPT_COUNT, \
121} 121}
122 122
123#define init_thread_info (init_thread_union.thread_info)
124#define init_stack (init_thread_union.stack)
125
126/* how to get the thread information struct from C */ 123/* how to get the thread information struct from C */
127register struct thread_info *current_thread_info_reg asm("g6"); 124register struct thread_info *current_thread_info_reg asm("g6");
128#define current_thread_info() (current_thread_info_reg) 125#define current_thread_info() (current_thread_info_reg)
diff --git a/arch/tile/include/asm/thread_info.h b/arch/tile/include/asm/thread_info.h
index b7659b8f1117..2adcacd85749 100644
--- a/arch/tile/include/asm/thread_info.h
+++ b/arch/tile/include/asm/thread_info.h
@@ -59,9 +59,6 @@ struct thread_info {
59 .align_ctl = 0, \ 59 .align_ctl = 0, \
60} 60}
61 61
62#define init_thread_info (init_thread_union.thread_info)
63#define init_stack (init_thread_union.stack)
64
65#endif /* !__ASSEMBLY__ */ 62#endif /* !__ASSEMBLY__ */
66 63
67#if PAGE_SIZE < 8192 64#if PAGE_SIZE < 8192
diff --git a/arch/um/include/asm/processor-generic.h b/arch/um/include/asm/processor-generic.h
index 86942a492454..b58b746d3f2c 100644
--- a/arch/um/include/asm/processor-generic.h
+++ b/arch/um/include/asm/processor-generic.h
@@ -58,7 +58,10 @@ static inline void release_thread(struct task_struct *task)
58{ 58{
59} 59}
60 60
61#define init_stack (init_thread_union.stack) 61static inline void mm_copy_segments(struct mm_struct *from_mm,
62 struct mm_struct *new_mm)
63{
64}
62 65
63/* 66/*
64 * User space process size: 3GB (default). 67 * User space process size: 3GB (default).
diff --git a/arch/um/include/asm/thread_info.h b/arch/um/include/asm/thread_info.h
index 9300f7630d2a..4eecd960ee8c 100644
--- a/arch/um/include/asm/thread_info.h
+++ b/arch/um/include/asm/thread_info.h
@@ -6,6 +6,9 @@
6#ifndef __UM_THREAD_INFO_H 6#ifndef __UM_THREAD_INFO_H
7#define __UM_THREAD_INFO_H 7#define __UM_THREAD_INFO_H
8 8
9#define THREAD_SIZE_ORDER CONFIG_KERNEL_STACK_ORDER
10#define THREAD_SIZE ((1 << CONFIG_KERNEL_STACK_ORDER) * PAGE_SIZE)
11
9#ifndef __ASSEMBLY__ 12#ifndef __ASSEMBLY__
10 13
11#include <asm/types.h> 14#include <asm/types.h>
@@ -37,10 +40,6 @@ struct thread_info {
37 .real_thread = NULL, \ 40 .real_thread = NULL, \
38} 41}
39 42
40#define init_thread_info (init_thread_union.thread_info)
41#define init_stack (init_thread_union.stack)
42
43#define THREAD_SIZE ((1 << CONFIG_KERNEL_STACK_ORDER) * PAGE_SIZE)
44/* how to get the thread information struct from C */ 43/* how to get the thread information struct from C */
45static inline struct thread_info *current_thread_info(void) 44static inline struct thread_info *current_thread_info(void)
46{ 45{
@@ -53,8 +52,6 @@ static inline struct thread_info *current_thread_info(void)
53 return ti; 52 return ti;
54} 53}
55 54
56#define THREAD_SIZE_ORDER CONFIG_KERNEL_STACK_ORDER
57
58#endif 55#endif
59 56
60#define TIF_SYSCALL_TRACE 0 /* syscall trace active */ 57#define TIF_SYSCALL_TRACE 0 /* syscall trace active */
diff --git a/arch/um/include/asm/vmlinux.lds.h b/arch/um/include/asm/vmlinux.lds.h
new file mode 100644
index 000000000000..149494ae78ea
--- /dev/null
+++ b/arch/um/include/asm/vmlinux.lds.h
@@ -0,0 +1,2 @@
1#include <asm/thread_info.h>
2#include <asm-generic/vmlinux.lds.h>
diff --git a/arch/um/kernel/dyn.lds.S b/arch/um/kernel/dyn.lds.S
index d417e3899700..5568cf882371 100644
--- a/arch/um/kernel/dyn.lds.S
+++ b/arch/um/kernel/dyn.lds.S
@@ -1,5 +1,4 @@
1/* SPDX-License-Identifier: GPL-2.0 */ 1#include <asm/vmlinux.lds.h>
2#include <asm-generic/vmlinux.lds.h>
3#include <asm/page.h> 2#include <asm/page.h>
4 3
5OUTPUT_FORMAT(ELF_FORMAT) 4OUTPUT_FORMAT(ELF_FORMAT)
diff --git a/arch/um/kernel/um_arch.c b/arch/um/kernel/um_arch.c
index f433690b9b37..a818ccef30ca 100644
--- a/arch/um/kernel/um_arch.c
+++ b/arch/um/kernel/um_arch.c
@@ -54,7 +54,7 @@ struct cpuinfo_um boot_cpu_data = {
54 54
55union thread_union cpu0_irqstack 55union thread_union cpu0_irqstack
56 __attribute__((__section__(".data..init_irqstack"))) = 56 __attribute__((__section__(".data..init_irqstack"))) =
57 { INIT_THREAD_INFO(init_task) }; 57 { .thread_info = INIT_THREAD_INFO(init_task) };
58 58
59/* Changed in setup_arch, which is called in early boot */ 59/* Changed in setup_arch, which is called in early boot */
60static char host_info[(__NEW_UTS_LEN + 1) * 5]; 60static char host_info[(__NEW_UTS_LEN + 1) * 5];
diff --git a/arch/um/kernel/uml.lds.S b/arch/um/kernel/uml.lds.S
index 3d6ed6ba5b78..36b07ec09742 100644
--- a/arch/um/kernel/uml.lds.S
+++ b/arch/um/kernel/uml.lds.S
@@ -1,5 +1,5 @@
1/* SPDX-License-Identifier: GPL-2.0 */ 1/* SPDX-License-Identifier: GPL-2.0 */
2#include <asm-generic/vmlinux.lds.h> 2#include <asm/vmlinux.lds.h>
3#include <asm/page.h> 3#include <asm/page.h>
4 4
5OUTPUT_FORMAT(ELF_FORMAT) 5OUTPUT_FORMAT(ELF_FORMAT)
diff --git a/arch/unicore32/include/asm/thread_info.h b/arch/unicore32/include/asm/thread_info.h
index e79ad6d5b5b2..5fb728f3b49a 100644
--- a/arch/unicore32/include/asm/thread_info.h
+++ b/arch/unicore32/include/asm/thread_info.h
@@ -87,9 +87,6 @@ struct thread_info {
87 .addr_limit = KERNEL_DS, \ 87 .addr_limit = KERNEL_DS, \
88} 88}
89 89
90#define init_thread_info (init_thread_union.thread_info)
91#define init_stack (init_thread_union.stack)
92
93/* 90/*
94 * how to get the thread information struct from C 91 * how to get the thread information struct from C
95 */ 92 */
diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h
index 00223333821a..d25a638a2720 100644
--- a/arch/x86/include/asm/thread_info.h
+++ b/arch/x86/include/asm/thread_info.h
@@ -62,8 +62,6 @@ struct thread_info {
62 .flags = 0, \ 62 .flags = 0, \
63} 63}
64 64
65#define init_stack (init_thread_union.stack)
66
67#else /* !__ASSEMBLY__ */ 65#else /* !__ASSEMBLY__ */
68 66
69#include <asm/asm-offsets.h> 67#include <asm/asm-offsets.h>
diff --git a/arch/xtensa/include/asm/thread_info.h b/arch/xtensa/include/asm/thread_info.h
index 7be2400f745a..2ccd37510aaa 100644
--- a/arch/xtensa/include/asm/thread_info.h
+++ b/arch/xtensa/include/asm/thread_info.h
@@ -77,9 +77,6 @@ struct thread_info {
77 .addr_limit = KERNEL_DS, \ 77 .addr_limit = KERNEL_DS, \
78} 78}
79 79
80#define init_thread_info (init_thread_union.thread_info)
81#define init_stack (init_thread_union.stack)
82
83/* how to get the thread information struct from C */ 80/* how to get the thread information struct from C */
84static inline struct thread_info *current_thread_info(void) 81static inline struct thread_info *current_thread_info(void)
85{ 82{
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index ee8b707d9fa9..a564b83bf013 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -268,7 +268,11 @@
268#define INIT_TASK_DATA(align) \ 268#define INIT_TASK_DATA(align) \
269 . = ALIGN(align); \ 269 . = ALIGN(align); \
270 VMLINUX_SYMBOL(__start_init_task) = .; \ 270 VMLINUX_SYMBOL(__start_init_task) = .; \
271 VMLINUX_SYMBOL(init_thread_union) = .; \
272 VMLINUX_SYMBOL(init_stack) = .; \
271 *(.data..init_task) \ 273 *(.data..init_task) \
274 *(.data..init_thread_info) \
275 . = VMLINUX_SYMBOL(__start_init_task) + THREAD_SIZE; \
272 VMLINUX_SYMBOL(__end_init_task) = .; 276 VMLINUX_SYMBOL(__end_init_task) = .;
273 277
274/* 278/*
diff --git a/include/linux/init_task.h b/include/linux/init_task.h
index 6a532629c983..30a89b99a5af 100644
--- a/include/linux/init_task.h
+++ b/include/linux/init_task.h
@@ -304,5 +304,8 @@ extern struct cred init_cred;
304/* Attach to the init_task data structure for proper alignment */ 304/* Attach to the init_task data structure for proper alignment */
305#define __init_task_data __attribute__((__section__(".data..init_task"))) 305#define __init_task_data __attribute__((__section__(".data..init_task")))
306 306
307/* Attach to the thread_info data structure for proper alignment */
308#define __init_thread_info __attribute__((__section__(".data..init_thread_info")))
309
307 310
308#endif 311#endif
diff --git a/include/linux/sched.h b/include/linux/sched.h
index d2588263a989..68a504f6e474 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1446,12 +1446,21 @@ extern void ia64_set_curr_task(int cpu, struct task_struct *p);
1446void yield(void); 1446void yield(void);
1447 1447
1448union thread_union { 1448union thread_union {
1449#ifndef CONFIG_ARCH_TASK_STRUCT_ON_STACK
1450 struct task_struct task;
1451#endif
1449#ifndef CONFIG_THREAD_INFO_IN_TASK 1452#ifndef CONFIG_THREAD_INFO_IN_TASK
1450 struct thread_info thread_info; 1453 struct thread_info thread_info;
1451#endif 1454#endif
1452 unsigned long stack[THREAD_SIZE/sizeof(long)]; 1455 unsigned long stack[THREAD_SIZE/sizeof(long)];
1453}; 1456};
1454 1457
1458#ifndef CONFIG_THREAD_INFO_IN_TASK
1459extern struct thread_info init_thread_info;
1460#endif
1461
1462extern unsigned long init_stack[THREAD_SIZE / sizeof(unsigned long)];
1463
1455#ifdef CONFIG_THREAD_INFO_IN_TASK 1464#ifdef CONFIG_THREAD_INFO_IN_TASK
1456static inline struct thread_info *task_thread_info(struct task_struct *task) 1465static inline struct thread_info *task_thread_info(struct task_struct *task)
1457{ 1466{
diff --git a/init/Makefile b/init/Makefile
index 1dbb23787290..a3e5ce2bcf08 100644
--- a/init/Makefile
+++ b/init/Makefile
@@ -13,9 +13,7 @@ obj-$(CONFIG_BLK_DEV_INITRD) += initramfs.o
13endif 13endif
14obj-$(CONFIG_GENERIC_CALIBRATE_DELAY) += calibrate.o 14obj-$(CONFIG_GENERIC_CALIBRATE_DELAY) += calibrate.o
15 15
16ifneq ($(CONFIG_ARCH_INIT_TASK),y)
17obj-y += init_task.o 16obj-y += init_task.o
18endif
19 17
20mounts-y := do_mounts.o 18mounts-y := do_mounts.o
21mounts-$(CONFIG_BLK_DEV_RAM) += do_mounts_rd.o 19mounts-$(CONFIG_BLK_DEV_RAM) += do_mounts_rd.o
diff --git a/init/init_task.c b/init/init_task.c
index 9325fee7dc82..2285aa42cbe1 100644
--- a/init/init_task.c
+++ b/init/init_task.c
@@ -17,15 +17,17 @@ static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
17static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); 17static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
18 18
19/* Initial task structure */ 19/* Initial task structure */
20struct task_struct init_task = INIT_TASK(init_task); 20struct task_struct init_task
21#ifdef CONFIG_ARCH_TASK_STRUCT_ON_STACK
22 __init_task_data
23#endif
24 = INIT_TASK(init_task);
21EXPORT_SYMBOL(init_task); 25EXPORT_SYMBOL(init_task);
22 26
23/* 27/*
24 * Initial thread structure. Alignment of this is handled by a special 28 * Initial thread structure. Alignment of this is handled by a special
25 * linker map entry. 29 * linker map entry.
26 */ 30 */
27union thread_union init_thread_union __init_task_data = {
28#ifndef CONFIG_THREAD_INFO_IN_TASK 31#ifndef CONFIG_THREAD_INFO_IN_TASK
29 INIT_THREAD_INFO(init_task) 32struct thread_info init_thread_info __init_thread_info = INIT_THREAD_INFO(init_task);
30#endif 33#endif
31};