s390: move thread_info into task_struct
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Tue, 8 Nov 2016 10:08:26 +0000 (11:08 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Fri, 11 Nov 2016 15:37:41 +0000 (16:37 +0100)
This is the s390 variant of commit 15f4eae70d36 ("x86: Move
thread_info into task_struct").

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/Kconfig
arch/s390/include/asm/lowcore.h
arch/s390/include/asm/thread_info.h
arch/s390/kernel/asm-offsets.c
arch/s390/kernel/entry.S
arch/s390/kernel/head64.S
arch/s390/kernel/setup.c
arch/s390/kernel/smp.c

index 426481d..a159dfc 100644 (file)
@@ -169,6 +169,7 @@ config S390
        select OLD_SIGSUSPEND3
        select SPARSE_IRQ
        select SYSCTL_EXCEPTION_TRACE
+       select THREAD_INFO_IN_TASK
        select TTY
        select VIRT_CPU_ACCOUNTING
        select VIRT_TO_BUS
index 1df1e62..9bfad2a 100644 (file)
@@ -95,7 +95,7 @@ struct lowcore {
 
        /* Current process. */
        __u64   current_task;                   /* 0x0310 */
-       __u64   thread_info;                    /* 0x0318 */
+       __u8    pad_0x318[0x320-0x318];         /* 0x0318 */
        __u64   kernel_stack;                   /* 0x0320 */
 
        /* Interrupt, panic and restart stack. */
index 9337941..ef02b1c 100644 (file)
  * - if the contents of this structure are changed, the assembly constants must also be changed
  */
 struct thread_info {
-       struct task_struct      *task;          /* main task structure */
        unsigned long           flags;          /* low level flags */
        unsigned long           sys_call_table; /* System call table address */
-       unsigned int            cpu;            /* current CPU */
        unsigned int            system_call;
        __u64                   user_timer;
        __u64                   system_timer;
@@ -45,20 +43,11 @@ struct thread_info {
  */
 #define INIT_THREAD_INFO(tsk)                  \
 {                                              \
-       .task           = &tsk,                 \
        .flags          = 0,                    \
-       .cpu            = 0,                    \
 }
 
-#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 */
-static inline struct thread_info *current_thread_info(void)
-{
-       return (struct thread_info *) S390_lowcore.thread_info;
-}
-
 void arch_release_task_struct(struct task_struct *tsk);
 int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src);
 
index 6be10e4..56258a4 100644 (file)
@@ -25,7 +25,7 @@
 int main(void)
 {
        /* task struct offsets */
-       OFFSET(__TASK_thread_info, task_struct, stack);
+       OFFSET(__TASK_stack, task_struct, stack);
        OFFSET(__TASK_thread, task_struct, thread);
        OFFSET(__TASK_pid, task_struct, pid);
        BLANK();
@@ -39,13 +39,11 @@ int main(void)
        OFFSET(__THREAD_trap_tdb, thread_struct, trap_tdb);
        BLANK();
        /* thread info offsets */
-       OFFSET(__TI_task, thread_info, task);
-       OFFSET(__TI_flags, thread_info, flags);
-       OFFSET(__TI_sysc_table, thread_info, sys_call_table);
-       OFFSET(__TI_cpu, thread_info, cpu);
-       OFFSET(__TI_user_timer, thread_info, user_timer);
-       OFFSET(__TI_system_timer, thread_info, system_timer);
-       OFFSET(__TI_last_break, thread_info, last_break);
+       OFFSET(__TI_flags, task_struct, thread_info.flags);
+       OFFSET(__TI_sysc_table,  task_struct, thread_info.sys_call_table);
+       OFFSET(__TI_user_timer, task_struct, thread_info.user_timer);
+       OFFSET(__TI_system_timer, task_struct, thread_info.system_timer);
+       OFFSET(__TI_last_break, task_struct, thread_info.last_break);
        BLANK();
        /* pt_regs offsets */
        OFFSET(__PT_ARGS, pt_regs, args);
@@ -160,7 +158,6 @@ int main(void)
        OFFSET(__LC_INT_CLOCK, lowcore, int_clock);
        OFFSET(__LC_MCCK_CLOCK, lowcore, mcck_clock);
        OFFSET(__LC_CURRENT, lowcore, current_task);
-       OFFSET(__LC_THREAD_INFO, lowcore, thread_info);
        OFFSET(__LC_KERNEL_STACK, lowcore, kernel_stack);
        OFFSET(__LC_ASYNC_STACK, lowcore, async_stack);
        OFFSET(__LC_PANIC_STACK, lowcore, panic_stack);
index 3f4a163..06cc1e6 100644 (file)
@@ -186,14 +186,13 @@ ENTRY(__switch_to)
        stmg    %r6,%r15,__SF_GPRS(%r15)        # store gprs of prev task
        lgr     %r1,%r2
        aghi    %r1,__TASK_thread               # thread_struct of prev task
-       lg      %r5,__TASK_thread_info(%r3)     # get thread_info of next
+       lg      %r5,__TASK_stack(%r3)           # start of kernel stack of next
        stg     %r15,__THREAD_ksp(%r1)          # store kernel stack of prev
        lgr     %r1,%r3
        aghi    %r1,__TASK_thread               # thread_struct of next task
        lgr     %r15,%r5
        aghi    %r15,STACK_INIT                 # end of kernel stack of next
        stg     %r3,__LC_CURRENT                # store task struct of next
-       stg     %r5,__LC_THREAD_INFO            # store thread info of next
        stg     %r15,__LC_KERNEL_STACK          # store end of kernel stack
        lg      %r15,__THREAD_ksp(%r1)          # load kernel stack of next
        /* c4 is used in guest detection: arch/s390/kernel/perf_cpum_sf.c */
@@ -274,7 +273,7 @@ ENTRY(system_call)
 .Lsysc_stmg:
        stmg    %r8,%r15,__LC_SAVE_AREA_SYNC
        lg      %r10,__LC_LAST_BREAK
-       lg      %r12,__LC_THREAD_INFO
+       lg      %r12,__LC_CURRENT
        lghi    %r14,_PIF_SYSCALL
 .Lsysc_per:
        lg      %r15,__LC_KERNEL_STACK
@@ -457,7 +456,7 @@ ENTRY(system_call)
 #
 ENTRY(ret_from_fork)
        la      %r11,STACK_FRAME_OVERHEAD(%r15)
-       lg      %r12,__LC_THREAD_INFO
+       lg      %r12,__LC_CURRENT
        brasl   %r14,schedule_tail
        TRACE_IRQS_ON
        ssm     __LC_SVC_NEW_PSW        # reenable interrupts
@@ -478,7 +477,7 @@ ENTRY(pgm_check_handler)
        stpt    __LC_SYNC_ENTER_TIMER
        stmg    %r8,%r15,__LC_SAVE_AREA_SYNC
        lg      %r10,__LC_LAST_BREAK
-       lg      %r12,__LC_THREAD_INFO
+       lg      %r12,__LC_CURRENT
        larl    %r13,cleanup_critical
        lmg     %r8,%r9,__LC_PGM_OLD_PSW
        tmhh    %r8,0x0001              # test problem state bit
@@ -501,7 +500,7 @@ ENTRY(pgm_check_handler)
 2:     LAST_BREAK %r14
        UPDATE_VTIME %r14,%r15,__LC_SYNC_ENTER_TIMER
        lg      %r15,__LC_KERNEL_STACK
-       lg      %r14,__TI_task(%r12)
+       lgr     %r14,%r12
        aghi    %r14,__TASK_thread      # pointer to thread_struct
        lghi    %r13,__LC_PGM_TDB
        tm      __LC_PGM_ILC+2,0x02     # check for transaction abort
@@ -567,7 +566,7 @@ ENTRY(io_int_handler)
        stpt    __LC_ASYNC_ENTER_TIMER
        stmg    %r8,%r15,__LC_SAVE_AREA_ASYNC
        lg      %r10,__LC_LAST_BREAK
-       lg      %r12,__LC_THREAD_INFO
+       lg      %r12,__LC_CURRENT
        larl    %r13,cleanup_critical
        lmg     %r8,%r9,__LC_IO_OLD_PSW
        SWITCH_ASYNC __LC_SAVE_AREA_ASYNC,__LC_ASYNC_ENTER_TIMER
@@ -741,7 +740,7 @@ ENTRY(ext_int_handler)
        stpt    __LC_ASYNC_ENTER_TIMER
        stmg    %r8,%r15,__LC_SAVE_AREA_ASYNC
        lg      %r10,__LC_LAST_BREAK
-       lg      %r12,__LC_THREAD_INFO
+       lg      %r12,__LC_CURRENT
        larl    %r13,cleanup_critical
        lmg     %r8,%r9,__LC_EXT_OLD_PSW
        SWITCH_ASYNC __LC_SAVE_AREA_ASYNC,__LC_ASYNC_ENTER_TIMER
@@ -889,7 +888,7 @@ ENTRY(mcck_int_handler)
        spt     __LC_CPU_TIMER_SAVE_AREA-4095(%r1)      # revalidate cpu timer
        lmg     %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)# revalidate gprs
        lg      %r10,__LC_LAST_BREAK
-       lg      %r12,__LC_THREAD_INFO
+       lg      %r12,__LC_CURRENT
        larl    %r13,cleanup_critical
        lmg     %r8,%r9,__LC_MCK_OLD_PSW
        TSTMSK  __LC_MCCK_CODE,MCCK_CODE_SYSTEM_DAMAGE
index 03c2b46..a46201d 100644 (file)
@@ -32,10 +32,9 @@ ENTRY(startup_continue)
 #
 # Setup stack
 #
-       larl    %r15,init_thread_union
-       stg     %r15,__LC_THREAD_INFO   # cache thread info in lowcore
-       lg      %r14,__TI_task(%r15)    # cache current in lowcore
+       larl    %r14,init_task
        stg     %r14,__LC_CURRENT
+       larl    %r15,init_thread_union
        aghi    %r15,1<<(PAGE_SHIFT+THREAD_ORDER) # init_task_union + THREAD_SIZE
        stg     %r15,__LC_KERNEL_STACK  # set end of kernel stack
        aghi    %r15,-160
index 268d6c1..b75da68 100644 (file)
@@ -329,8 +329,7 @@ static void __init setup_lowcore(void)
        lc->panic_stack = (unsigned long)
                __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, 0)
                + PAGE_SIZE - STACK_FRAME_OVERHEAD - sizeof(struct pt_regs);
-       lc->current_task = (unsigned long) init_thread_union.thread_info.task;
-       lc->thread_info = (unsigned long) &init_thread_union;
+       lc->current_task = (unsigned long)&init_task;
        lc->lpp = LPP_MAGIC;
        lc->machine_flags = S390_lowcore.machine_flags;
        lc->preempt_count = S390_lowcore.preempt_count;
index 35531fe..8c7ab7b 100644 (file)
@@ -263,7 +263,6 @@ static void pcpu_attach_task(struct pcpu *pcpu, struct task_struct *tsk)
 
        lc->kernel_stack = (unsigned long) task_stack_page(tsk)
                + THREAD_SIZE - STACK_FRAME_OVERHEAD - sizeof(struct pt_regs);
-       lc->thread_info = (unsigned long) task_thread_info(tsk);
        lc->current_task = (unsigned long) tsk;
        lc->lpp = LPP_MAGIC;
        lc->current_pid = tsk->pid;