* [RFC PATCH v3 0/7] powerpc: Switch to CONFIG_THREAD_INFO_IN_TASK
@ 2018-10-01 12:30 Christophe Leroy
2018-10-01 12:30 ` [RFC PATCH v3 1/7] book3s/64: avoid circular header inclusion in mmu-hash.h Christophe Leroy
` (6 more replies)
0 siblings, 7 replies; 32+ messages in thread
From: Christophe Leroy @ 2018-10-01 12:30 UTC (permalink / raw)
To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, npiggin
Cc: linux-kernel, linuxppc-dev
The purpose of this serie is to activate CONFIG_THREAD_INFO_IN_TASK which
moves the thread_info into task_struct.
Moving thread_info into task_struct has the following advantages:
- It protects thread_info from corruption in the case of stack
overflows.
- Its address is harder to determine if stack addresses are
leaked, making a number of attacks more difficult.
Changes since RFC v2:
- Removed the modification of names in asm-offsets
- Created a rule in arch/powerpc/Makefile to append the offset of current->cpu in CFLAGS
- Modified asm/smp.h to use the offset set in CFLAGS
- Squashed the renaming of THREAD_INFO to TASK_STACK in the preparation patch
- Moved the modification of current_pt_regs in the patch activating CONFIG_THREAD_INFO_IN_TASK
Changes since RFC v1:
- Removed the first patch which was modifying header inclusion order in timer
- Modified some names in asm-offsets to avoid conflicts when including asm-offsets in C files
- Modified asm/smp.h to avoid having to include linux/sched.h (using asm-offsets instead)
- Moved some changes from the activation patch to the preparation patch.
Christophe Leroy (7):
book3s/64: avoid circular header inclusion in mmu-hash.h
powerpc: Prepare for moving thread_info into task_struct
powerpc: Activate CONFIG_THREAD_INFO_IN_TASK
powerpc: regain entire stack space
powerpc: 'current_set' is now a table of task_struct pointers
powerpc/32: Remove CURRENT_THREAD_INFO and rename TI_CPU
powerpc/64: Modify CURRENT_THREAD_INFO()
arch/powerpc/Kconfig | 1 +
arch/powerpc/Makefile | 6 +++
arch/powerpc/include/asm/asm-prototypes.h | 4 +-
arch/powerpc/include/asm/book3s/64/mmu-hash.h | 2 +-
arch/powerpc/include/asm/exception-64s.h | 4 +-
arch/powerpc/include/asm/irq.h | 14 +++---
arch/powerpc/include/asm/livepatch.h | 2 +-
arch/powerpc/include/asm/processor.h | 39 ++-------------
arch/powerpc/include/asm/ptrace.h | 2 +-
arch/powerpc/include/asm/reg.h | 2 +-
arch/powerpc/include/asm/smp.h | 8 +++-
arch/powerpc/include/asm/task_size.h | 42 ++++++++++++++++
arch/powerpc/include/asm/thread_info.h | 17 +------
arch/powerpc/kernel/asm-offsets.c | 8 ++--
arch/powerpc/kernel/entry_32.S | 66 +++++++++-----------------
arch/powerpc/kernel/entry_64.S | 12 ++---
arch/powerpc/kernel/epapr_hcalls.S | 5 +-
arch/powerpc/kernel/exceptions-64e.S | 13 +----
arch/powerpc/kernel/exceptions-64s.S | 2 +-
arch/powerpc/kernel/head_32.S | 14 +++---
arch/powerpc/kernel/head_40x.S | 4 +-
arch/powerpc/kernel/head_44x.S | 8 ++--
arch/powerpc/kernel/head_64.S | 1 +
arch/powerpc/kernel/head_8xx.S | 2 +-
arch/powerpc/kernel/head_booke.h | 12 ++---
arch/powerpc/kernel/head_fsl_booke.S | 16 +++----
arch/powerpc/kernel/idle_6xx.S | 8 ++--
arch/powerpc/kernel/idle_book3e.S | 2 +-
arch/powerpc/kernel/idle_e500.S | 8 ++--
arch/powerpc/kernel/idle_power4.S | 2 +-
arch/powerpc/kernel/irq.c | 66 ++++----------------------
arch/powerpc/kernel/kgdb.c | 28 -----------
arch/powerpc/kernel/machine_kexec_64.c | 6 +--
arch/powerpc/kernel/misc_32.S | 17 +++----
arch/powerpc/kernel/process.c | 15 +++---
arch/powerpc/kernel/setup-common.c | 2 +-
arch/powerpc/kernel/setup_32.c | 15 ++----
arch/powerpc/kernel/setup_64.c | 29 ++---------
arch/powerpc/kernel/smp.c | 16 +++----
arch/powerpc/kernel/trace/ftrace_64_mprofile.S | 6 +--
arch/powerpc/kvm/book3s_hv_hmi.c | 1 +
arch/powerpc/mm/hash_low_32.S | 14 ++----
arch/powerpc/sysdev/6xx-suspend.S | 5 +-
arch/powerpc/xmon/xmon.c | 2 +-
44 files changed, 203 insertions(+), 345 deletions(-)
create mode 100644 arch/powerpc/include/asm/task_size.h
--
2.13.3
^ permalink raw reply [flat|nested] 32+ messages in thread
* [RFC PATCH v3 1/7] book3s/64: avoid circular header inclusion in mmu-hash.h
2018-10-01 12:30 [RFC PATCH v3 0/7] powerpc: Switch to CONFIG_THREAD_INFO_IN_TASK Christophe Leroy
@ 2018-10-01 12:30 ` Christophe Leroy
2018-10-03 4:24 ` Nicholas Piggin
2018-10-01 12:30 ` [RFC PATCH v3 2/7] powerpc: Prepare for moving thread_info into task_struct Christophe Leroy
` (5 subsequent siblings)
6 siblings, 1 reply; 32+ messages in thread
From: Christophe Leroy @ 2018-10-01 12:30 UTC (permalink / raw)
To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, npiggin
Cc: linux-kernel, linuxppc-dev
When activating CONFIG_THREAD_INFO_IN_TASK, linux/sched.h
includes asm/current.h. This generates a circular dependency.
To avoid that, asm/processor.h shall not be included in mmu-hash.h
In order to do that, this patch moves into a new header called
asm/task_size.h the information from asm/processor.h requires by
mmu-hash.h
Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
---
arch/powerpc/include/asm/book3s/64/mmu-hash.h | 2 +-
arch/powerpc/include/asm/processor.h | 34 +---------------------
arch/powerpc/include/asm/task_size.h | 42 +++++++++++++++++++++++++++
arch/powerpc/kvm/book3s_hv_hmi.c | 1 +
4 files changed, 45 insertions(+), 34 deletions(-)
create mode 100644 arch/powerpc/include/asm/task_size.h
diff --git a/arch/powerpc/include/asm/book3s/64/mmu-hash.h b/arch/powerpc/include/asm/book3s/64/mmu-hash.h
index bbeaf6adf93c..7788e35f19f0 100644
--- a/arch/powerpc/include/asm/book3s/64/mmu-hash.h
+++ b/arch/powerpc/include/asm/book3s/64/mmu-hash.h
@@ -23,7 +23,7 @@
*/
#include <asm/book3s/64/pgtable.h>
#include <asm/bug.h>
-#include <asm/processor.h>
+#include <asm/task_size.h>
#include <asm/cpu_has_feature.h>
/*
diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h
index 350c584ca179..353879db3e98 100644
--- a/arch/powerpc/include/asm/processor.h
+++ b/arch/powerpc/include/asm/processor.h
@@ -101,40 +101,8 @@ void release_thread(struct task_struct *);
#endif
#ifdef CONFIG_PPC64
-/*
- * 64-bit user address space can have multiple limits
- * For now supported values are:
- */
-#define TASK_SIZE_64TB (0x0000400000000000UL)
-#define TASK_SIZE_128TB (0x0000800000000000UL)
-#define TASK_SIZE_512TB (0x0002000000000000UL)
-#define TASK_SIZE_1PB (0x0004000000000000UL)
-#define TASK_SIZE_2PB (0x0008000000000000UL)
-/*
- * With 52 bits in the address we can support
- * upto 4PB of range.
- */
-#define TASK_SIZE_4PB (0x0010000000000000UL)
-/*
- * For now 512TB is only supported with book3s and 64K linux page size.
- */
-#if defined(CONFIG_PPC_BOOK3S_64) && defined(CONFIG_PPC_64K_PAGES)
-/*
- * Max value currently used:
- */
-#define TASK_SIZE_USER64 TASK_SIZE_4PB
-#define DEFAULT_MAP_WINDOW_USER64 TASK_SIZE_128TB
-#define TASK_CONTEXT_SIZE TASK_SIZE_512TB
-#else
-#define TASK_SIZE_USER64 TASK_SIZE_64TB
-#define DEFAULT_MAP_WINDOW_USER64 TASK_SIZE_64TB
-/*
- * We don't need to allocate extended context ids for 4K page size, because
- * we limit the max effective address on this config to 64TB.
- */
-#define TASK_CONTEXT_SIZE TASK_SIZE_64TB
-#endif
+#include <asm/task_size.h>
/*
* 32-bit user address space is 4GB - 1 page
diff --git a/arch/powerpc/include/asm/task_size.h b/arch/powerpc/include/asm/task_size.h
new file mode 100644
index 000000000000..ca45638617b0
--- /dev/null
+++ b/arch/powerpc/include/asm/task_size.h
@@ -0,0 +1,42 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _ASM_POWERPC_TASK_SIZE_H
+#define _ASM_POWERPC_TASK_SIZE_H
+
+#ifdef CONFIG_PPC64
+/*
+ * 64-bit user address space can have multiple limits
+ * For now supported values are:
+ */
+#define TASK_SIZE_64TB (0x0000400000000000UL)
+#define TASK_SIZE_128TB (0x0000800000000000UL)
+#define TASK_SIZE_512TB (0x0002000000000000UL)
+#define TASK_SIZE_1PB (0x0004000000000000UL)
+#define TASK_SIZE_2PB (0x0008000000000000UL)
+/*
+ * With 52 bits in the address we can support
+ * upto 4PB of range.
+ */
+#define TASK_SIZE_4PB (0x0010000000000000UL)
+
+/*
+ * For now 512TB is only supported with book3s and 64K linux page size.
+ */
+#if defined(CONFIG_PPC_BOOK3S_64) && defined(CONFIG_PPC_64K_PAGES)
+/*
+ * Max value currently used:
+ */
+#define TASK_SIZE_USER64 TASK_SIZE_4PB
+#define DEFAULT_MAP_WINDOW_USER64 TASK_SIZE_128TB
+#define TASK_CONTEXT_SIZE TASK_SIZE_512TB
+#else
+#define TASK_SIZE_USER64 TASK_SIZE_64TB
+#define DEFAULT_MAP_WINDOW_USER64 TASK_SIZE_64TB
+/*
+ * We don't need to allocate extended context ids for 4K page size, because
+ * we limit the max effective address on this config to 64TB.
+ */
+#define TASK_CONTEXT_SIZE TASK_SIZE_64TB
+#endif
+
+#endif /* CONFIG_PPC64 */
+#endif /* _ASM_POWERPC_TASK_SIZE_H */
diff --git a/arch/powerpc/kvm/book3s_hv_hmi.c b/arch/powerpc/kvm/book3s_hv_hmi.c
index e3f738eb1cac..64b5011475c7 100644
--- a/arch/powerpc/kvm/book3s_hv_hmi.c
+++ b/arch/powerpc/kvm/book3s_hv_hmi.c
@@ -24,6 +24,7 @@
#include <linux/compiler.h>
#include <asm/paca.h>
#include <asm/hmi.h>
+#include <asm/processor.h>
void wait_for_subcore_guest_exit(void)
{
--
2.13.3
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [RFC PATCH v3 2/7] powerpc: Prepare for moving thread_info into task_struct
2018-10-01 12:30 [RFC PATCH v3 0/7] powerpc: Switch to CONFIG_THREAD_INFO_IN_TASK Christophe Leroy
2018-10-01 12:30 ` [RFC PATCH v3 1/7] book3s/64: avoid circular header inclusion in mmu-hash.h Christophe Leroy
@ 2018-10-01 12:30 ` Christophe Leroy
2018-10-03 5:02 ` Nicholas Piggin
2018-10-01 12:30 ` [RFC PATCH v3 3/7] powerpc: Activate CONFIG_THREAD_INFO_IN_TASK Christophe Leroy
` (4 subsequent siblings)
6 siblings, 1 reply; 32+ messages in thread
From: Christophe Leroy @ 2018-10-01 12:30 UTC (permalink / raw)
To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, npiggin
Cc: linux-kernel, linuxppc-dev
This patch cleans the powerpc kernel before activating
CONFIG_THREAD_INFO_IN_TASK:
- The purpose of the pointer given to call_do_softirq() and
call_do_irq() is to point the new stack ==> change it to void*
- Don't use CURRENT_THREAD_INFO() to locate the stack.
- Fixed a few comments.
- TI_CPU is only used when CONFIG_SMP is set.
- Replace current_thread_info()->task by current
- Remove unnecessary casts to thread_info, as they'll become invalid
once thread_info is not in stack anymore.
- Ensure task_struct 'cpu' fields is not used directly out of SMP code
- Rename THREAD_INFO to TASK_STASK: As it is in fact the offset of the
pointer to the stack in task_struct, this pointer will not be impacted
by the move of THREAD_INFO.
- Makes TASK_STACK available to PPC64 which will need it to the get
stack pointer from current once the thread_info have been moved.
Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
---
arch/powerpc/include/asm/irq.h | 4 ++--
arch/powerpc/include/asm/livepatch.h | 2 +-
arch/powerpc/include/asm/processor.h | 4 ++--
arch/powerpc/include/asm/reg.h | 2 +-
arch/powerpc/kernel/asm-offsets.c | 2 +-
arch/powerpc/kernel/entry_32.S | 2 +-
arch/powerpc/kernel/entry_64.S | 2 +-
arch/powerpc/kernel/head_32.S | 4 ++--
arch/powerpc/kernel/head_40x.S | 4 ++--
arch/powerpc/kernel/head_44x.S | 2 +-
arch/powerpc/kernel/head_8xx.S | 2 +-
arch/powerpc/kernel/head_booke.h | 4 ++--
arch/powerpc/kernel/head_fsl_booke.S | 6 ++++--
arch/powerpc/kernel/irq.c | 2 +-
arch/powerpc/kernel/misc_32.S | 8 ++++++--
arch/powerpc/kernel/process.c | 6 +++---
arch/powerpc/kernel/setup_32.c | 15 +++++----------
arch/powerpc/kernel/smp.c | 4 +++-
arch/powerpc/xmon/xmon.c | 2 +-
19 files changed, 40 insertions(+), 37 deletions(-)
diff --git a/arch/powerpc/include/asm/irq.h b/arch/powerpc/include/asm/irq.h
index ee39ce56b2a2..8108d1fe33ca 100644
--- a/arch/powerpc/include/asm/irq.h
+++ b/arch/powerpc/include/asm/irq.h
@@ -63,8 +63,8 @@ extern struct thread_info *hardirq_ctx[NR_CPUS];
extern struct thread_info *softirq_ctx[NR_CPUS];
extern void irq_ctx_init(void);
-extern void call_do_softirq(struct thread_info *tp);
-extern void call_do_irq(struct pt_regs *regs, struct thread_info *tp);
+extern void call_do_softirq(void *tp);
+extern void call_do_irq(struct pt_regs *regs, void *tp);
extern void do_IRQ(struct pt_regs *regs);
extern void __init init_IRQ(void);
extern void __do_irq(struct pt_regs *regs);
diff --git a/arch/powerpc/include/asm/livepatch.h b/arch/powerpc/include/asm/livepatch.h
index 47a03b9b528b..818451bf629c 100644
--- a/arch/powerpc/include/asm/livepatch.h
+++ b/arch/powerpc/include/asm/livepatch.h
@@ -49,7 +49,7 @@ static inline void klp_init_thread_info(struct thread_info *ti)
ti->livepatch_sp = (unsigned long *)(ti + 1) + 1;
}
#else
-static void klp_init_thread_info(struct thread_info *ti) { }
+static inline void klp_init_thread_info(struct thread_info *ti) { }
#endif /* CONFIG_LIVEPATCH */
#endif /* _ASM_POWERPC_LIVEPATCH_H */
diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h
index 353879db3e98..31873614392f 100644
--- a/arch/powerpc/include/asm/processor.h
+++ b/arch/powerpc/include/asm/processor.h
@@ -40,7 +40,7 @@
#ifndef __ASSEMBLY__
#include <linux/types.h>
-#include <asm/thread_info.h>
+#include <linux/thread_info.h>
#include <asm/ptrace.h>
#include <asm/hw_breakpoint.h>
@@ -333,7 +333,7 @@ struct thread_struct {
#define INIT_SP (sizeof(init_stack) + (unsigned long) &init_stack)
#define INIT_SP_LIMIT \
- (_ALIGN_UP(sizeof(init_thread_info), 16) + (unsigned long) &init_stack)
+ (_ALIGN_UP(sizeof(struct thread_info), 16) + (unsigned long) &init_stack)
#ifdef CONFIG_SPE
#define SPEFSCR_INIT \
diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
index e5b314ed054e..f3a9cf19a986 100644
--- a/arch/powerpc/include/asm/reg.h
+++ b/arch/powerpc/include/asm/reg.h
@@ -1053,7 +1053,7 @@
* - SPRG9 debug exception scratch
*
* All 32-bit:
- * - SPRG3 current thread_info pointer
+ * - SPRG3 current thread_struct physical addr pointer
* (virtual on BookE, physical on others)
*
* 32-bit classic:
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c
index ba9d0fc98730..d1f161e48945 100644
--- a/arch/powerpc/kernel/asm-offsets.c
+++ b/arch/powerpc/kernel/asm-offsets.c
@@ -85,10 +85,10 @@ int main(void)
DEFINE(NMI_MASK, NMI_MASK);
OFFSET(TASKTHREADPPR, task_struct, thread.ppr);
#else
- OFFSET(THREAD_INFO, task_struct, stack);
DEFINE(THREAD_INFO_GAP, _ALIGN_UP(sizeof(struct thread_info), 16));
OFFSET(KSP_LIMIT, thread_struct, ksp_limit);
#endif /* CONFIG_PPC64 */
+ OFFSET(TASK_STACK, task_struct, stack);
#ifdef CONFIG_LIVEPATCH
OFFSET(TI_livepatch_sp, thread_info, livepatch_sp);
diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S
index e58c3f467db5..12c0721f65ea 100644
--- a/arch/powerpc/kernel/entry_32.S
+++ b/arch/powerpc/kernel/entry_32.S
@@ -1166,7 +1166,7 @@ ret_from_debug_exc:
mfspr r9,SPRN_SPRG_THREAD
lwz r10,SAVED_KSP_LIMIT(r1)
stw r10,KSP_LIMIT(r9)
- lwz r9,THREAD_INFO-THREAD(r9)
+ lwz r9,TASK_STACK-THREAD(r9)
CURRENT_THREAD_INFO(r10, r1)
lwz r10,TI_PREEMPT(r10)
stw r10,TI_PREEMPT(r9)
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
index 77a888bfcb53..697406572592 100644
--- a/arch/powerpc/kernel/entry_64.S
+++ b/arch/powerpc/kernel/entry_64.S
@@ -680,7 +680,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
2:
#endif /* CONFIG_PPC_BOOK3S_64 */
- CURRENT_THREAD_INFO(r7, r8) /* base of new stack */
+ clrrdi r7, r8, THREAD_SHIFT /* base of new stack */
/* Note: this uses SWITCH_FRAME_SIZE rather than INT_FRAME_SIZE
because we don't need to leave the 288-byte ABI gap at the
top of the kernel stack. */
diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S
index 61ca27929355..dce6f2ff07e5 100644
--- a/arch/powerpc/kernel/head_32.S
+++ b/arch/powerpc/kernel/head_32.S
@@ -261,7 +261,7 @@ __secondary_hold_acknowledge:
tophys(r11,r1); /* use tophys(r1) if kernel */ \
beq 1f; \
mfspr r11,SPRN_SPRG_THREAD; \
- lwz r11,THREAD_INFO-THREAD(r11); \
+ lwz r11,TASK_STACK-THREAD(r11); \
addi r11,r11,THREAD_SIZE; \
tophys(r11,r11); \
1: subi r11,r11,INT_FRAME_SIZE /* alloc exc. frame */
@@ -841,7 +841,7 @@ __secondary_start:
bl init_idle_6xx
#endif /* CONFIG_6xx */
- /* get current_thread_info and current */
+ /* get current's stack and current */
lis r1,secondary_ti@ha
tophys(r1,r1)
lwz r1,secondary_ti@l(r1)
diff --git a/arch/powerpc/kernel/head_40x.S b/arch/powerpc/kernel/head_40x.S
index b19d78410511..3088c9f29f5e 100644
--- a/arch/powerpc/kernel/head_40x.S
+++ b/arch/powerpc/kernel/head_40x.S
@@ -115,7 +115,7 @@ _ENTRY(saved_ksp_limit)
andi. r11,r11,MSR_PR; \
beq 1f; \
mfspr r1,SPRN_SPRG_THREAD; /* if from user, start at top of */\
- lwz r1,THREAD_INFO-THREAD(r1); /* this thread's kernel stack */\
+ lwz r1,TASK_STACK-THREAD(r1); /* this thread's kernel stack */\
addi r1,r1,THREAD_SIZE; \
1: subi r1,r1,INT_FRAME_SIZE; /* Allocate an exception frame */\
tophys(r11,r1); \
@@ -158,7 +158,7 @@ _ENTRY(saved_ksp_limit)
beq 1f; \
/* COMING FROM USER MODE */ \
mfspr r11,SPRN_SPRG_THREAD; /* if from user, start at top of */\
- lwz r11,THREAD_INFO-THREAD(r11); /* this thread's kernel stack */\
+ lwz r11,TASK_STACK-THREAD(r11); /* this thread's kernel stack */\
1: addi r11,r11,THREAD_SIZE-INT_FRAME_SIZE; /* Alloc an excpt frm */\
tophys(r11,r11); \
stw r10,_CCR(r11); /* save various registers */\
diff --git a/arch/powerpc/kernel/head_44x.S b/arch/powerpc/kernel/head_44x.S
index 37e4a7cf0065..15d39b2499de 100644
--- a/arch/powerpc/kernel/head_44x.S
+++ b/arch/powerpc/kernel/head_44x.S
@@ -1020,7 +1020,7 @@ _GLOBAL(start_secondary_47x)
/* Now we can get our task struct and real stack pointer */
- /* Get current_thread_info and current */
+ /* Get current's stack and current */
lis r1,secondary_ti@ha
lwz r1,secondary_ti@l(r1)
lwz r2,TI_TASK(r1)
diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S
index 6582f824d620..e56e36aa2b3d 100644
--- a/arch/powerpc/kernel/head_8xx.S
+++ b/arch/powerpc/kernel/head_8xx.S
@@ -124,7 +124,7 @@ turn_on_mmu:
tophys(r11,r1); /* use tophys(r1) if kernel */ \
beq 1f; \
mfspr r11,SPRN_SPRG_THREAD; \
- lwz r11,THREAD_INFO-THREAD(r11); \
+ lwz r11,TASK_STACK-THREAD(r11); \
addi r11,r11,THREAD_SIZE; \
tophys(r11,r11); \
1: subi r11,r11,INT_FRAME_SIZE /* alloc exc. frame */
diff --git a/arch/powerpc/kernel/head_booke.h b/arch/powerpc/kernel/head_booke.h
index d0862a100d29..20fe0c93a0bd 100644
--- a/arch/powerpc/kernel/head_booke.h
+++ b/arch/powerpc/kernel/head_booke.h
@@ -44,7 +44,7 @@
mr r11, r1; \
beq 1f; \
/* if from user, start at top of this thread's kernel stack */ \
- lwz r11, THREAD_INFO-THREAD(r10); \
+ lwz r11, TASK_STACK-THREAD(r10); \
ALLOC_STACK_FRAME(r11, THREAD_SIZE); \
1 : subi r11, r11, INT_FRAME_SIZE; /* Allocate exception frame */ \
stw r13, _CCR(r11); /* save various registers */ \
@@ -130,7 +130,7 @@
DO_KVM BOOKE_INTERRUPT_##intno exc_level_srr1; \
andi. r11,r11,MSR_PR; \
mfspr r11,SPRN_SPRG_THREAD; /* if from user, start at top of */\
- lwz r11,THREAD_INFO-THREAD(r11); /* this thread's kernel stack */\
+ lwz r11,TASK_STACK-THREAD(r11); /* this thread's kernel stack */\
addi r11,r11,EXC_LVL_FRAME_OVERHEAD; /* allocate stack frame */\
beq 1f; \
/* COMING FROM USER MODE */ \
diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S
index e2750b856c8f..239ad8a4754e 100644
--- a/arch/powerpc/kernel/head_fsl_booke.S
+++ b/arch/powerpc/kernel/head_fsl_booke.S
@@ -243,8 +243,10 @@ set_ivor:
li r0,0
stwu r0,THREAD_SIZE-STACK_FRAME_OVERHEAD(r1)
+#ifdef CONFIG_SMP
CURRENT_THREAD_INFO(r22, r1)
stw r24, TI_CPU(r22)
+#endif
bl early_init
@@ -702,7 +704,7 @@ finish_tlb_load:
/* Get the next_tlbcam_idx percpu var */
#ifdef CONFIG_SMP
- lwz r12, THREAD_INFO-THREAD(r12)
+ lwz r12, TASK_STACK-THREAD(r12)
lwz r15, TI_CPU(r12)
lis r14, __per_cpu_offset@h
ori r14, r14, __per_cpu_offset@l
@@ -1074,7 +1076,7 @@ __secondary_start:
mr r4,r24 /* Why? */
bl call_setup_cpu
- /* get current_thread_info and current */
+ /* get current's stack and current */
lis r1,secondary_ti@ha
lwz r1,secondary_ti@l(r1)
lwz r2,TI_TASK(r1)
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
index 916ddc4aac44..aa53db3ba6e7 100644
--- a/arch/powerpc/kernel/irq.c
+++ b/arch/powerpc/kernel/irq.c
@@ -663,7 +663,7 @@ void do_IRQ(struct pt_regs *regs)
struct thread_info *curtp, *irqtp, *sirqtp;
/* Switch to the irq stack to handle this */
- curtp = current_thread_info();
+ curtp = (void*)(current_stack_pointer() & ~(THREAD_SIZE - 1));
irqtp = hardirq_ctx[raw_smp_processor_id()];
sirqtp = softirq_ctx[raw_smp_processor_id()];
diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S
index 695b24a2d954..24a7f18ea10c 100644
--- a/arch/powerpc/kernel/misc_32.S
+++ b/arch/powerpc/kernel/misc_32.S
@@ -60,7 +60,7 @@ _GLOBAL(call_do_softirq)
blr
/*
- * void call_do_irq(struct pt_regs *regs, struct thread_info *irqtp);
+ * void call_do_irq(struct pt_regs *regs, void *irqtp);
*/
_GLOBAL(call_do_irq)
mflr r0
@@ -183,10 +183,14 @@ _GLOBAL(low_choose_750fx_pll)
or r4,r4,r5
mtspr SPRN_HID1,r4
+#ifdef CONFIG_SMP
/* Store new HID1 image */
CURRENT_THREAD_INFO(r6, r1)
lwz r6,TI_CPU(r6)
slwi r6,r6,2
+#else
+ li r6, 0
+#endif
addis r6,r6,nap_save_hid1@ha
stw r4,nap_save_hid1@l(r6)
@@ -599,7 +603,7 @@ EXPORT_SYMBOL(__bswapdi2)
#ifdef CONFIG_SMP
_GLOBAL(start_secondary_resume)
/* Reset stack */
- CURRENT_THREAD_INFO(r1, r1)
+ rlwinm r1, r1, 0, 0, 31 - THREAD_SHIFT
addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD
li r3,0
stw r3,0(r1) /* Zero the stack frame pointer */
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
index 03c2e1f134bc..111abb4df2ec 100644
--- a/arch/powerpc/kernel/process.c
+++ b/arch/powerpc/kernel/process.c
@@ -1240,8 +1240,8 @@ struct task_struct *__switch_to(struct task_struct *prev,
batch->active = 1;
}
- if (current_thread_info()->task->thread.regs) {
- restore_math(current_thread_info()->task->thread.regs);
+ if (current->thread.regs) {
+ restore_math(current->thread.regs);
/*
* The copy-paste buffer can only store into foreign real
@@ -1251,7 +1251,7 @@ struct task_struct *__switch_to(struct task_struct *prev,
* mappings, we must issue a cp_abort to clear any state and
* prevent snooping, corruption or a covert channel.
*/
- if (current_thread_info()->task->thread.used_vas)
+ if (current->thread.used_vas)
asm volatile(PPC_CP_ABORT);
}
#endif /* CONFIG_PPC_BOOK3S_64 */
diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c
index 8c507be12c3c..81ebf7d6f526 100644
--- a/arch/powerpc/kernel/setup_32.c
+++ b/arch/powerpc/kernel/setup_32.c
@@ -205,10 +205,8 @@ void __init irqstack_early_init(void)
/* interrupt stacks must be in lowmem, we get that for free on ppc32
* as the memblock is limited to lowmem by default */
for_each_possible_cpu(i) {
- softirq_ctx[i] = (struct thread_info *)
- __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
- hardirq_ctx[i] = (struct thread_info *)
- __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
+ softirq_ctx[i] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
+ hardirq_ctx[i] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
}
}
@@ -226,13 +224,10 @@ void __init exc_lvl_early_init(void)
hw_cpu = 0;
#endif
- critirq_ctx[hw_cpu] = (struct thread_info *)
- __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
+ critirq_ctx[hw_cpu] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
#ifdef CONFIG_BOOKE
- dbgirq_ctx[hw_cpu] = (struct thread_info *)
- __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
- mcheckirq_ctx[hw_cpu] = (struct thread_info *)
- __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
+ dbgirq_ctx[hw_cpu] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
+ mcheckirq_ctx[hw_cpu] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
#endif
}
}
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
index 61c1fadbc644..19dd0ea55714 100644
--- a/arch/powerpc/kernel/smp.c
+++ b/arch/powerpc/kernel/smp.c
@@ -20,6 +20,7 @@
#include <linux/kernel.h>
#include <linux/export.h>
#include <linux/sched/mm.h>
+#include <linux/sched/task_stack.h>
#include <linux/sched/topology.h>
#include <linux/smp.h>
#include <linux/interrupt.h>
@@ -812,7 +813,8 @@ static void cpu_idle_thread_init(unsigned int cpu, struct task_struct *idle)
#ifdef CONFIG_PPC64
paca_ptrs[cpu]->__current = idle;
- paca_ptrs[cpu]->kstack = (unsigned long)ti + THREAD_SIZE - STACK_FRAME_OVERHEAD;
+ paca_ptrs[cpu]->kstack = (unsigned long)task_stack_page(idle) +
+ THREAD_SIZE - STACK_FRAME_OVERHEAD;
#endif
ti->cpu = cpu;
secondary_ti = current_set[cpu] = ti;
diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
index 694c1d92e796..0d8d6fee892a 100644
--- a/arch/powerpc/xmon/xmon.c
+++ b/arch/powerpc/xmon/xmon.c
@@ -2988,7 +2988,7 @@ static void show_task(struct task_struct *tsk)
printf("%px %016lx %6d %6d %c %2d %s\n", tsk,
tsk->thread.ksp,
tsk->pid, tsk->parent->pid,
- state, task_thread_info(tsk)->cpu,
+ state, task_cpu(tsk),
tsk->comm);
}
--
2.13.3
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [RFC PATCH v3 3/7] powerpc: Activate CONFIG_THREAD_INFO_IN_TASK
2018-10-01 12:30 [RFC PATCH v3 0/7] powerpc: Switch to CONFIG_THREAD_INFO_IN_TASK Christophe Leroy
2018-10-01 12:30 ` [RFC PATCH v3 1/7] book3s/64: avoid circular header inclusion in mmu-hash.h Christophe Leroy
2018-10-01 12:30 ` [RFC PATCH v3 2/7] powerpc: Prepare for moving thread_info into task_struct Christophe Leroy
@ 2018-10-01 12:30 ` Christophe Leroy
2018-10-03 5:30 ` Nicholas Piggin
2018-10-01 12:30 ` [RFC PATCH v3 4/7] powerpc: regain entire stack space Christophe Leroy
` (3 subsequent siblings)
6 siblings, 1 reply; 32+ messages in thread
From: Christophe Leroy @ 2018-10-01 12:30 UTC (permalink / raw)
To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, npiggin
Cc: linux-kernel, linuxppc-dev
This patch activates CONFIG_THREAD_INFO_IN_TASK which
moves the thread_info into task_struct.
Moving thread_info into task_struct has the following advantages:
- It protects thread_info from corruption in the case of stack
overflows.
- Its address is harder to determine if stack addresses are
leaked, making a number of attacks more difficult.
This has the following consequences:
- thread_info is now located at the top of task_struct.
- The 'cpu' field is now in task_struct, and only exists when
CONFIG_SMP is active.
- thread_info doesn't have anymore the 'task' field.
This patch:
- Removes all recopy of thread_info struct when the stack changes.
- Changes the CURRENT_THREAD_INFO() macro to point to current.
- Selects CONFIG_THREAD_INFO_IN_TASK.
- Modifies raw_smp_processor_id() to get ->cpu from current without
including linux/sched.h to avoid circular inclusion.
Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
---
arch/powerpc/Kconfig | 1 +
arch/powerpc/Makefile | 6 +++++
arch/powerpc/include/asm/ptrace.h | 2 +-
arch/powerpc/include/asm/smp.h | 8 +++++-
arch/powerpc/include/asm/thread_info.h | 17 ++----------
arch/powerpc/kernel/asm-offsets.c | 5 ++--
arch/powerpc/kernel/entry_32.S | 9 +++----
arch/powerpc/kernel/exceptions-64e.S | 11 --------
arch/powerpc/kernel/head_32.S | 6 ++---
arch/powerpc/kernel/head_44x.S | 4 +--
arch/powerpc/kernel/head_64.S | 1 +
arch/powerpc/kernel/head_booke.h | 8 +-----
arch/powerpc/kernel/head_fsl_booke.S | 7 +++--
arch/powerpc/kernel/irq.c | 47 +---------------------------------
arch/powerpc/kernel/kgdb.c | 28 --------------------
arch/powerpc/kernel/machine_kexec_64.c | 6 ++---
arch/powerpc/kernel/setup-common.c | 2 +-
arch/powerpc/kernel/setup_64.c | 21 ---------------
arch/powerpc/kernel/smp.c | 2 +-
19 files changed, 39 insertions(+), 152 deletions(-)
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index a80669209155..c6c0b91ebd33 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -237,6 +237,7 @@ config PPC
select RTC_LIB
select SPARSE_IRQ
select SYSCTL_EXCEPTION_TRACE
+ select THREAD_INFO_IN_TASK
select VIRT_TO_BUS if !PPC64
#
# Please keep this list sorted alphabetically.
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
index 07d9dce7eda6..4e98989b5512 100644
--- a/arch/powerpc/Makefile
+++ b/arch/powerpc/Makefile
@@ -422,3 +422,9 @@ checkbin:
CLEAN_FILES += $(TOUT)
+ifdef CONFIG_SMP
+prepare: task_cpu_prepare
+
+task_cpu_prepare: prepare0
+ $(eval KBUILD_CFLAGS += -D_TASK_CPU=$(shell awk '{if ($$2 == "TI_CPU") print $$3;}' include/generated/asm-offsets.h))
+endif
diff --git a/arch/powerpc/include/asm/ptrace.h b/arch/powerpc/include/asm/ptrace.h
index 447cbd1bee99..3a7e5561630b 100644
--- a/arch/powerpc/include/asm/ptrace.h
+++ b/arch/powerpc/include/asm/ptrace.h
@@ -120,7 +120,7 @@ extern int ptrace_put_reg(struct task_struct *task, int regno,
unsigned long data);
#define current_pt_regs() \
- ((struct pt_regs *)((unsigned long)current_thread_info() + THREAD_SIZE) - 1)
+ ((struct pt_regs *)((unsigned long)task_stack_page(current) + THREAD_SIZE) - 1)
/*
* We use the least-significant bit of the trap field to indicate
* whether we have saved the full set of registers, or only a
diff --git a/arch/powerpc/include/asm/smp.h b/arch/powerpc/include/asm/smp.h
index 95b66a0c639b..df519b7322e5 100644
--- a/arch/powerpc/include/asm/smp.h
+++ b/arch/powerpc/include/asm/smp.h
@@ -83,7 +83,13 @@ int is_cpu_dead(unsigned int cpu);
/* 32-bit */
extern int smp_hw_index[];
-#define raw_smp_processor_id() (current_thread_info()->cpu)
+/*
+ * This is particularly ugly: it appears we can't actually get the definition
+ * of task_struct here, but we need access to the CPU this task is running on.
+ * Instead of using task_struct we're using _TASK_CPU which is extracted from
+ * asm-offsets.h by kbuild to get the current processor ID.
+ */
+#define raw_smp_processor_id() (*(unsigned int*)((void*)current + _TASK_CPU))
#define hard_smp_processor_id() (smp_hw_index[smp_processor_id()])
static inline int get_hard_smp_processor_id(int cpu)
diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h
index 406eb952b808..62eb9ff31292 100644
--- a/arch/powerpc/include/asm/thread_info.h
+++ b/arch/powerpc/include/asm/thread_info.h
@@ -18,9 +18,9 @@
#define THREAD_SIZE (1 << THREAD_SHIFT)
#ifdef CONFIG_PPC64
-#define CURRENT_THREAD_INFO(dest, sp) stringify_in_c(clrrdi dest, sp, THREAD_SHIFT)
+#define CURRENT_THREAD_INFO(dest, sp) stringify_in_c(ld dest, PACACURRENT(r13))
#else
-#define CURRENT_THREAD_INFO(dest, sp) stringify_in_c(rlwinm dest, sp, 0, 0, 31-THREAD_SHIFT)
+#define CURRENT_THREAD_INFO(dest, sp) stringify_in_c(mr dest, r2)
#endif
#ifndef __ASSEMBLY__
@@ -34,8 +34,6 @@
* low level task data.
*/
struct thread_info {
- struct task_struct *task; /* main task structure */
- int cpu; /* cpu we're on */
int preempt_count; /* 0 => preemptable,
<0 => BUG */
unsigned long local_flags; /* private flags for thread */
@@ -58,8 +56,6 @@ struct thread_info {
*/
#define INIT_THREAD_INFO(tsk) \
{ \
- .task = &tsk, \
- .cpu = 0, \
.preempt_count = INIT_PREEMPT_COUNT, \
.flags = 0, \
}
@@ -67,15 +63,6 @@ struct thread_info {
#define THREAD_SIZE_ORDER (THREAD_SHIFT - PAGE_SHIFT)
/* how to get the thread information struct from C */
-static inline struct thread_info *current_thread_info(void)
-{
- unsigned long val;
-
- asm (CURRENT_THREAD_INFO(%0,1) : "=r" (val));
-
- return (struct thread_info *)val;
-}
-
extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src);
#ifdef CONFIG_PPC_BOOK3S_64
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c
index d1f161e48945..b042d85325f5 100644
--- a/arch/powerpc/kernel/asm-offsets.c
+++ b/arch/powerpc/kernel/asm-offsets.c
@@ -89,6 +89,9 @@ int main(void)
OFFSET(KSP_LIMIT, thread_struct, ksp_limit);
#endif /* CONFIG_PPC64 */
OFFSET(TASK_STACK, task_struct, stack);
+#ifdef CONFIG_SMP
+ OFFSET(TI_CPU, task_struct, cpu);
+#endif
#ifdef CONFIG_LIVEPATCH
OFFSET(TI_livepatch_sp, thread_info, livepatch_sp);
@@ -156,8 +159,6 @@ int main(void)
OFFSET(TI_FLAGS, thread_info, flags);
OFFSET(TI_LOCAL_FLAGS, thread_info, local_flags);
OFFSET(TI_PREEMPT, thread_info, preempt_count);
- OFFSET(TI_TASK, thread_info, task);
- OFFSET(TI_CPU, thread_info, cpu);
#ifdef CONFIG_PPC64
OFFSET(DCACHEL1BLOCKSIZE, ppc64_caches, l1d.block_size);
diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S
index 12c0721f65ea..a14f9b5f2762 100644
--- a/arch/powerpc/kernel/entry_32.S
+++ b/arch/powerpc/kernel/entry_32.S
@@ -1166,10 +1166,6 @@ ret_from_debug_exc:
mfspr r9,SPRN_SPRG_THREAD
lwz r10,SAVED_KSP_LIMIT(r1)
stw r10,KSP_LIMIT(r9)
- lwz r9,TASK_STACK-THREAD(r9)
- CURRENT_THREAD_INFO(r10, r1)
- lwz r10,TI_PREEMPT(r10)
- stw r10,TI_PREEMPT(r9)
RESTORE_xSRR(SRR0,SRR1);
RESTORE_xSRR(CSRR0,CSRR1);
RESTORE_MMU_REGS;
@@ -1292,10 +1288,13 @@ BEGIN_FTR_SECTION
END_FTR_SECTION_IFSET(CPU_FTR_601)
lwz r3,_TRAP(r1)
andi. r0,r3,1
- beq 4f
+ beq 5f
SAVE_NVGPRS(r1)
rlwinm r3,r3,0,0,30
stw r3,_TRAP(r1)
+5: mfspr r2,SPRN_SPRG_THREAD
+ addi r2,r2,-THREAD
+ tovirt(r2,r2) /* set back r2 to current */
4: addi r3,r1,STACK_FRAME_OVERHEAD
bl nonrecoverable_exception
/* shouldn't return */
diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S
index 6d6e144a28ce..231d066b4a3d 100644
--- a/arch/powerpc/kernel/exceptions-64e.S
+++ b/arch/powerpc/kernel/exceptions-64e.S
@@ -77,17 +77,6 @@ special_reg_save:
andi. r3,r3,MSR_PR
bnelr
- /* Copy info into temporary exception thread info */
- ld r11,PACAKSAVE(r13)
- CURRENT_THREAD_INFO(r11, r11)
- CURRENT_THREAD_INFO(r12, r1)
- ld r10,TI_FLAGS(r11)
- std r10,TI_FLAGS(r12)
- ld r10,TI_PREEMPT(r11)
- std r10,TI_PREEMPT(r12)
- ld r10,TI_TASK(r11)
- std r10,TI_TASK(r12)
-
/*
* Advance to the next TLB exception frame for handler
* types that don't do it automatically.
diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S
index dce6f2ff07e5..44dfd73b2a62 100644
--- a/arch/powerpc/kernel/head_32.S
+++ b/arch/powerpc/kernel/head_32.S
@@ -844,9 +844,9 @@ __secondary_start:
/* get current's stack and current */
lis r1,secondary_ti@ha
tophys(r1,r1)
- lwz r1,secondary_ti@l(r1)
- tophys(r2,r1)
- lwz r2,TI_TASK(r2)
+ lwz r2,secondary_ti@l(r1)
+ tophys(r1,r2)
+ lwz r1,TASK_STACK(r1)
/* stack */
addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD
diff --git a/arch/powerpc/kernel/head_44x.S b/arch/powerpc/kernel/head_44x.S
index 15d39b2499de..2c7e90f36358 100644
--- a/arch/powerpc/kernel/head_44x.S
+++ b/arch/powerpc/kernel/head_44x.S
@@ -1022,8 +1022,8 @@ _GLOBAL(start_secondary_47x)
/* Get current's stack and current */
lis r1,secondary_ti@ha
- lwz r1,secondary_ti@l(r1)
- lwz r2,TI_TASK(r1)
+ lwz r2,secondary_ti@l(r1)
+ lwz r1,TASK_STACK(r2)
/* Current stack pointer */
addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S
index 4898e9491a1c..c6a9bf7b34bf 100644
--- a/arch/powerpc/kernel/head_64.S
+++ b/arch/powerpc/kernel/head_64.S
@@ -805,6 +805,7 @@ __secondary_start:
LOAD_REG_ADDR(r3, current_set)
sldi r28,r24,3 /* get current_set[cpu#] */
ldx r14,r3,r28
+ ld r14,TASK_STACK(r14)
addi r14,r14,THREAD_SIZE-STACK_FRAME_OVERHEAD
std r14,PACAKSAVE(r13)
diff --git a/arch/powerpc/kernel/head_booke.h b/arch/powerpc/kernel/head_booke.h
index 20fe0c93a0bd..9f7f10896928 100644
--- a/arch/powerpc/kernel/head_booke.h
+++ b/arch/powerpc/kernel/head_booke.h
@@ -143,13 +143,7 @@
stw r10,GPR11(r11); \
b 2f; \
/* COMING FROM PRIV MODE */ \
-1: lwz r9,TI_FLAGS-EXC_LVL_FRAME_OVERHEAD(r11); \
- lwz r10,TI_PREEMPT-EXC_LVL_FRAME_OVERHEAD(r11); \
- stw r9,TI_FLAGS-EXC_LVL_FRAME_OVERHEAD(r8); \
- stw r10,TI_PREEMPT-EXC_LVL_FRAME_OVERHEAD(r8); \
- lwz r9,TI_TASK-EXC_LVL_FRAME_OVERHEAD(r11); \
- stw r9,TI_TASK-EXC_LVL_FRAME_OVERHEAD(r8); \
- mr r11,r8; \
+1: mr r11,r8; \
2: mfspr r8,SPRN_SPRG_RSCRATCH_##exc_level; \
stw r12,GPR12(r11); /* save various registers */\
mflr r10; \
diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S
index 239ad8a4754e..b8a2b789677e 100644
--- a/arch/powerpc/kernel/head_fsl_booke.S
+++ b/arch/powerpc/kernel/head_fsl_booke.S
@@ -704,8 +704,7 @@ finish_tlb_load:
/* Get the next_tlbcam_idx percpu var */
#ifdef CONFIG_SMP
- lwz r12, TASK_STACK-THREAD(r12)
- lwz r15, TI_CPU(r12)
+ lwz r15, TI_CPU-THREAD(r12)
lis r14, __per_cpu_offset@h
ori r14, r14, __per_cpu_offset@l
rlwinm r15, r15, 2, 0, 29
@@ -1078,8 +1077,8 @@ __secondary_start:
/* get current's stack and current */
lis r1,secondary_ti@ha
- lwz r1,secondary_ti@l(r1)
- lwz r2,TI_TASK(r1)
+ lwz r2,secondary_ti@l(r1)
+ lwz r1,TASK_STACK(r2)
/* stack */
addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
index aa53db3ba6e7..699f0f816687 100644
--- a/arch/powerpc/kernel/irq.c
+++ b/arch/powerpc/kernel/irq.c
@@ -673,24 +673,9 @@ void do_IRQ(struct pt_regs *regs)
set_irq_regs(old_regs);
return;
}
-
- /* Prepare the thread_info in the irq stack */
- irqtp->task = curtp->task;
- irqtp->flags = 0;
-
- /* Copy the preempt_count so that the [soft]irq checks work. */
- irqtp->preempt_count = curtp->preempt_count;
-
/* Switch stack and call */
call_do_irq(regs, irqtp);
- /* Restore stack limit */
- irqtp->task = NULL;
-
- /* Copy back updates to the thread_info */
- if (irqtp->flags)
- set_bits(irqtp->flags, &curtp->flags);
-
set_irq_regs(old_regs);
}
@@ -711,7 +696,6 @@ struct thread_info *mcheckirq_ctx[NR_CPUS] __read_mostly;
void exc_lvl_ctx_init(void)
{
- struct thread_info *tp;
int i, cpu_nr;
for_each_possible_cpu(i) {
@@ -726,20 +710,9 @@ void exc_lvl_ctx_init(void)
#endif
memset((void *)critirq_ctx[cpu_nr], 0, THREAD_SIZE);
- tp = critirq_ctx[cpu_nr];
- tp->cpu = cpu_nr;
- tp->preempt_count = 0;
-
#ifdef CONFIG_BOOKE
memset((void *)dbgirq_ctx[cpu_nr], 0, THREAD_SIZE);
- tp = dbgirq_ctx[cpu_nr];
- tp->cpu = cpu_nr;
- tp->preempt_count = 0;
-
memset((void *)mcheckirq_ctx[cpu_nr], 0, THREAD_SIZE);
- tp = mcheckirq_ctx[cpu_nr];
- tp->cpu = cpu_nr;
- tp->preempt_count = HARDIRQ_OFFSET;
#endif
}
}
@@ -750,38 +723,20 @@ struct thread_info *hardirq_ctx[NR_CPUS] __read_mostly;
void irq_ctx_init(void)
{
- struct thread_info *tp;
int i;
for_each_possible_cpu(i) {
memset((void *)softirq_ctx[i], 0, THREAD_SIZE);
- tp = softirq_ctx[i];
- tp->cpu = i;
- klp_init_thread_info(tp);
-
memset((void *)hardirq_ctx[i], 0, THREAD_SIZE);
- tp = hardirq_ctx[i];
- tp->cpu = i;
- klp_init_thread_info(tp);
}
}
void do_softirq_own_stack(void)
{
- struct thread_info *curtp, *irqtp;
+ struct thread_info *irqtp;
- curtp = current_thread_info();
irqtp = softirq_ctx[smp_processor_id()];
- irqtp->task = curtp->task;
- irqtp->flags = 0;
call_do_softirq(irqtp);
- irqtp->task = NULL;
-
- /* Set any flag that may have been set on the
- * alternate stack
- */
- if (irqtp->flags)
- set_bits(irqtp->flags, &curtp->flags);
}
irq_hw_number_t virq_to_hw(unsigned int virq)
diff --git a/arch/powerpc/kernel/kgdb.c b/arch/powerpc/kernel/kgdb.c
index 59c578f865aa..5056e54b5239 100644
--- a/arch/powerpc/kernel/kgdb.c
+++ b/arch/powerpc/kernel/kgdb.c
@@ -151,41 +151,13 @@ static int kgdb_handle_breakpoint(struct pt_regs *regs)
return 1;
}
-static DEFINE_PER_CPU(struct thread_info, kgdb_thread_info);
static int kgdb_singlestep(struct pt_regs *regs)
{
- struct thread_info *thread_info, *exception_thread_info;
- struct thread_info *backup_current_thread_info =
- this_cpu_ptr(&kgdb_thread_info);
-
if (user_mode(regs))
return 0;
- /*
- * On Book E and perhaps other processors, singlestep is handled on
- * the critical exception stack. This causes current_thread_info()
- * to fail, since it it locates the thread_info by masking off
- * the low bits of the current stack pointer. We work around
- * this issue by copying the thread_info from the kernel stack
- * before calling kgdb_handle_exception, and copying it back
- * afterwards. On most processors the copy is avoided since
- * exception_thread_info == thread_info.
- */
- thread_info = (struct thread_info *)(regs->gpr[1] & ~(THREAD_SIZE-1));
- exception_thread_info = current_thread_info();
-
- if (thread_info != exception_thread_info) {
- /* Save the original current_thread_info. */
- memcpy(backup_current_thread_info, exception_thread_info, sizeof *thread_info);
- memcpy(exception_thread_info, thread_info, sizeof *thread_info);
- }
-
kgdb_handle_exception(0, SIGTRAP, 0, regs);
- if (thread_info != exception_thread_info)
- /* Restore current_thread_info lastly. */
- memcpy(exception_thread_info, backup_current_thread_info, sizeof *thread_info);
-
return 1;
}
diff --git a/arch/powerpc/kernel/machine_kexec_64.c b/arch/powerpc/kernel/machine_kexec_64.c
index a0f6f45005bd..75692c327ba0 100644
--- a/arch/powerpc/kernel/machine_kexec_64.c
+++ b/arch/powerpc/kernel/machine_kexec_64.c
@@ -317,10 +317,8 @@ void default_machine_kexec(struct kimage *image)
* We setup preempt_count to avoid using VMX in memcpy.
* XXX: the task struct will likely be invalid once we do the copy!
*/
- kexec_stack.thread_info.task = current_thread_info()->task;
- kexec_stack.thread_info.flags = 0;
- kexec_stack.thread_info.preempt_count = HARDIRQ_OFFSET;
- kexec_stack.thread_info.cpu = current_thread_info()->cpu;
+ current_thread_info()->flags = 0;
+ current_thread_info()->preempt_count = HARDIRQ_OFFSET;
/* We need a static PACA, too; copy this CPU's PACA over and switch to
* it. Also poison per_cpu_offset and NULL lppaca to catch anyone using
diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c
index 93fa0c99681e..d84351ad1379 100644
--- a/arch/powerpc/kernel/setup-common.c
+++ b/arch/powerpc/kernel/setup-common.c
@@ -939,7 +939,7 @@ void __init setup_arch(char **cmdline_p)
/* Reserve large chunks of memory for use by CMA for KVM. */
kvm_cma_reserve();
- klp_init_thread_info(&init_thread_info);
+ klp_init_thread_info(&init_task.thread_info);
init_mm.start_code = (unsigned long)_stext;
init_mm.end_code = (unsigned long) _etext;
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
index faf00222b324..2d682f3e31c6 100644
--- a/arch/powerpc/kernel/setup_64.c
+++ b/arch/powerpc/kernel/setup_64.c
@@ -691,24 +691,6 @@ void __init exc_lvl_early_init(void)
#endif
/*
- * Emergency stacks are used for a range of things, from asynchronous
- * NMIs (system reset, machine check) to synchronous, process context.
- * We set preempt_count to zero, even though that isn't necessarily correct. To
- * get the right value we'd need to copy it from the previous thread_info, but
- * doing that might fault causing more problems.
- * TODO: what to do with accounting?
- */
-static void emerg_stack_init_thread_info(struct thread_info *ti, int cpu)
-{
- ti->task = NULL;
- ti->cpu = cpu;
- ti->preempt_count = 0;
- ti->local_flags = 0;
- ti->flags = 0;
- klp_init_thread_info(ti);
-}
-
-/*
* Stack space used when we detect a bad kernel stack pointer, and
* early in SMP boots before relocation is enabled. Exclusive emergency
* stack for machine checks.
@@ -739,20 +721,17 @@ void __init emergency_stack_init(void)
ti = alloc_stack(limit, i);
memset(ti, 0, THREAD_SIZE);
- emerg_stack_init_thread_info(ti, i);
paca_ptrs[i]->emergency_sp = (void *)ti + THREAD_SIZE;
#ifdef CONFIG_PPC_BOOK3S_64
/* emergency stack for NMI exception handling. */
ti = alloc_stack(limit, i);
memset(ti, 0, THREAD_SIZE);
- emerg_stack_init_thread_info(ti, i);
paca_ptrs[i]->nmi_emergency_sp = (void *)ti + THREAD_SIZE;
/* emergency stack for machine check exception handling. */
ti = alloc_stack(limit, i);
memset(ti, 0, THREAD_SIZE);
- emerg_stack_init_thread_info(ti, i);
paca_ptrs[i]->mc_emergency_sp = (void *)ti + THREAD_SIZE;
#endif
}
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
index 19dd0ea55714..f22fcbeb9898 100644
--- a/arch/powerpc/kernel/smp.c
+++ b/arch/powerpc/kernel/smp.c
@@ -816,7 +816,7 @@ static void cpu_idle_thread_init(unsigned int cpu, struct task_struct *idle)
paca_ptrs[cpu]->kstack = (unsigned long)task_stack_page(idle) +
THREAD_SIZE - STACK_FRAME_OVERHEAD;
#endif
- ti->cpu = cpu;
+ idle->cpu = cpu;
secondary_ti = current_set[cpu] = ti;
}
--
2.13.3
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [RFC PATCH v3 4/7] powerpc: regain entire stack space
2018-10-01 12:30 [RFC PATCH v3 0/7] powerpc: Switch to CONFIG_THREAD_INFO_IN_TASK Christophe Leroy
` (2 preceding siblings ...)
2018-10-01 12:30 ` [RFC PATCH v3 3/7] powerpc: Activate CONFIG_THREAD_INFO_IN_TASK Christophe Leroy
@ 2018-10-01 12:30 ` Christophe Leroy
2018-10-03 5:34 ` Nicholas Piggin
2018-10-01 12:30 ` [RFC PATCH v3 5/7] powerpc: 'current_set' is now a table of task_struct pointers Christophe Leroy
` (2 subsequent siblings)
6 siblings, 1 reply; 32+ messages in thread
From: Christophe Leroy @ 2018-10-01 12:30 UTC (permalink / raw)
To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, npiggin
Cc: linux-kernel, linuxppc-dev
thread_info is not anymore in the stack, so the entire stack
can now be used.
In the meantime, all pointers to the stacks are not anymore
pointers to thread_info so this patch changes them to void*
Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
---
arch/powerpc/include/asm/irq.h | 10 +++++-----
arch/powerpc/include/asm/processor.h | 3 +--
arch/powerpc/kernel/asm-offsets.c | 1 -
arch/powerpc/kernel/entry_32.S | 14 ++++----------
arch/powerpc/kernel/irq.c | 19 +++++++++----------
arch/powerpc/kernel/misc_32.S | 6 ++----
arch/powerpc/kernel/process.c | 9 +++------
arch/powerpc/kernel/setup_64.c | 8 ++++----
8 files changed, 28 insertions(+), 42 deletions(-)
diff --git a/arch/powerpc/include/asm/irq.h b/arch/powerpc/include/asm/irq.h
index 8108d1fe33ca..3987929408d3 100644
--- a/arch/powerpc/include/asm/irq.h
+++ b/arch/powerpc/include/asm/irq.h
@@ -48,9 +48,9 @@ struct pt_regs;
* Per-cpu stacks for handling critical, debug and machine check
* level interrupts.
*/
-extern struct thread_info *critirq_ctx[NR_CPUS];
-extern struct thread_info *dbgirq_ctx[NR_CPUS];
-extern struct thread_info *mcheckirq_ctx[NR_CPUS];
+extern void *critirq_ctx[NR_CPUS];
+extern void *dbgirq_ctx[NR_CPUS];
+extern void *mcheckirq_ctx[NR_CPUS];
extern void exc_lvl_ctx_init(void);
#else
#define exc_lvl_ctx_init()
@@ -59,8 +59,8 @@ extern void exc_lvl_ctx_init(void);
/*
* Per-cpu stacks for handling hard and soft interrupts.
*/
-extern struct thread_info *hardirq_ctx[NR_CPUS];
-extern struct thread_info *softirq_ctx[NR_CPUS];
+extern void *hardirq_ctx[NR_CPUS];
+extern void *softirq_ctx[NR_CPUS];
extern void irq_ctx_init(void);
extern void call_do_softirq(void *tp);
diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h
index 31873614392f..834d0d701e19 100644
--- a/arch/powerpc/include/asm/processor.h
+++ b/arch/powerpc/include/asm/processor.h
@@ -332,8 +332,7 @@ struct thread_struct {
#define ARCH_MIN_TASKALIGN 16
#define INIT_SP (sizeof(init_stack) + (unsigned long) &init_stack)
-#define INIT_SP_LIMIT \
- (_ALIGN_UP(sizeof(struct thread_info), 16) + (unsigned long) &init_stack)
+#define INIT_SP_LIMIT ((unsigned long) &init_stack)
#ifdef CONFIG_SPE
#define SPEFSCR_INIT \
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c
index b042d85325f5..ae7eda4ca09e 100644
--- a/arch/powerpc/kernel/asm-offsets.c
+++ b/arch/powerpc/kernel/asm-offsets.c
@@ -85,7 +85,6 @@ int main(void)
DEFINE(NMI_MASK, NMI_MASK);
OFFSET(TASKTHREADPPR, task_struct, thread.ppr);
#else
- DEFINE(THREAD_INFO_GAP, _ALIGN_UP(sizeof(struct thread_info), 16));
OFFSET(KSP_LIMIT, thread_struct, ksp_limit);
#endif /* CONFIG_PPC64 */
OFFSET(TASK_STACK, task_struct, stack);
diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S
index a14f9b5f2762..b45da00b01ef 100644
--- a/arch/powerpc/kernel/entry_32.S
+++ b/arch/powerpc/kernel/entry_32.S
@@ -97,14 +97,11 @@ crit_transfer_to_handler:
mfspr r0,SPRN_SRR1
stw r0,_SRR1(r11)
- /* set the stack limit to the current stack
- * and set the limit to protect the thread_info
- * struct
- */
+ /* set the stack limit to the current stack */
mfspr r8,SPRN_SPRG_THREAD
lwz r0,KSP_LIMIT(r8)
stw r0,SAVED_KSP_LIMIT(r11)
- rlwimi r0,r1,0,0,(31-THREAD_SHIFT)
+ rlwinm r0,r1,0,0,(31 - THREAD_SHIFT)
stw r0,KSP_LIMIT(r8)
/* fall through */
#endif
@@ -121,14 +118,11 @@ crit_transfer_to_handler:
mfspr r0,SPRN_SRR1
stw r0,crit_srr1@l(0)
- /* set the stack limit to the current stack
- * and set the limit to protect the thread_info
- * struct
- */
+ /* set the stack limit to the current stack */
mfspr r8,SPRN_SPRG_THREAD
lwz r0,KSP_LIMIT(r8)
stw r0,saved_ksp_limit@l(0)
- rlwimi r0,r1,0,0,(31-THREAD_SHIFT)
+ rlwinm r0,r1,0,0,(31 - THREAD_SHIFT)
stw r0,KSP_LIMIT(r8)
/* fall through */
#endif
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
index 699f0f816687..00dbee440bc2 100644
--- a/arch/powerpc/kernel/irq.c
+++ b/arch/powerpc/kernel/irq.c
@@ -618,9 +618,8 @@ static inline void check_stack_overflow(void)
sp = current_stack_pointer() & (THREAD_SIZE-1);
/* check for stack overflow: is there less than 2KB free? */
- if (unlikely(sp < (sizeof(struct thread_info) + 2048))) {
- pr_err("do_IRQ: stack overflow: %ld\n",
- sp - sizeof(struct thread_info));
+ if (unlikely(sp < 2048)) {
+ pr_err("do_IRQ: stack overflow: %ld\n", sp);
dump_stack();
}
#endif
@@ -660,7 +659,7 @@ void __do_irq(struct pt_regs *regs)
void do_IRQ(struct pt_regs *regs)
{
struct pt_regs *old_regs = set_irq_regs(regs);
- struct thread_info *curtp, *irqtp, *sirqtp;
+ void *curtp, *irqtp, *sirqtp;
/* Switch to the irq stack to handle this */
curtp = (void*)(current_stack_pointer() & ~(THREAD_SIZE - 1));
@@ -690,9 +689,9 @@ void __init init_IRQ(void)
}
#if defined(CONFIG_BOOKE) || defined(CONFIG_40x)
-struct thread_info *critirq_ctx[NR_CPUS] __read_mostly;
-struct thread_info *dbgirq_ctx[NR_CPUS] __read_mostly;
-struct thread_info *mcheckirq_ctx[NR_CPUS] __read_mostly;
+void *critirq_ctx[NR_CPUS] __read_mostly;
+void *dbgirq_ctx[NR_CPUS] __read_mostly;
+void *mcheckirq_ctx[NR_CPUS] __read_mostly;
void exc_lvl_ctx_init(void)
{
@@ -718,8 +717,8 @@ void exc_lvl_ctx_init(void)
}
#endif
-struct thread_info *softirq_ctx[NR_CPUS] __read_mostly;
-struct thread_info *hardirq_ctx[NR_CPUS] __read_mostly;
+void *softirq_ctx[NR_CPUS] __read_mostly;
+void *hardirq_ctx[NR_CPUS] __read_mostly;
void irq_ctx_init(void)
{
@@ -733,7 +732,7 @@ void irq_ctx_init(void)
void do_softirq_own_stack(void)
{
- struct thread_info *irqtp;
+ void *irqtp;
irqtp = softirq_ctx[smp_processor_id()];
call_do_softirq(irqtp);
diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S
index 24a7f18ea10c..d3ba56307eb4 100644
--- a/arch/powerpc/kernel/misc_32.S
+++ b/arch/powerpc/kernel/misc_32.S
@@ -46,11 +46,10 @@ _GLOBAL(call_do_softirq)
mflr r0
stw r0,4(r1)
lwz r10,THREAD+KSP_LIMIT(r2)
- addi r11,r3,THREAD_INFO_GAP
+ stw r3, THREAD+KSP_LIMIT(r2)
stwu r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r3)
mr r1,r3
stw r10,8(r1)
- stw r11,THREAD+KSP_LIMIT(r2)
bl __do_softirq
lwz r10,8(r1)
lwz r1,0(r1)
@@ -66,11 +65,10 @@ _GLOBAL(call_do_irq)
mflr r0
stw r0,4(r1)
lwz r10,THREAD+KSP_LIMIT(r2)
- addi r11,r4,THREAD_INFO_GAP
+ stw r4, THREAD+KSP_LIMIT(r2)
stwu r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r4)
mr r1,r4
stw r10,8(r1)
- stw r11,THREAD+KSP_LIMIT(r2)
bl __do_irq
lwz r10,8(r1)
lwz r1,0(r1)
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
index 111abb4df2ec..1e01bf42dc82 100644
--- a/arch/powerpc/kernel/process.c
+++ b/arch/powerpc/kernel/process.c
@@ -1691,8 +1691,7 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
sp -= STACK_FRAME_OVERHEAD;
p->thread.ksp = sp;
#ifdef CONFIG_PPC32
- p->thread.ksp_limit = (unsigned long)task_stack_page(p) +
- _ALIGN_UP(sizeof(struct thread_info), 16);
+ p->thread.ksp_limit = (unsigned long)task_stack_page(p);
#endif
#ifdef CONFIG_HAVE_HW_BREAKPOINT
p->thread.ptrace_bps[0] = NULL;
@@ -2001,13 +2000,11 @@ static inline int valid_irq_stack(unsigned long sp, struct task_struct *p,
*/
if (cpu < NR_CPUS && cpu_possible(cpu)) {
stack_page = (unsigned long) hardirq_ctx[cpu];
- if (sp >= stack_page + sizeof(struct thread_struct)
- && sp <= stack_page + THREAD_SIZE - nbytes)
+ if (sp >= stack_page && sp <= stack_page + THREAD_SIZE - nbytes)
return 1;
stack_page = (unsigned long) softirq_ctx[cpu];
- if (sp >= stack_page + sizeof(struct thread_struct)
- && sp <= stack_page + THREAD_SIZE - nbytes)
+ if (sp >= stack_page && sp <= stack_page + THREAD_SIZE - nbytes)
return 1;
}
return 0;
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
index 2d682f3e31c6..6792e9c90689 100644
--- a/arch/powerpc/kernel/setup_64.c
+++ b/arch/powerpc/kernel/setup_64.c
@@ -717,22 +717,22 @@ void __init emergency_stack_init(void)
limit = min(ppc64_bolted_size(), ppc64_rma_size);
for_each_possible_cpu(i) {
- struct thread_info *ti;
+ void *ti;
ti = alloc_stack(limit, i);
memset(ti, 0, THREAD_SIZE);
- paca_ptrs[i]->emergency_sp = (void *)ti + THREAD_SIZE;
+ paca_ptrs[i]->emergency_sp = ti + THREAD_SIZE;
#ifdef CONFIG_PPC_BOOK3S_64
/* emergency stack for NMI exception handling. */
ti = alloc_stack(limit, i);
memset(ti, 0, THREAD_SIZE);
- paca_ptrs[i]->nmi_emergency_sp = (void *)ti + THREAD_SIZE;
+ paca_ptrs[i]->nmi_emergency_sp = ti + THREAD_SIZE;
/* emergency stack for machine check exception handling. */
ti = alloc_stack(limit, i);
memset(ti, 0, THREAD_SIZE);
- paca_ptrs[i]->mc_emergency_sp = (void *)ti + THREAD_SIZE;
+ paca_ptrs[i]->mc_emergency_sp = ti + THREAD_SIZE;
#endif
}
}
--
2.13.3
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [RFC PATCH v3 5/7] powerpc: 'current_set' is now a table of task_struct pointers
2018-10-01 12:30 [RFC PATCH v3 0/7] powerpc: Switch to CONFIG_THREAD_INFO_IN_TASK Christophe Leroy
` (3 preceding siblings ...)
2018-10-01 12:30 ` [RFC PATCH v3 4/7] powerpc: regain entire stack space Christophe Leroy
@ 2018-10-01 12:30 ` Christophe Leroy
2018-10-03 5:41 ` Nicholas Piggin
2018-10-01 12:30 ` [RFC PATCH v3 6/7] powerpc/32: Remove CURRENT_THREAD_INFO and rename TI_CPU Christophe Leroy
2018-10-01 12:30 ` [RFC PATCH v3 7/7] powerpc/64: Modify CURRENT_THREAD_INFO() Christophe Leroy
6 siblings, 1 reply; 32+ messages in thread
From: Christophe Leroy @ 2018-10-01 12:30 UTC (permalink / raw)
To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, npiggin
Cc: linux-kernel, linuxppc-dev
The table of pointers 'current_set' has been used for retrieving
the stack and current. They used to be thread_info pointers as
they were pointing to the stack and current was taken from the
'task' field of the thread_info.
Now, the pointers of 'current_set' table are now both pointers
to task_struct and pointers to thread_info.
As they are used to get current, and the stack pointer is
retrieved from current's stack field, this patch changes
their type to task_struct, and renames secondary_ti to
secondary_current.
Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
---
arch/powerpc/include/asm/asm-prototypes.h | 4 ++--
arch/powerpc/kernel/head_32.S | 6 +++---
arch/powerpc/kernel/head_44x.S | 4 ++--
arch/powerpc/kernel/head_fsl_booke.S | 4 ++--
arch/powerpc/kernel/smp.c | 10 ++++------
5 files changed, 13 insertions(+), 15 deletions(-)
diff --git a/arch/powerpc/include/asm/asm-prototypes.h b/arch/powerpc/include/asm/asm-prototypes.h
index 78ed3c3f879a..e74d24821931 100644
--- a/arch/powerpc/include/asm/asm-prototypes.h
+++ b/arch/powerpc/include/asm/asm-prototypes.h
@@ -23,8 +23,8 @@
#include <uapi/asm/ucontext.h>
/* SMP */
-extern struct thread_info *current_set[NR_CPUS];
-extern struct thread_info *secondary_ti;
+extern struct task_struct *current_set[NR_CPUS];
+extern struct task_struct *secondary_current;
void start_secondary(void *unused);
/* kexec */
diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S
index 44dfd73b2a62..ba0341bd5a00 100644
--- a/arch/powerpc/kernel/head_32.S
+++ b/arch/powerpc/kernel/head_32.S
@@ -842,9 +842,9 @@ __secondary_start:
#endif /* CONFIG_6xx */
/* get current's stack and current */
- lis r1,secondary_ti@ha
- tophys(r1,r1)
- lwz r2,secondary_ti@l(r1)
+ lis r2,secondary_current@ha
+ tophys(r2,r2)
+ lwz r2,secondary_current@l(r2)
tophys(r1,r2)
lwz r1,TASK_STACK(r1)
diff --git a/arch/powerpc/kernel/head_44x.S b/arch/powerpc/kernel/head_44x.S
index 2c7e90f36358..48e4de4dfd0c 100644
--- a/arch/powerpc/kernel/head_44x.S
+++ b/arch/powerpc/kernel/head_44x.S
@@ -1021,8 +1021,8 @@ _GLOBAL(start_secondary_47x)
/* Now we can get our task struct and real stack pointer */
/* Get current's stack and current */
- lis r1,secondary_ti@ha
- lwz r2,secondary_ti@l(r1)
+ lis r2,secondary_current@ha
+ lwz r2,secondary_current@l(r2)
lwz r1,TASK_STACK(r2)
/* Current stack pointer */
diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S
index b8a2b789677e..0d27bfff52dd 100644
--- a/arch/powerpc/kernel/head_fsl_booke.S
+++ b/arch/powerpc/kernel/head_fsl_booke.S
@@ -1076,8 +1076,8 @@ __secondary_start:
bl call_setup_cpu
/* get current's stack and current */
- lis r1,secondary_ti@ha
- lwz r2,secondary_ti@l(r1)
+ lis r2,secondary_current@ha
+ lwz r2,secondary_current@l(r2)
lwz r1,TASK_STACK(r2)
/* stack */
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
index f22fcbeb9898..00193643f0da 100644
--- a/arch/powerpc/kernel/smp.c
+++ b/arch/powerpc/kernel/smp.c
@@ -74,7 +74,7 @@
static DEFINE_PER_CPU(int, cpu_state) = { 0 };
#endif
-struct thread_info *secondary_ti;
+struct task_struct *secondary_current;
DEFINE_PER_CPU(cpumask_var_t, cpu_sibling_map);
DEFINE_PER_CPU(cpumask_var_t, cpu_l2_cache_map);
@@ -644,7 +644,7 @@ void smp_send_stop(void)
}
#endif /* CONFIG_NMI_IPI */
-struct thread_info *current_set[NR_CPUS];
+struct task_struct *current_set[NR_CPUS];
static void smp_store_cpu_info(int id)
{
@@ -724,7 +724,7 @@ void smp_prepare_boot_cpu(void)
paca_ptrs[boot_cpuid]->__current = current;
#endif
set_numa_node(numa_cpu_lookup_table[boot_cpuid]);
- current_set[boot_cpuid] = task_thread_info(current);
+ current_set[boot_cpuid] = current;
}
#ifdef CONFIG_HOTPLUG_CPU
@@ -809,15 +809,13 @@ static bool secondaries_inhibited(void)
static void cpu_idle_thread_init(unsigned int cpu, struct task_struct *idle)
{
- struct thread_info *ti = task_thread_info(idle);
-
#ifdef CONFIG_PPC64
paca_ptrs[cpu]->__current = idle;
paca_ptrs[cpu]->kstack = (unsigned long)task_stack_page(idle) +
THREAD_SIZE - STACK_FRAME_OVERHEAD;
#endif
idle->cpu = cpu;
- secondary_ti = current_set[cpu] = ti;
+ secondary_current = current_set[cpu] = idle;
}
int __cpu_up(unsigned int cpu, struct task_struct *tidle)
--
2.13.3
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [RFC PATCH v3 6/7] powerpc/32: Remove CURRENT_THREAD_INFO and rename TI_CPU
2018-10-01 12:30 [RFC PATCH v3 0/7] powerpc: Switch to CONFIG_THREAD_INFO_IN_TASK Christophe Leroy
` (4 preceding siblings ...)
2018-10-01 12:30 ` [RFC PATCH v3 5/7] powerpc: 'current_set' is now a table of task_struct pointers Christophe Leroy
@ 2018-10-01 12:30 ` Christophe Leroy
2018-10-01 12:30 ` [RFC PATCH v3 7/7] powerpc/64: Modify CURRENT_THREAD_INFO() Christophe Leroy
6 siblings, 0 replies; 32+ messages in thread
From: Christophe Leroy @ 2018-10-01 12:30 UTC (permalink / raw)
To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, npiggin
Cc: linux-kernel, linuxppc-dev
Now that thread_info is similar to task_struct, it's address is in r2
so CURRENT_THREAD_INFO() macro is useless. This patch removes it.
At the same time, as the 'cpu' field is not anymore in thread_info,
this patch renames it to TASK_CPU.
Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
---
arch/powerpc/Makefile | 2 +-
arch/powerpc/include/asm/thread_info.h | 2 --
arch/powerpc/kernel/asm-offsets.c | 2 +-
arch/powerpc/kernel/entry_32.S | 43 ++++++++++++----------------------
arch/powerpc/kernel/epapr_hcalls.S | 5 ++--
arch/powerpc/kernel/head_fsl_booke.S | 5 ++--
arch/powerpc/kernel/idle_6xx.S | 8 +++----
arch/powerpc/kernel/idle_e500.S | 8 +++----
arch/powerpc/kernel/misc_32.S | 3 +--
arch/powerpc/mm/hash_low_32.S | 14 ++++-------
arch/powerpc/sysdev/6xx-suspend.S | 5 ++--
11 files changed, 35 insertions(+), 62 deletions(-)
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
index 4e98989b5512..e2a0843028bc 100644
--- a/arch/powerpc/Makefile
+++ b/arch/powerpc/Makefile
@@ -426,5 +426,5 @@ ifdef CONFIG_SMP
prepare: task_cpu_prepare
task_cpu_prepare: prepare0
- $(eval KBUILD_CFLAGS += -D_TASK_CPU=$(shell awk '{if ($$2 == "TI_CPU") print $$3;}' include/generated/asm-offsets.h))
+ $(eval KBUILD_CFLAGS += -D_TASK_CPU=$(shell awk '{if ($$2 == "TASK_CPU") print $$3;}' include/generated/asm-offsets.h))
endif
diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h
index 62eb9ff31292..1c42df627bf3 100644
--- a/arch/powerpc/include/asm/thread_info.h
+++ b/arch/powerpc/include/asm/thread_info.h
@@ -19,8 +19,6 @@
#ifdef CONFIG_PPC64
#define CURRENT_THREAD_INFO(dest, sp) stringify_in_c(ld dest, PACACURRENT(r13))
-#else
-#define CURRENT_THREAD_INFO(dest, sp) stringify_in_c(mr dest, r2)
#endif
#ifndef __ASSEMBLY__
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c
index ae7eda4ca09e..08b8bfd98737 100644
--- a/arch/powerpc/kernel/asm-offsets.c
+++ b/arch/powerpc/kernel/asm-offsets.c
@@ -89,7 +89,7 @@ int main(void)
#endif /* CONFIG_PPC64 */
OFFSET(TASK_STACK, task_struct, stack);
#ifdef CONFIG_SMP
- OFFSET(TI_CPU, task_struct, cpu);
+ OFFSET(TASK_CPU, task_struct, cpu);
#endif
#ifdef CONFIG_LIVEPATCH
diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S
index b45da00b01ef..5d12b26e20a4 100644
--- a/arch/powerpc/kernel/entry_32.S
+++ b/arch/powerpc/kernel/entry_32.S
@@ -168,8 +168,7 @@ transfer_to_handler:
tophys(r11,r11)
addi r11,r11,global_dbcr0@l
#ifdef CONFIG_SMP
- CURRENT_THREAD_INFO(r9, r1)
- lwz r9,TI_CPU(r9)
+ lwz r9,TASK_CPU(r2)
slwi r9,r9,3
add r11,r11,r9
#endif
@@ -180,8 +179,7 @@ transfer_to_handler:
stw r12,4(r11)
#endif
#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
- CURRENT_THREAD_INFO(r9, r1)
- tophys(r9, r9)
+ tophys(r9, r2)
ACCOUNT_CPU_USER_ENTRY(r9, r11, r12)
#endif
@@ -195,8 +193,7 @@ transfer_to_handler:
ble- stack_ovf /* then the kernel stack overflowed */
5:
#if defined(CONFIG_6xx) || defined(CONFIG_E500)
- CURRENT_THREAD_INFO(r9, r1)
- tophys(r9,r9) /* check local flags */
+ tophys(r9,r2) /* check local flags */
lwz r12,TI_LOCAL_FLAGS(r9)
mtcrf 0x01,r12
bt- 31-TLF_NAPPING,4f
@@ -345,8 +342,7 @@ _GLOBAL(DoSyscall)
mtmsr r11
1:
#endif /* CONFIG_TRACE_IRQFLAGS */
- CURRENT_THREAD_INFO(r10, r1)
- lwz r11,TI_FLAGS(r10)
+ lwz r11,TI_FLAGS(r2)
andi. r11,r11,_TIF_SYSCALL_DOTRACE
bne- syscall_dotrace
syscall_dotrace_cont:
@@ -379,13 +375,12 @@ ret_from_syscall:
lwz r3,GPR3(r1)
#endif
mr r6,r3
- CURRENT_THREAD_INFO(r12, r1)
/* disable interrupts so current_thread_info()->flags can't change */
LOAD_MSR_KERNEL(r10,MSR_KERNEL) /* doesn't include MSR_EE */
/* Note: We don't bother telling lockdep about it */
SYNC
MTMSRD(r10)
- lwz r9,TI_FLAGS(r12)
+ lwz r9,TI_FLAGS(r2)
li r8,-MAX_ERRNO
andi. r0,r9,(_TIF_SYSCALL_DOTRACE|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)
bne- syscall_exit_work
@@ -432,8 +427,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_NEED_PAIRED_STWCX)
#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
andi. r4,r8,MSR_PR
beq 3f
- CURRENT_THREAD_INFO(r4, r1)
- ACCOUNT_CPU_USER_EXIT(r4, r5, r7)
+ ACCOUNT_CPU_USER_EXIT(r2, r5, r7)
3:
#endif
lwz r4,_LINK(r1)
@@ -526,7 +520,7 @@ syscall_exit_work:
/* Clear per-syscall TIF flags if any are set. */
li r11,_TIF_PERSYSCALL_MASK
- addi r12,r12,TI_FLAGS
+ addi r12,r2,TI_FLAGS
3: lwarx r8,0,r12
andc r8,r8,r11
#ifdef CONFIG_IBM405_ERR77
@@ -534,7 +528,6 @@ syscall_exit_work:
#endif
stwcx. r8,0,r12
bne- 3b
- subi r12,r12,TI_FLAGS
4: /* Anything which requires enabling interrupts? */
andi. r0,r9,(_TIF_SYSCALL_DOTRACE|_TIF_SINGLESTEP)
@@ -813,8 +806,7 @@ ret_from_except:
user_exc_return: /* r10 contains MSR_KERNEL here */
/* Check current_thread_info()->flags */
- CURRENT_THREAD_INFO(r9, r1)
- lwz r9,TI_FLAGS(r9)
+ lwz r9,TI_FLAGS(r2)
andi. r0,r9,_TIF_USER_WORK_MASK
bne do_work
@@ -827,8 +819,7 @@ restore_user:
bnel- load_dbcr0
#endif
#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
- CURRENT_THREAD_INFO(r9, r1)
- ACCOUNT_CPU_USER_EXIT(r9, r10, r11)
+ ACCOUNT_CPU_USER_EXIT(r2, r10, r11)
#endif
b restore
@@ -836,8 +827,7 @@ restore_user:
/* N.B. the only way to get here is from the beq following ret_from_except. */
resume_kernel:
/* check current_thread_info, _TIF_EMULATE_STACK_STORE */
- CURRENT_THREAD_INFO(r9, r1)
- lwz r8,TI_FLAGS(r9)
+ lwz r8,TI_FLAGS(r2)
andis. r0,r8,_TIF_EMULATE_STACK_STORE@h
beq+ 1f
@@ -863,7 +853,7 @@ resume_kernel:
/* Clear _TIF_EMULATE_STACK_STORE flag */
lis r11,_TIF_EMULATE_STACK_STORE@h
- addi r5,r9,TI_FLAGS
+ addi r5,r2,TI_FLAGS
0: lwarx r8,0,r5
andc r8,r8,r11
#ifdef CONFIG_IBM405_ERR77
@@ -875,7 +865,7 @@ resume_kernel:
#ifdef CONFIG_PREEMPT
/* check current_thread_info->preempt_count */
- lwz r0,TI_PREEMPT(r9)
+ lwz r0,TI_PREEMPT(r2)
cmpwi 0,r0,0 /* if non-zero, just restore regs and return */
bne restore
andi. r8,r8,_TIF_NEED_RESCHED
@@ -891,8 +881,7 @@ resume_kernel:
bl trace_hardirqs_off
#endif
1: bl preempt_schedule_irq
- CURRENT_THREAD_INFO(r9, r1)
- lwz r3,TI_FLAGS(r9)
+ lwz r3,TI_FLAGS(r2)
andi. r0,r3,_TIF_NEED_RESCHED
bne- 1b
#ifdef CONFIG_TRACE_IRQFLAGS
@@ -1191,8 +1180,7 @@ load_dbcr0:
lis r11,global_dbcr0@ha
addi r11,r11,global_dbcr0@l
#ifdef CONFIG_SMP
- CURRENT_THREAD_INFO(r9, r1)
- lwz r9,TI_CPU(r9)
+ lwz r9,TASK_CPU(r2)
slwi r9,r9,3
add r11,r11,r9
#endif
@@ -1232,8 +1220,7 @@ recheck:
LOAD_MSR_KERNEL(r10,MSR_KERNEL)
SYNC
MTMSRD(r10) /* disable interrupts */
- CURRENT_THREAD_INFO(r9, r1)
- lwz r9,TI_FLAGS(r9)
+ lwz r9,TI_FLAGS(r2)
andi. r0,r9,_TIF_NEED_RESCHED
bne- do_resched
andi. r0,r9,_TIF_USER_WORK_MASK
diff --git a/arch/powerpc/kernel/epapr_hcalls.S b/arch/powerpc/kernel/epapr_hcalls.S
index 52ca2471ee1a..d252f4663a23 100644
--- a/arch/powerpc/kernel/epapr_hcalls.S
+++ b/arch/powerpc/kernel/epapr_hcalls.S
@@ -21,10 +21,9 @@
#ifndef CONFIG_PPC64
/* epapr_ev_idle() was derived from e500_idle() */
_GLOBAL(epapr_ev_idle)
- CURRENT_THREAD_INFO(r3, r1)
- PPC_LL r4, TI_LOCAL_FLAGS(r3) /* set napping bit */
+ PPC_LL r4, TI_LOCAL_FLAGS(r2) /* set napping bit */
ori r4, r4,_TLF_NAPPING /* so when we take an exception */
- PPC_STL r4, TI_LOCAL_FLAGS(r3) /* it will return to our caller */
+ PPC_STL r4, TI_LOCAL_FLAGS(r2) /* it will return to our caller */
wrteei 1
diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S
index 0d27bfff52dd..38918f82bc5b 100644
--- a/arch/powerpc/kernel/head_fsl_booke.S
+++ b/arch/powerpc/kernel/head_fsl_booke.S
@@ -244,8 +244,7 @@ set_ivor:
stwu r0,THREAD_SIZE-STACK_FRAME_OVERHEAD(r1)
#ifdef CONFIG_SMP
- CURRENT_THREAD_INFO(r22, r1)
- stw r24, TI_CPU(r22)
+ stw r24, TASK_CPU(r2)
#endif
bl early_init
@@ -704,7 +703,7 @@ finish_tlb_load:
/* Get the next_tlbcam_idx percpu var */
#ifdef CONFIG_SMP
- lwz r15, TI_CPU-THREAD(r12)
+ lwz r15, TASK_CPU-THREAD(r12)
lis r14, __per_cpu_offset@h
ori r14, r14, __per_cpu_offset@l
rlwinm r15, r15, 2, 0, 29
diff --git a/arch/powerpc/kernel/idle_6xx.S b/arch/powerpc/kernel/idle_6xx.S
index ff026c9d3cab..5afd2e236990 100644
--- a/arch/powerpc/kernel/idle_6xx.S
+++ b/arch/powerpc/kernel/idle_6xx.S
@@ -136,10 +136,9 @@ BEGIN_FTR_SECTION
DSSALL
sync
END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
- CURRENT_THREAD_INFO(r9, r1)
- lwz r8,TI_LOCAL_FLAGS(r9) /* set napping bit */
+ lwz r8,TI_LOCAL_FLAGS(r2) /* set napping bit */
ori r8,r8,_TLF_NAPPING /* so when we take an exception */
- stw r8,TI_LOCAL_FLAGS(r9) /* it will return to our caller */
+ stw r8,TI_LOCAL_FLAGS(r2) /* it will return to our caller */
mfmsr r7
ori r7,r7,MSR_EE
oris r7,r7,MSR_POW@h
@@ -159,8 +158,7 @@ _GLOBAL(power_save_ppc32_restore)
stw r9,_NIP(r11) /* make it do a blr */
#ifdef CONFIG_SMP
- CURRENT_THREAD_INFO(r12, r11)
- lwz r11,TI_CPU(r12) /* get cpu number * 4 */
+ lwz r11,TASK_CPU(r2) /* get cpu number * 4 */
slwi r11,r11,2
#else
li r11,0
diff --git a/arch/powerpc/kernel/idle_e500.S b/arch/powerpc/kernel/idle_e500.S
index 583e55ac7d26..69dfcd2ca011 100644
--- a/arch/powerpc/kernel/idle_e500.S
+++ b/arch/powerpc/kernel/idle_e500.S
@@ -22,10 +22,9 @@
.text
_GLOBAL(e500_idle)
- CURRENT_THREAD_INFO(r3, r1)
- lwz r4,TI_LOCAL_FLAGS(r3) /* set napping bit */
+ lwz r4,TI_LOCAL_FLAGS(r2) /* set napping bit */
ori r4,r4,_TLF_NAPPING /* so when we take an exception */
- stw r4,TI_LOCAL_FLAGS(r3) /* it will return to our caller */
+ stw r4,TI_LOCAL_FLAGS(r2) /* it will return to our caller */
#ifdef CONFIG_PPC_E500MC
wrteei 1
@@ -88,8 +87,7 @@ _GLOBAL(power_save_ppc32_restore)
stw r9,_NIP(r11) /* make it do a blr */
#ifdef CONFIG_SMP
- CURRENT_THREAD_INFO(r12, r1)
- lwz r11,TI_CPU(r12) /* get cpu number * 4 */
+ lwz r11,TASK_CPU(r2) /* get cpu number * 4 */
slwi r11,r11,2
#else
li r11,0
diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S
index d3ba56307eb4..0509c9a215a7 100644
--- a/arch/powerpc/kernel/misc_32.S
+++ b/arch/powerpc/kernel/misc_32.S
@@ -183,8 +183,7 @@ _GLOBAL(low_choose_750fx_pll)
#ifdef CONFIG_SMP
/* Store new HID1 image */
- CURRENT_THREAD_INFO(r6, r1)
- lwz r6,TI_CPU(r6)
+ lwz r6,TASK_CPU(r2)
slwi r6,r6,2
#else
li r6, 0
diff --git a/arch/powerpc/mm/hash_low_32.S b/arch/powerpc/mm/hash_low_32.S
index 26acf6c8c20c..27edbfddebaa 100644
--- a/arch/powerpc/mm/hash_low_32.S
+++ b/arch/powerpc/mm/hash_low_32.S
@@ -185,8 +185,7 @@ _GLOBAL(add_hash_page)
add r3,r3,r0 /* note create_hpte trims to 24 bits */
#ifdef CONFIG_SMP
- CURRENT_THREAD_INFO(r8, r1) /* use cpu number to make tag */
- lwz r8,TI_CPU(r8) /* to go in mmu_hash_lock */
+ lwz r8,TASK_CPU(r2) /* to go in mmu_hash_lock */
oris r8,r8,12
#endif /* CONFIG_SMP */
@@ -546,9 +545,8 @@ _GLOBAL(flush_hash_pages)
#ifdef CONFIG_SMP
addis r9,r7,mmu_hash_lock@ha
addi r9,r9,mmu_hash_lock@l
- CURRENT_THREAD_INFO(r8, r1)
- add r8,r8,r7
- lwz r8,TI_CPU(r8)
+ add r8,r2,r7
+ lwz r8,TASK_CPU(r8)
oris r8,r8,9
10: lwarx r0,0,r9
cmpi 0,r0,0
@@ -641,8 +639,7 @@ EXPORT_SYMBOL(flush_hash_pages)
*/
_GLOBAL(_tlbie)
#ifdef CONFIG_SMP
- CURRENT_THREAD_INFO(r8, r1)
- lwz r8,TI_CPU(r8)
+ lwz r8,TASK_CPU(r2)
oris r8,r8,11
mfmsr r10
SYNC
@@ -679,8 +676,7 @@ _GLOBAL(_tlbie)
*/
_GLOBAL(_tlbia)
#if defined(CONFIG_SMP)
- CURRENT_THREAD_INFO(r8, r1)
- lwz r8,TI_CPU(r8)
+ lwz r8,TASK_CPU(r2)
oris r8,r8,10
mfmsr r10
SYNC
diff --git a/arch/powerpc/sysdev/6xx-suspend.S b/arch/powerpc/sysdev/6xx-suspend.S
index cf48e9cb2575..6c4aec25c4ba 100644
--- a/arch/powerpc/sysdev/6xx-suspend.S
+++ b/arch/powerpc/sysdev/6xx-suspend.S
@@ -29,10 +29,9 @@ _GLOBAL(mpc6xx_enter_standby)
ori r5, r5, ret_from_standby@l
mtlr r5
- CURRENT_THREAD_INFO(r5, r1)
- lwz r6, TI_LOCAL_FLAGS(r5)
+ lwz r6, TI_LOCAL_FLAGS(r2)
ori r6, r6, _TLF_SLEEPING
- stw r6, TI_LOCAL_FLAGS(r5)
+ stw r6, TI_LOCAL_FLAGS(r2)
mfmsr r5
ori r5, r5, MSR_EE
--
2.13.3
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [RFC PATCH v3 7/7] powerpc/64: Modify CURRENT_THREAD_INFO()
2018-10-01 12:30 [RFC PATCH v3 0/7] powerpc: Switch to CONFIG_THREAD_INFO_IN_TASK Christophe Leroy
` (5 preceding siblings ...)
2018-10-01 12:30 ` [RFC PATCH v3 6/7] powerpc/32: Remove CURRENT_THREAD_INFO and rename TI_CPU Christophe Leroy
@ 2018-10-01 12:30 ` Christophe Leroy
2018-10-03 5:44 ` Nicholas Piggin
6 siblings, 1 reply; 32+ messages in thread
From: Christophe Leroy @ 2018-10-01 12:30 UTC (permalink / raw)
To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, npiggin
Cc: linux-kernel, linuxppc-dev
CURRENT_THREAD_INFO() now uses the PACA to retrieve 'current' pointer,
it doesn't use 'sp' anymore.
Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
---
arch/powerpc/include/asm/exception-64s.h | 4 ++--
arch/powerpc/include/asm/thread_info.h | 2 +-
arch/powerpc/kernel/entry_64.S | 10 +++++-----
arch/powerpc/kernel/exceptions-64e.S | 2 +-
arch/powerpc/kernel/exceptions-64s.S | 2 +-
arch/powerpc/kernel/idle_book3e.S | 2 +-
arch/powerpc/kernel/idle_power4.S | 2 +-
arch/powerpc/kernel/trace/ftrace_64_mprofile.S | 6 +++---
8 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h
index 47578b79f0fb..e38d84c267b8 100644
--- a/arch/powerpc/include/asm/exception-64s.h
+++ b/arch/powerpc/include/asm/exception-64s.h
@@ -672,7 +672,7 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
#define RUNLATCH_ON \
BEGIN_FTR_SECTION \
- CURRENT_THREAD_INFO(r3, r1); \
+ CURRENT_THREAD_INFO(r3); \
ld r4,TI_LOCAL_FLAGS(r3); \
andi. r0,r4,_TLF_RUNLATCH; \
beql ppc64_runlatch_on_trampoline; \
@@ -722,7 +722,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_CTRL)
#ifdef CONFIG_PPC_970_NAP
#define FINISH_NAP \
BEGIN_FTR_SECTION \
- CURRENT_THREAD_INFO(r11, r1); \
+ CURRENT_THREAD_INFO(r11); \
ld r9,TI_LOCAL_FLAGS(r11); \
andi. r10,r9,_TLF_NAPPING; \
bnel power4_fixup_nap; \
diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h
index 1c42df627bf3..a339de87806b 100644
--- a/arch/powerpc/include/asm/thread_info.h
+++ b/arch/powerpc/include/asm/thread_info.h
@@ -18,7 +18,7 @@
#define THREAD_SIZE (1 << THREAD_SHIFT)
#ifdef CONFIG_PPC64
-#define CURRENT_THREAD_INFO(dest, sp) stringify_in_c(ld dest, PACACURRENT(r13))
+#define CURRENT_THREAD_INFO(dest) stringify_in_c(ld dest, PACACURRENT(r13))
#endif
#ifndef __ASSEMBLY__
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
index 697406572592..331b9e9b6d78 100644
--- a/arch/powerpc/kernel/entry_64.S
+++ b/arch/powerpc/kernel/entry_64.S
@@ -158,7 +158,7 @@ system_call: /* label this so stack traces look sane */
li r10,IRQS_ENABLED
std r10,SOFTE(r1)
- CURRENT_THREAD_INFO(r11, r1)
+ CURRENT_THREAD_INFO(r11)
ld r10,TI_FLAGS(r11)
andi. r11,r10,_TIF_SYSCALL_DOTRACE
bne .Lsyscall_dotrace /* does not return */
@@ -205,7 +205,7 @@ system_call: /* label this so stack traces look sane */
ld r3,RESULT(r1)
#endif
- CURRENT_THREAD_INFO(r12, r1)
+ CURRENT_THREAD_INFO(r12)
ld r8,_MSR(r1)
#ifdef CONFIG_PPC_BOOK3S
@@ -336,7 +336,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
/* Repopulate r9 and r10 for the syscall path */
addi r9,r1,STACK_FRAME_OVERHEAD
- CURRENT_THREAD_INFO(r10, r1)
+ CURRENT_THREAD_INFO(r10)
ld r10,TI_FLAGS(r10)
cmpldi r0,NR_syscalls
@@ -731,7 +731,7 @@ _GLOBAL(ret_from_except_lite)
mtmsrd r10,1 /* Update machine state */
#endif /* CONFIG_PPC_BOOK3E */
- CURRENT_THREAD_INFO(r9, r1)
+ CURRENT_THREAD_INFO(r9)
ld r3,_MSR(r1)
#ifdef CONFIG_PPC_BOOK3E
ld r10,PACACURRENT(r13)
@@ -845,7 +845,7 @@ resume_kernel:
1: bl preempt_schedule_irq
/* Re-test flags and eventually loop */
- CURRENT_THREAD_INFO(r9, r1)
+ CURRENT_THREAD_INFO(r9)
ld r4,TI_FLAGS(r9)
andi. r0,r4,_TIF_NEED_RESCHED
bne 1b
diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S
index 231d066b4a3d..f48d9aa07a73 100644
--- a/arch/powerpc/kernel/exceptions-64e.S
+++ b/arch/powerpc/kernel/exceptions-64e.S
@@ -469,7 +469,7 @@ exc_##n##_bad_stack: \
* interrupts happen before the wait instruction.
*/
#define CHECK_NAPPING() \
- CURRENT_THREAD_INFO(r11, r1); \
+ CURRENT_THREAD_INFO(r11); \
ld r10,TI_LOCAL_FLAGS(r11); \
andi. r9,r10,_TLF_NAPPING; \
beq+ 1f; \
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index 89d32bb79d5e..07701063d36e 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -1620,7 +1620,7 @@ do_hash_page:
ori r0,r0,DSISR_BAD_FAULT_64S@l
and. r0,r4,r0 /* weird error? */
bne- handle_page_fault /* if not, try to insert a HPTE */
- CURRENT_THREAD_INFO(r11, r1)
+ CURRENT_THREAD_INFO(r11)
lwz r0,TI_PREEMPT(r11) /* If we're in an "NMI" */
andis. r0,r0,NMI_MASK@h /* (i.e. an irq when soft-disabled) */
bne 77f /* then don't call hash_page now */
diff --git a/arch/powerpc/kernel/idle_book3e.S b/arch/powerpc/kernel/idle_book3e.S
index 4e0d94d02030..23f3d927ea4f 100644
--- a/arch/powerpc/kernel/idle_book3e.S
+++ b/arch/powerpc/kernel/idle_book3e.S
@@ -63,7 +63,7 @@ _GLOBAL(\name)
1: /* Let's set the _TLF_NAPPING flag so interrupts make us return
* to the right spot
*/
- CURRENT_THREAD_INFO(r11, r1)
+ CURRENT_THREAD_INFO(r11)
ld r10,TI_LOCAL_FLAGS(r11)
ori r10,r10,_TLF_NAPPING
std r10,TI_LOCAL_FLAGS(r11)
diff --git a/arch/powerpc/kernel/idle_power4.S b/arch/powerpc/kernel/idle_power4.S
index a09b3c7ca176..80e09f4ec056 100644
--- a/arch/powerpc/kernel/idle_power4.S
+++ b/arch/powerpc/kernel/idle_power4.S
@@ -68,7 +68,7 @@ BEGIN_FTR_SECTION
DSSALL
sync
END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
- CURRENT_THREAD_INFO(r9, r1)
+ CURRENT_THREAD_INFO(r9)
ld r8,TI_LOCAL_FLAGS(r9) /* set napping bit */
ori r8,r8,_TLF_NAPPING /* so when we take an exception */
std r8,TI_LOCAL_FLAGS(r9) /* it will return to our caller */
diff --git a/arch/powerpc/kernel/trace/ftrace_64_mprofile.S b/arch/powerpc/kernel/trace/ftrace_64_mprofile.S
index 32476a6e4e9c..5ba39ec48cdd 100644
--- a/arch/powerpc/kernel/trace/ftrace_64_mprofile.S
+++ b/arch/powerpc/kernel/trace/ftrace_64_mprofile.S
@@ -229,7 +229,7 @@ ftrace_call:
* - r0, r11 & r12 are free
*/
livepatch_handler:
- CURRENT_THREAD_INFO(r12, r1)
+ CURRENT_THREAD_INFO(r12)
/* Allocate 3 x 8 bytes */
ld r11, TI_livepatch_sp(r12)
@@ -256,7 +256,7 @@ livepatch_handler:
* restore it.
*/
- CURRENT_THREAD_INFO(r12, r1)
+ CURRENT_THREAD_INFO(r12)
ld r11, TI_livepatch_sp(r12)
@@ -273,7 +273,7 @@ livepatch_handler:
ld r2, -24(r11)
/* Pop livepatch stack frame */
- CURRENT_THREAD_INFO(r12, r1)
+ CURRENT_THREAD_INFO(r12)
subi r11, r11, 24
std r11, TI_livepatch_sp(r12)
--
2.13.3
^ permalink raw reply related [flat|nested] 32+ messages in thread
* Re: [RFC PATCH v3 1/7] book3s/64: avoid circular header inclusion in mmu-hash.h
2018-10-01 12:30 ` [RFC PATCH v3 1/7] book3s/64: avoid circular header inclusion in mmu-hash.h Christophe Leroy
@ 2018-10-03 4:24 ` Nicholas Piggin
2018-10-04 8:20 ` Christophe LEROY
0 siblings, 1 reply; 32+ messages in thread
From: Nicholas Piggin @ 2018-10-03 4:24 UTC (permalink / raw)
To: Christophe Leroy
Cc: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, linux-kernel, linuxppc-dev
On Mon, 1 Oct 2018 12:30:19 +0000 (UTC)
Christophe Leroy <christophe.leroy@c-s.fr> wrote:
> When activating CONFIG_THREAD_INFO_IN_TASK, linux/sched.h
> includes asm/current.h. This generates a circular dependency.
> To avoid that, asm/processor.h shall not be included in mmu-hash.h
>
> In order to do that, this patch moves into a new header called
> asm/task_size.h the information from asm/processor.h requires by
> mmu-hash.h
Doesn't look like you use this header in 32-bit code. Put task_size.h
in asm/64/ maybe?
Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
>
> Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
> ---
> arch/powerpc/include/asm/book3s/64/mmu-hash.h | 2 +-
> arch/powerpc/include/asm/processor.h | 34 +---------------------
> arch/powerpc/include/asm/task_size.h | 42 +++++++++++++++++++++++++++
> arch/powerpc/kvm/book3s_hv_hmi.c | 1 +
> 4 files changed, 45 insertions(+), 34 deletions(-)
> create mode 100644 arch/powerpc/include/asm/task_size.h
>
> diff --git a/arch/powerpc/include/asm/book3s/64/mmu-hash.h b/arch/powerpc/include/asm/book3s/64/mmu-hash.h
> index bbeaf6adf93c..7788e35f19f0 100644
> --- a/arch/powerpc/include/asm/book3s/64/mmu-hash.h
> +++ b/arch/powerpc/include/asm/book3s/64/mmu-hash.h
> @@ -23,7 +23,7 @@
> */
> #include <asm/book3s/64/pgtable.h>
> #include <asm/bug.h>
> -#include <asm/processor.h>
> +#include <asm/task_size.h>
> #include <asm/cpu_has_feature.h>
>
> /*
> diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h
> index 350c584ca179..353879db3e98 100644
> --- a/arch/powerpc/include/asm/processor.h
> +++ b/arch/powerpc/include/asm/processor.h
> @@ -101,40 +101,8 @@ void release_thread(struct task_struct *);
> #endif
>
> #ifdef CONFIG_PPC64
> -/*
> - * 64-bit user address space can have multiple limits
> - * For now supported values are:
> - */
> -#define TASK_SIZE_64TB (0x0000400000000000UL)
> -#define TASK_SIZE_128TB (0x0000800000000000UL)
> -#define TASK_SIZE_512TB (0x0002000000000000UL)
> -#define TASK_SIZE_1PB (0x0004000000000000UL)
> -#define TASK_SIZE_2PB (0x0008000000000000UL)
> -/*
> - * With 52 bits in the address we can support
> - * upto 4PB of range.
> - */
> -#define TASK_SIZE_4PB (0x0010000000000000UL)
>
> -/*
> - * For now 512TB is only supported with book3s and 64K linux page size.
> - */
> -#if defined(CONFIG_PPC_BOOK3S_64) && defined(CONFIG_PPC_64K_PAGES)
> -/*
> - * Max value currently used:
> - */
> -#define TASK_SIZE_USER64 TASK_SIZE_4PB
> -#define DEFAULT_MAP_WINDOW_USER64 TASK_SIZE_128TB
> -#define TASK_CONTEXT_SIZE TASK_SIZE_512TB
> -#else
> -#define TASK_SIZE_USER64 TASK_SIZE_64TB
> -#define DEFAULT_MAP_WINDOW_USER64 TASK_SIZE_64TB
> -/*
> - * We don't need to allocate extended context ids for 4K page size, because
> - * we limit the max effective address on this config to 64TB.
> - */
> -#define TASK_CONTEXT_SIZE TASK_SIZE_64TB
> -#endif
> +#include <asm/task_size.h>
>
> /*
> * 32-bit user address space is 4GB - 1 page
> diff --git a/arch/powerpc/include/asm/task_size.h b/arch/powerpc/include/asm/task_size.h
> new file mode 100644
> index 000000000000..ca45638617b0
> --- /dev/null
> +++ b/arch/powerpc/include/asm/task_size.h
> @@ -0,0 +1,42 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +#ifndef _ASM_POWERPC_TASK_SIZE_H
> +#define _ASM_POWERPC_TASK_SIZE_H
> +
> +#ifdef CONFIG_PPC64
> +/*
> + * 64-bit user address space can have multiple limits
> + * For now supported values are:
> + */
> +#define TASK_SIZE_64TB (0x0000400000000000UL)
> +#define TASK_SIZE_128TB (0x0000800000000000UL)
> +#define TASK_SIZE_512TB (0x0002000000000000UL)
> +#define TASK_SIZE_1PB (0x0004000000000000UL)
> +#define TASK_SIZE_2PB (0x0008000000000000UL)
> +/*
> + * With 52 bits in the address we can support
> + * upto 4PB of range.
> + */
> +#define TASK_SIZE_4PB (0x0010000000000000UL)
> +
> +/*
> + * For now 512TB is only supported with book3s and 64K linux page size.
> + */
> +#if defined(CONFIG_PPC_BOOK3S_64) && defined(CONFIG_PPC_64K_PAGES)
> +/*
> + * Max value currently used:
> + */
> +#define TASK_SIZE_USER64 TASK_SIZE_4PB
> +#define DEFAULT_MAP_WINDOW_USER64 TASK_SIZE_128TB
> +#define TASK_CONTEXT_SIZE TASK_SIZE_512TB
> +#else
> +#define TASK_SIZE_USER64 TASK_SIZE_64TB
> +#define DEFAULT_MAP_WINDOW_USER64 TASK_SIZE_64TB
> +/*
> + * We don't need to allocate extended context ids for 4K page size, because
> + * we limit the max effective address on this config to 64TB.
> + */
> +#define TASK_CONTEXT_SIZE TASK_SIZE_64TB
> +#endif
> +
> +#endif /* CONFIG_PPC64 */
> +#endif /* _ASM_POWERPC_TASK_SIZE_H */
> diff --git a/arch/powerpc/kvm/book3s_hv_hmi.c b/arch/powerpc/kvm/book3s_hv_hmi.c
> index e3f738eb1cac..64b5011475c7 100644
> --- a/arch/powerpc/kvm/book3s_hv_hmi.c
> +++ b/arch/powerpc/kvm/book3s_hv_hmi.c
> @@ -24,6 +24,7 @@
> #include <linux/compiler.h>
> #include <asm/paca.h>
> #include <asm/hmi.h>
> +#include <asm/processor.h>
>
> void wait_for_subcore_guest_exit(void)
> {
> --
> 2.13.3
>
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [RFC PATCH v3 2/7] powerpc: Prepare for moving thread_info into task_struct
2018-10-01 12:30 ` [RFC PATCH v3 2/7] powerpc: Prepare for moving thread_info into task_struct Christophe Leroy
@ 2018-10-03 5:02 ` Nicholas Piggin
2018-10-03 5:49 ` Christophe LEROY
0 siblings, 1 reply; 32+ messages in thread
From: Nicholas Piggin @ 2018-10-03 5:02 UTC (permalink / raw)
To: Christophe Leroy
Cc: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, linux-kernel, linuxppc-dev
On Mon, 1 Oct 2018 12:30:21 +0000 (UTC)
Christophe Leroy <christophe.leroy@c-s.fr> wrote:
> This patch cleans the powerpc kernel before activating
> CONFIG_THREAD_INFO_IN_TASK:
> - The purpose of the pointer given to call_do_softirq() and
> call_do_irq() is to point the new stack ==> change it to void*
> - Don't use CURRENT_THREAD_INFO() to locate the stack.
> - Fixed a few comments.
> - TI_CPU is only used when CONFIG_SMP is set.
> - Replace current_thread_info()->task by current
> - Remove unnecessary casts to thread_info, as they'll become invalid
> once thread_info is not in stack anymore.
> - Ensure task_struct 'cpu' fields is not used directly out of SMP code
> - Rename THREAD_INFO to TASK_STASK: As it is in fact the offset of the
> pointer to the stack in task_struct, this pointer will not be impacted
> by the move of THREAD_INFO.
> - Makes TASK_STACK available to PPC64 which will need it to the get
> stack pointer from current once the thread_info have been moved.
>
> Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
> ---
> arch/powerpc/include/asm/irq.h | 4 ++--
> arch/powerpc/include/asm/livepatch.h | 2 +-
> arch/powerpc/include/asm/processor.h | 4 ++--
> arch/powerpc/include/asm/reg.h | 2 +-
> arch/powerpc/kernel/asm-offsets.c | 2 +-
> arch/powerpc/kernel/entry_32.S | 2 +-
> arch/powerpc/kernel/entry_64.S | 2 +-
> arch/powerpc/kernel/head_32.S | 4 ++--
> arch/powerpc/kernel/head_40x.S | 4 ++--
> arch/powerpc/kernel/head_44x.S | 2 +-
> arch/powerpc/kernel/head_8xx.S | 2 +-
> arch/powerpc/kernel/head_booke.h | 4 ++--
> arch/powerpc/kernel/head_fsl_booke.S | 6 ++++--
> arch/powerpc/kernel/irq.c | 2 +-
> arch/powerpc/kernel/misc_32.S | 8 ++++++--
> arch/powerpc/kernel/process.c | 6 +++---
> arch/powerpc/kernel/setup_32.c | 15 +++++----------
> arch/powerpc/kernel/smp.c | 4 +++-
> arch/powerpc/xmon/xmon.c | 2 +-
> 19 files changed, 40 insertions(+), 37 deletions(-)
>
> diff --git a/arch/powerpc/include/asm/irq.h b/arch/powerpc/include/asm/irq.h
> index ee39ce56b2a2..8108d1fe33ca 100644
> --- a/arch/powerpc/include/asm/irq.h
> +++ b/arch/powerpc/include/asm/irq.h
> @@ -63,8 +63,8 @@ extern struct thread_info *hardirq_ctx[NR_CPUS];
> extern struct thread_info *softirq_ctx[NR_CPUS];
>
> extern void irq_ctx_init(void);
> -extern void call_do_softirq(struct thread_info *tp);
> -extern void call_do_irq(struct pt_regs *regs, struct thread_info *tp);
> +extern void call_do_softirq(void *tp);
> +extern void call_do_irq(struct pt_regs *regs, void *tp);
void *sp for these ?
This all seems okay to me except the 32-bit code which I don't know.
Would it be any trouble for you to put the TI_CPU bits into their own
patch?
Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
> extern void do_IRQ(struct pt_regs *regs);
> extern void __init init_IRQ(void);
> extern void __do_irq(struct pt_regs *regs);
> diff --git a/arch/powerpc/include/asm/livepatch.h b/arch/powerpc/include/asm/livepatch.h
> index 47a03b9b528b..818451bf629c 100644
> --- a/arch/powerpc/include/asm/livepatch.h
> +++ b/arch/powerpc/include/asm/livepatch.h
> @@ -49,7 +49,7 @@ static inline void klp_init_thread_info(struct thread_info *ti)
> ti->livepatch_sp = (unsigned long *)(ti + 1) + 1;
> }
> #else
> -static void klp_init_thread_info(struct thread_info *ti) { }
> +static inline void klp_init_thread_info(struct thread_info *ti) { }
> #endif /* CONFIG_LIVEPATCH */
>
> #endif /* _ASM_POWERPC_LIVEPATCH_H */
> diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h
> index 353879db3e98..31873614392f 100644
> --- a/arch/powerpc/include/asm/processor.h
> +++ b/arch/powerpc/include/asm/processor.h
> @@ -40,7 +40,7 @@
>
> #ifndef __ASSEMBLY__
> #include <linux/types.h>
> -#include <asm/thread_info.h>
> +#include <linux/thread_info.h>
> #include <asm/ptrace.h>
> #include <asm/hw_breakpoint.h>
>
> @@ -333,7 +333,7 @@ struct thread_struct {
>
> #define INIT_SP (sizeof(init_stack) + (unsigned long) &init_stack)
> #define INIT_SP_LIMIT \
> - (_ALIGN_UP(sizeof(init_thread_info), 16) + (unsigned long) &init_stack)
> + (_ALIGN_UP(sizeof(struct thread_info), 16) + (unsigned long) &init_stack)
>
> #ifdef CONFIG_SPE
> #define SPEFSCR_INIT \
> diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
> index e5b314ed054e..f3a9cf19a986 100644
> --- a/arch/powerpc/include/asm/reg.h
> +++ b/arch/powerpc/include/asm/reg.h
> @@ -1053,7 +1053,7 @@
> * - SPRG9 debug exception scratch
> *
> * All 32-bit:
> - * - SPRG3 current thread_info pointer
> + * - SPRG3 current thread_struct physical addr pointer
> * (virtual on BookE, physical on others)
> *
> * 32-bit classic:
> diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c
> index ba9d0fc98730..d1f161e48945 100644
> --- a/arch/powerpc/kernel/asm-offsets.c
> +++ b/arch/powerpc/kernel/asm-offsets.c
> @@ -85,10 +85,10 @@ int main(void)
> DEFINE(NMI_MASK, NMI_MASK);
> OFFSET(TASKTHREADPPR, task_struct, thread.ppr);
> #else
> - OFFSET(THREAD_INFO, task_struct, stack);
> DEFINE(THREAD_INFO_GAP, _ALIGN_UP(sizeof(struct thread_info), 16));
> OFFSET(KSP_LIMIT, thread_struct, ksp_limit);
> #endif /* CONFIG_PPC64 */
> + OFFSET(TASK_STACK, task_struct, stack);
>
> #ifdef CONFIG_LIVEPATCH
> OFFSET(TI_livepatch_sp, thread_info, livepatch_sp);
> diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S
> index e58c3f467db5..12c0721f65ea 100644
> --- a/arch/powerpc/kernel/entry_32.S
> +++ b/arch/powerpc/kernel/entry_32.S
> @@ -1166,7 +1166,7 @@ ret_from_debug_exc:
> mfspr r9,SPRN_SPRG_THREAD
> lwz r10,SAVED_KSP_LIMIT(r1)
> stw r10,KSP_LIMIT(r9)
> - lwz r9,THREAD_INFO-THREAD(r9)
> + lwz r9,TASK_STACK-THREAD(r9)
> CURRENT_THREAD_INFO(r10, r1)
> lwz r10,TI_PREEMPT(r10)
> stw r10,TI_PREEMPT(r9)
> diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
> index 77a888bfcb53..697406572592 100644
> --- a/arch/powerpc/kernel/entry_64.S
> +++ b/arch/powerpc/kernel/entry_64.S
> @@ -680,7 +680,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
> 2:
> #endif /* CONFIG_PPC_BOOK3S_64 */
>
> - CURRENT_THREAD_INFO(r7, r8) /* base of new stack */
> + clrrdi r7, r8, THREAD_SHIFT /* base of new stack */
> /* Note: this uses SWITCH_FRAME_SIZE rather than INT_FRAME_SIZE
> because we don't need to leave the 288-byte ABI gap at the
> top of the kernel stack. */
> diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S
> index 61ca27929355..dce6f2ff07e5 100644
> --- a/arch/powerpc/kernel/head_32.S
> +++ b/arch/powerpc/kernel/head_32.S
> @@ -261,7 +261,7 @@ __secondary_hold_acknowledge:
> tophys(r11,r1); /* use tophys(r1) if kernel */ \
> beq 1f; \
> mfspr r11,SPRN_SPRG_THREAD; \
> - lwz r11,THREAD_INFO-THREAD(r11); \
> + lwz r11,TASK_STACK-THREAD(r11); \
> addi r11,r11,THREAD_SIZE; \
> tophys(r11,r11); \
> 1: subi r11,r11,INT_FRAME_SIZE /* alloc exc. frame */
> @@ -841,7 +841,7 @@ __secondary_start:
> bl init_idle_6xx
> #endif /* CONFIG_6xx */
>
> - /* get current_thread_info and current */
> + /* get current's stack and current */
> lis r1,secondary_ti@ha
> tophys(r1,r1)
> lwz r1,secondary_ti@l(r1)
> diff --git a/arch/powerpc/kernel/head_40x.S b/arch/powerpc/kernel/head_40x.S
> index b19d78410511..3088c9f29f5e 100644
> --- a/arch/powerpc/kernel/head_40x.S
> +++ b/arch/powerpc/kernel/head_40x.S
> @@ -115,7 +115,7 @@ _ENTRY(saved_ksp_limit)
> andi. r11,r11,MSR_PR; \
> beq 1f; \
> mfspr r1,SPRN_SPRG_THREAD; /* if from user, start at top of */\
> - lwz r1,THREAD_INFO-THREAD(r1); /* this thread's kernel stack */\
> + lwz r1,TASK_STACK-THREAD(r1); /* this thread's kernel stack */\
> addi r1,r1,THREAD_SIZE; \
> 1: subi r1,r1,INT_FRAME_SIZE; /* Allocate an exception frame */\
> tophys(r11,r1); \
> @@ -158,7 +158,7 @@ _ENTRY(saved_ksp_limit)
> beq 1f; \
> /* COMING FROM USER MODE */ \
> mfspr r11,SPRN_SPRG_THREAD; /* if from user, start at top of */\
> - lwz r11,THREAD_INFO-THREAD(r11); /* this thread's kernel stack */\
> + lwz r11,TASK_STACK-THREAD(r11); /* this thread's kernel stack */\
> 1: addi r11,r11,THREAD_SIZE-INT_FRAME_SIZE; /* Alloc an excpt frm */\
> tophys(r11,r11); \
> stw r10,_CCR(r11); /* save various registers */\
> diff --git a/arch/powerpc/kernel/head_44x.S b/arch/powerpc/kernel/head_44x.S
> index 37e4a7cf0065..15d39b2499de 100644
> --- a/arch/powerpc/kernel/head_44x.S
> +++ b/arch/powerpc/kernel/head_44x.S
> @@ -1020,7 +1020,7 @@ _GLOBAL(start_secondary_47x)
>
> /* Now we can get our task struct and real stack pointer */
>
> - /* Get current_thread_info and current */
> + /* Get current's stack and current */
> lis r1,secondary_ti@ha
> lwz r1,secondary_ti@l(r1)
> lwz r2,TI_TASK(r1)
> diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S
> index 6582f824d620..e56e36aa2b3d 100644
> --- a/arch/powerpc/kernel/head_8xx.S
> +++ b/arch/powerpc/kernel/head_8xx.S
> @@ -124,7 +124,7 @@ turn_on_mmu:
> tophys(r11,r1); /* use tophys(r1) if kernel */ \
> beq 1f; \
> mfspr r11,SPRN_SPRG_THREAD; \
> - lwz r11,THREAD_INFO-THREAD(r11); \
> + lwz r11,TASK_STACK-THREAD(r11); \
> addi r11,r11,THREAD_SIZE; \
> tophys(r11,r11); \
> 1: subi r11,r11,INT_FRAME_SIZE /* alloc exc. frame */
> diff --git a/arch/powerpc/kernel/head_booke.h b/arch/powerpc/kernel/head_booke.h
> index d0862a100d29..20fe0c93a0bd 100644
> --- a/arch/powerpc/kernel/head_booke.h
> +++ b/arch/powerpc/kernel/head_booke.h
> @@ -44,7 +44,7 @@
> mr r11, r1; \
> beq 1f; \
> /* if from user, start at top of this thread's kernel stack */ \
> - lwz r11, THREAD_INFO-THREAD(r10); \
> + lwz r11, TASK_STACK-THREAD(r10); \
> ALLOC_STACK_FRAME(r11, THREAD_SIZE); \
> 1 : subi r11, r11, INT_FRAME_SIZE; /* Allocate exception frame */ \
> stw r13, _CCR(r11); /* save various registers */ \
> @@ -130,7 +130,7 @@
> DO_KVM BOOKE_INTERRUPT_##intno exc_level_srr1; \
> andi. r11,r11,MSR_PR; \
> mfspr r11,SPRN_SPRG_THREAD; /* if from user, start at top of */\
> - lwz r11,THREAD_INFO-THREAD(r11); /* this thread's kernel stack */\
> + lwz r11,TASK_STACK-THREAD(r11); /* this thread's kernel stack */\
> addi r11,r11,EXC_LVL_FRAME_OVERHEAD; /* allocate stack frame */\
> beq 1f; \
> /* COMING FROM USER MODE */ \
> diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S
> index e2750b856c8f..239ad8a4754e 100644
> --- a/arch/powerpc/kernel/head_fsl_booke.S
> +++ b/arch/powerpc/kernel/head_fsl_booke.S
> @@ -243,8 +243,10 @@ set_ivor:
> li r0,0
> stwu r0,THREAD_SIZE-STACK_FRAME_OVERHEAD(r1)
>
> +#ifdef CONFIG_SMP
> CURRENT_THREAD_INFO(r22, r1)
> stw r24, TI_CPU(r22)
> +#endif
>
> bl early_init
>
> @@ -702,7 +704,7 @@ finish_tlb_load:
>
> /* Get the next_tlbcam_idx percpu var */
> #ifdef CONFIG_SMP
> - lwz r12, THREAD_INFO-THREAD(r12)
> + lwz r12, TASK_STACK-THREAD(r12)
> lwz r15, TI_CPU(r12)
> lis r14, __per_cpu_offset@h
> ori r14, r14, __per_cpu_offset@l
> @@ -1074,7 +1076,7 @@ __secondary_start:
> mr r4,r24 /* Why? */
> bl call_setup_cpu
>
> - /* get current_thread_info and current */
> + /* get current's stack and current */
> lis r1,secondary_ti@ha
> lwz r1,secondary_ti@l(r1)
> lwz r2,TI_TASK(r1)
> diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
> index 916ddc4aac44..aa53db3ba6e7 100644
> --- a/arch/powerpc/kernel/irq.c
> +++ b/arch/powerpc/kernel/irq.c
> @@ -663,7 +663,7 @@ void do_IRQ(struct pt_regs *regs)
> struct thread_info *curtp, *irqtp, *sirqtp;
>
> /* Switch to the irq stack to handle this */
> - curtp = current_thread_info();
> + curtp = (void*)(current_stack_pointer() & ~(THREAD_SIZE - 1));
> irqtp = hardirq_ctx[raw_smp_processor_id()];
> sirqtp = softirq_ctx[raw_smp_processor_id()];
>
> diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S
> index 695b24a2d954..24a7f18ea10c 100644
> --- a/arch/powerpc/kernel/misc_32.S
> +++ b/arch/powerpc/kernel/misc_32.S
> @@ -60,7 +60,7 @@ _GLOBAL(call_do_softirq)
> blr
>
> /*
> - * void call_do_irq(struct pt_regs *regs, struct thread_info *irqtp);
> + * void call_do_irq(struct pt_regs *regs, void *irqtp);
> */
> _GLOBAL(call_do_irq)
> mflr r0
> @@ -183,10 +183,14 @@ _GLOBAL(low_choose_750fx_pll)
> or r4,r4,r5
> mtspr SPRN_HID1,r4
>
> +#ifdef CONFIG_SMP
> /* Store new HID1 image */
> CURRENT_THREAD_INFO(r6, r1)
> lwz r6,TI_CPU(r6)
> slwi r6,r6,2
> +#else
> + li r6, 0
> +#endif
> addis r6,r6,nap_save_hid1@ha
> stw r4,nap_save_hid1@l(r6)
>
> @@ -599,7 +603,7 @@ EXPORT_SYMBOL(__bswapdi2)
> #ifdef CONFIG_SMP
> _GLOBAL(start_secondary_resume)
> /* Reset stack */
> - CURRENT_THREAD_INFO(r1, r1)
> + rlwinm r1, r1, 0, 0, 31 - THREAD_SHIFT
> addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD
> li r3,0
> stw r3,0(r1) /* Zero the stack frame pointer */
> diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
> index 03c2e1f134bc..111abb4df2ec 100644
> --- a/arch/powerpc/kernel/process.c
> +++ b/arch/powerpc/kernel/process.c
> @@ -1240,8 +1240,8 @@ struct task_struct *__switch_to(struct task_struct *prev,
> batch->active = 1;
> }
>
> - if (current_thread_info()->task->thread.regs) {
> - restore_math(current_thread_info()->task->thread.regs);
> + if (current->thread.regs) {
> + restore_math(current->thread.regs);
>
> /*
> * The copy-paste buffer can only store into foreign real
> @@ -1251,7 +1251,7 @@ struct task_struct *__switch_to(struct task_struct *prev,
> * mappings, we must issue a cp_abort to clear any state and
> * prevent snooping, corruption or a covert channel.
> */
> - if (current_thread_info()->task->thread.used_vas)
> + if (current->thread.used_vas)
> asm volatile(PPC_CP_ABORT);
> }
> #endif /* CONFIG_PPC_BOOK3S_64 */
> diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c
> index 8c507be12c3c..81ebf7d6f526 100644
> --- a/arch/powerpc/kernel/setup_32.c
> +++ b/arch/powerpc/kernel/setup_32.c
> @@ -205,10 +205,8 @@ void __init irqstack_early_init(void)
> /* interrupt stacks must be in lowmem, we get that for free on ppc32
> * as the memblock is limited to lowmem by default */
> for_each_possible_cpu(i) {
> - softirq_ctx[i] = (struct thread_info *)
> - __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
> - hardirq_ctx[i] = (struct thread_info *)
> - __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
> + softirq_ctx[i] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
> + hardirq_ctx[i] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
> }
> }
>
> @@ -226,13 +224,10 @@ void __init exc_lvl_early_init(void)
> hw_cpu = 0;
> #endif
>
> - critirq_ctx[hw_cpu] = (struct thread_info *)
> - __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
> + critirq_ctx[hw_cpu] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
> #ifdef CONFIG_BOOKE
> - dbgirq_ctx[hw_cpu] = (struct thread_info *)
> - __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
> - mcheckirq_ctx[hw_cpu] = (struct thread_info *)
> - __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
> + dbgirq_ctx[hw_cpu] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
> + mcheckirq_ctx[hw_cpu] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
> #endif
> }
> }
> diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
> index 61c1fadbc644..19dd0ea55714 100644
> --- a/arch/powerpc/kernel/smp.c
> +++ b/arch/powerpc/kernel/smp.c
> @@ -20,6 +20,7 @@
> #include <linux/kernel.h>
> #include <linux/export.h>
> #include <linux/sched/mm.h>
> +#include <linux/sched/task_stack.h>
> #include <linux/sched/topology.h>
> #include <linux/smp.h>
> #include <linux/interrupt.h>
> @@ -812,7 +813,8 @@ static void cpu_idle_thread_init(unsigned int cpu, struct task_struct *idle)
>
> #ifdef CONFIG_PPC64
> paca_ptrs[cpu]->__current = idle;
> - paca_ptrs[cpu]->kstack = (unsigned long)ti + THREAD_SIZE - STACK_FRAME_OVERHEAD;
> + paca_ptrs[cpu]->kstack = (unsigned long)task_stack_page(idle) +
> + THREAD_SIZE - STACK_FRAME_OVERHEAD;
> #endif
> ti->cpu = cpu;
> secondary_ti = current_set[cpu] = ti;
> diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
> index 694c1d92e796..0d8d6fee892a 100644
> --- a/arch/powerpc/xmon/xmon.c
> +++ b/arch/powerpc/xmon/xmon.c
> @@ -2988,7 +2988,7 @@ static void show_task(struct task_struct *tsk)
> printf("%px %016lx %6d %6d %c %2d %s\n", tsk,
> tsk->thread.ksp,
> tsk->pid, tsk->parent->pid,
> - state, task_thread_info(tsk)->cpu,
> + state, task_cpu(tsk),
> tsk->comm);
> }
>
> --
> 2.13.3
>
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [RFC PATCH v3 3/7] powerpc: Activate CONFIG_THREAD_INFO_IN_TASK
2018-10-01 12:30 ` [RFC PATCH v3 3/7] powerpc: Activate CONFIG_THREAD_INFO_IN_TASK Christophe Leroy
@ 2018-10-03 5:30 ` Nicholas Piggin
2018-10-03 5:47 ` Christophe LEROY
0 siblings, 1 reply; 32+ messages in thread
From: Nicholas Piggin @ 2018-10-03 5:30 UTC (permalink / raw)
To: Christophe Leroy
Cc: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, linux-kernel, linuxppc-dev
On Mon, 1 Oct 2018 12:30:23 +0000 (UTC)
Christophe Leroy <christophe.leroy@c-s.fr> wrote:
> This patch activates CONFIG_THREAD_INFO_IN_TASK which
> moves the thread_info into task_struct.
>
> Moving thread_info into task_struct has the following advantages:
> - It protects thread_info from corruption in the case of stack
> overflows.
> - Its address is harder to determine if stack addresses are
> leaked, making a number of attacks more difficult.
>
> This has the following consequences:
> - thread_info is now located at the top of task_struct.
"top"... I got confused for a minute thinking high address and
wondering how you can change CURRENT_THREAD_INFO just to point
to current :)
> diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
> index 07d9dce7eda6..4e98989b5512 100644
> --- a/arch/powerpc/Makefile
> +++ b/arch/powerpc/Makefile
> @@ -422,3 +422,9 @@ checkbin:
>
> CLEAN_FILES += $(TOUT)
>
> +ifdef CONFIG_SMP
> +prepare: task_cpu_prepare
> +
> +task_cpu_prepare: prepare0
> + $(eval KBUILD_CFLAGS += -D_TASK_CPU=$(shell awk '{if ($$2 == "TI_CPU") print $$3;}' include/generated/asm-offsets.h))
> +endif
> diff --git a/arch/powerpc/include/asm/ptrace.h b/arch/powerpc/include/asm/ptrace.h
> index 447cbd1bee99..3a7e5561630b 100644
> --- a/arch/powerpc/include/asm/ptrace.h
> +++ b/arch/powerpc/include/asm/ptrace.h
> @@ -120,7 +120,7 @@ extern int ptrace_put_reg(struct task_struct *task, int regno,
> unsigned long data);
>
> #define current_pt_regs() \
> - ((struct pt_regs *)((unsigned long)current_thread_info() + THREAD_SIZE) - 1)
> + ((struct pt_regs *)((unsigned long)task_stack_page(current) + THREAD_SIZE) - 1)
> /*
> * We use the least-significant bit of the trap field to indicate
> * whether we have saved the full set of registers, or only a
> diff --git a/arch/powerpc/include/asm/smp.h b/arch/powerpc/include/asm/smp.h
> index 95b66a0c639b..df519b7322e5 100644
> --- a/arch/powerpc/include/asm/smp.h
> +++ b/arch/powerpc/include/asm/smp.h
> @@ -83,7 +83,13 @@ int is_cpu_dead(unsigned int cpu);
> /* 32-bit */
> extern int smp_hw_index[];
>
> -#define raw_smp_processor_id() (current_thread_info()->cpu)
> +/*
> + * This is particularly ugly: it appears we can't actually get the definition
> + * of task_struct here, but we need access to the CPU this task is running on.
> + * Instead of using task_struct we're using _TASK_CPU which is extracted from
> + * asm-offsets.h by kbuild to get the current processor ID.
> + */
> +#define raw_smp_processor_id() (*(unsigned int*)((void*)current + _TASK_CPU))
This is clever but yes ugly. Can't you include asm-offsets.h? riscv
seems to.
I'm not 100% sure on kgdb and kexec stuff but I think it seems okay.
Looks like a pretty nice cleanup too aside from the features it brings,
thanks for working on it.
Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [RFC PATCH v3 4/7] powerpc: regain entire stack space
2018-10-01 12:30 ` [RFC PATCH v3 4/7] powerpc: regain entire stack space Christophe Leroy
@ 2018-10-03 5:34 ` Nicholas Piggin
2018-10-03 5:52 ` Christophe LEROY
0 siblings, 1 reply; 32+ messages in thread
From: Nicholas Piggin @ 2018-10-03 5:34 UTC (permalink / raw)
To: Christophe Leroy
Cc: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, linux-kernel, linuxppc-dev
On Mon, 1 Oct 2018 12:30:25 +0000 (UTC)
Christophe Leroy <christophe.leroy@c-s.fr> wrote:
> thread_info is not anymore in the stack, so the entire stack
> can now be used.
Nice.
>
> In the meantime, all pointers to the stacks are not anymore
> pointers to thread_info so this patch changes them to void*
Wasn't this previously effectively already the case with patch
3/7? You had thread_info sized space left there, but it was not
used or initialized right? Does it make sense to move this part
of it to the previous patch?
Thanks,
Nick
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [RFC PATCH v3 5/7] powerpc: 'current_set' is now a table of task_struct pointers
2018-10-01 12:30 ` [RFC PATCH v3 5/7] powerpc: 'current_set' is now a table of task_struct pointers Christophe Leroy
@ 2018-10-03 5:41 ` Nicholas Piggin
2018-10-03 6:00 ` Christophe LEROY
0 siblings, 1 reply; 32+ messages in thread
From: Nicholas Piggin @ 2018-10-03 5:41 UTC (permalink / raw)
To: Christophe Leroy
Cc: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, linux-kernel, linuxppc-dev
On Mon, 1 Oct 2018 12:30:27 +0000 (UTC)
Christophe Leroy <christophe.leroy@c-s.fr> wrote:
> The table of pointers 'current_set' has been used for retrieving
> the stack and current. They used to be thread_info pointers as
> they were pointing to the stack and current was taken from the
> 'task' field of the thread_info.
>
> Now, the pointers of 'current_set' table are now both pointers
> to task_struct and pointers to thread_info.
>
> As they are used to get current, and the stack pointer is
> retrieved from current's stack field, this patch changes
> their type to task_struct, and renames secondary_ti to
> secondary_current.
I'm not sure if current_set is actually needed is it? Because
64-bit already initializes paca->ksave / PACAKSAVE. That might
be a cleanup to do after your series.
Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [RFC PATCH v3 7/7] powerpc/64: Modify CURRENT_THREAD_INFO()
2018-10-01 12:30 ` [RFC PATCH v3 7/7] powerpc/64: Modify CURRENT_THREAD_INFO() Christophe Leroy
@ 2018-10-03 5:44 ` Nicholas Piggin
2018-10-03 6:01 ` Christophe LEROY
0 siblings, 1 reply; 32+ messages in thread
From: Nicholas Piggin @ 2018-10-03 5:44 UTC (permalink / raw)
To: Christophe Leroy
Cc: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, linux-kernel, linuxppc-dev
On Mon, 1 Oct 2018 12:30:31 +0000 (UTC)
Christophe Leroy <christophe.leroy@c-s.fr> wrote:
> CURRENT_THREAD_INFO() now uses the PACA to retrieve 'current' pointer,
> it doesn't use 'sp' anymore.
Can you remove this too now? I think it will be clearer what's going on
and easier to read once everyone remembers current is the same offset as
current thread_info.
Overall nice series, thanks for doing this.
Thanks,
Nick
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [RFC PATCH v3 3/7] powerpc: Activate CONFIG_THREAD_INFO_IN_TASK
2018-10-03 5:30 ` Nicholas Piggin
@ 2018-10-03 5:47 ` Christophe LEROY
2018-10-03 5:52 ` Nicholas Piggin
0 siblings, 1 reply; 32+ messages in thread
From: Christophe LEROY @ 2018-10-03 5:47 UTC (permalink / raw)
To: Nicholas Piggin
Cc: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, linux-kernel, linuxppc-dev
Le 03/10/2018 à 07:30, Nicholas Piggin a écrit :
> On Mon, 1 Oct 2018 12:30:23 +0000 (UTC)
> Christophe Leroy <christophe.leroy@c-s.fr> wrote:
>
>> This patch activates CONFIG_THREAD_INFO_IN_TASK which
>> moves the thread_info into task_struct.
>>
>> Moving thread_info into task_struct has the following advantages:
>> - It protects thread_info from corruption in the case of stack
>> overflows.
>> - Its address is harder to determine if stack addresses are
>> leaked, making a number of attacks more difficult.
>>
>> This has the following consequences:
>> - thread_info is now located at the top of task_struct.
>
> "top"... I got confused for a minute thinking high address and
> wondering how you can change CURRENT_THREAD_INFO just to point
> to current :)
Would 'beginning' be less confusing ?
>
>
>
>> diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
>> index 07d9dce7eda6..4e98989b5512 100644
>> --- a/arch/powerpc/Makefile
>> +++ b/arch/powerpc/Makefile
>> @@ -422,3 +422,9 @@ checkbin:
>>
>> CLEAN_FILES += $(TOUT)
>>
>> +ifdef CONFIG_SMP
>> +prepare: task_cpu_prepare
>> +
>> +task_cpu_prepare: prepare0
>> + $(eval KBUILD_CFLAGS += -D_TASK_CPU=$(shell awk '{if ($$2 == "TI_CPU") print $$3;}' include/generated/asm-offsets.h))
>> +endif
>> diff --git a/arch/powerpc/include/asm/ptrace.h b/arch/powerpc/include/asm/ptrace.h
>> index 447cbd1bee99..3a7e5561630b 100644
>> --- a/arch/powerpc/include/asm/ptrace.h
>> +++ b/arch/powerpc/include/asm/ptrace.h
>> @@ -120,7 +120,7 @@ extern int ptrace_put_reg(struct task_struct *task, int regno,
>> unsigned long data);
>>
>> #define current_pt_regs() \
>> - ((struct pt_regs *)((unsigned long)current_thread_info() + THREAD_SIZE) - 1)
>> + ((struct pt_regs *)((unsigned long)task_stack_page(current) + THREAD_SIZE) - 1)
>> /*
>> * We use the least-significant bit of the trap field to indicate
>> * whether we have saved the full set of registers, or only a
>> diff --git a/arch/powerpc/include/asm/smp.h b/arch/powerpc/include/asm/smp.h
>> index 95b66a0c639b..df519b7322e5 100644
>> --- a/arch/powerpc/include/asm/smp.h
>> +++ b/arch/powerpc/include/asm/smp.h
>> @@ -83,7 +83,13 @@ int is_cpu_dead(unsigned int cpu);
>> /* 32-bit */
>> extern int smp_hw_index[];
>>
>> -#define raw_smp_processor_id() (current_thread_info()->cpu)
>> +/*
>> + * This is particularly ugly: it appears we can't actually get the definition
>> + * of task_struct here, but we need access to the CPU this task is running on.
>> + * Instead of using task_struct we're using _TASK_CPU which is extracted from
>> + * asm-offsets.h by kbuild to get the current processor ID.
>> + */
>> +#define raw_smp_processor_id() (*(unsigned int*)((void*)current + _TASK_CPU))
>
> This is clever but yes ugly. Can't you include asm-offsets.h? riscv
> seems to.
riscv has a clean asm-offsets.h . Our's defines constant with the same
name as those defined in other headers which are included in C files. So
including asm-offsets in C files does create conflicts like:
./include/generated/asm-offsets.h:71:0: warning: "TASK_SIZE" redefined
#define TASK_SIZE -2147483648 /* TASK_SIZE */
./arch/powerpc/include/asm/processor.h:95:0: note: this is the location
of the previous definition
#define TASK_SIZE (CONFIG_TASK_SIZE)
./include/generated/asm-offsets.h:98:0: warning: "NSEC_PER_SEC" redefined
#define NSEC_PER_SEC 1000000000 /* NSEC_PER_SEC */
./include/linux/time64.h:36:0: note: this is the location of the
previous definition
#define NSEC_PER_SEC 1000000000L
./arch/powerpc/include/asm/nohash/32/pgtable.h:34:0: warning:
"PGD_TABLE_SIZE" redefined
#define PGD_TABLE_SIZE (sizeof(pgd_t) << PGD_INDEX_SIZE)
./include/generated/asm-offsets.h:101:0: note: this is the location of
the previous definition
#define PGD_TABLE_SIZE 256 /* PGD_TABLE_SIZE */
...
In v2, I had a patch to fix those redundancies
(https://patchwork.ozlabs.org/patch/974363/) but I found it unconvenient.
>
> I'm not 100% sure on kgdb and kexec stuff but I think it seems okay.
> Looks like a pretty nice cleanup too aside from the features it brings,
> thanks for working on it.
Thanks for reviewing it.
>
> Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
>
Christophe
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [RFC PATCH v3 2/7] powerpc: Prepare for moving thread_info into task_struct
2018-10-03 5:02 ` Nicholas Piggin
@ 2018-10-03 5:49 ` Christophe LEROY
2018-10-03 5:57 ` Nicholas Piggin
2018-10-04 14:29 ` Christophe LEROY
0 siblings, 2 replies; 32+ messages in thread
From: Christophe LEROY @ 2018-10-03 5:49 UTC (permalink / raw)
To: Nicholas Piggin
Cc: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, linux-kernel, linuxppc-dev
Le 03/10/2018 à 07:02, Nicholas Piggin a écrit :
> On Mon, 1 Oct 2018 12:30:21 +0000 (UTC)
> Christophe Leroy <christophe.leroy@c-s.fr> wrote:
>
>> This patch cleans the powerpc kernel before activating
>> CONFIG_THREAD_INFO_IN_TASK:
>> - The purpose of the pointer given to call_do_softirq() and
>> call_do_irq() is to point the new stack ==> change it to void*
>> - Don't use CURRENT_THREAD_INFO() to locate the stack.
>> - Fixed a few comments.
>> - TI_CPU is only used when CONFIG_SMP is set.
>> - Replace current_thread_info()->task by current
>> - Remove unnecessary casts to thread_info, as they'll become invalid
>> once thread_info is not in stack anymore.
>> - Ensure task_struct 'cpu' fields is not used directly out of SMP code
>> - Rename THREAD_INFO to TASK_STASK: As it is in fact the offset of the
>> pointer to the stack in task_struct, this pointer will not be impacted
>> by the move of THREAD_INFO.
>> - Makes TASK_STACK available to PPC64 which will need it to the get
>> stack pointer from current once the thread_info have been moved.
>>
>> Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
>> ---
>> arch/powerpc/include/asm/irq.h | 4 ++--
>> arch/powerpc/include/asm/livepatch.h | 2 +-
>> arch/powerpc/include/asm/processor.h | 4 ++--
>> arch/powerpc/include/asm/reg.h | 2 +-
>> arch/powerpc/kernel/asm-offsets.c | 2 +-
>> arch/powerpc/kernel/entry_32.S | 2 +-
>> arch/powerpc/kernel/entry_64.S | 2 +-
>> arch/powerpc/kernel/head_32.S | 4 ++--
>> arch/powerpc/kernel/head_40x.S | 4 ++--
>> arch/powerpc/kernel/head_44x.S | 2 +-
>> arch/powerpc/kernel/head_8xx.S | 2 +-
>> arch/powerpc/kernel/head_booke.h | 4 ++--
>> arch/powerpc/kernel/head_fsl_booke.S | 6 ++++--
>> arch/powerpc/kernel/irq.c | 2 +-
>> arch/powerpc/kernel/misc_32.S | 8 ++++++--
>> arch/powerpc/kernel/process.c | 6 +++---
>> arch/powerpc/kernel/setup_32.c | 15 +++++----------
>> arch/powerpc/kernel/smp.c | 4 +++-
>> arch/powerpc/xmon/xmon.c | 2 +-
>> 19 files changed, 40 insertions(+), 37 deletions(-)
>>
>> diff --git a/arch/powerpc/include/asm/irq.h b/arch/powerpc/include/asm/irq.h
>> index ee39ce56b2a2..8108d1fe33ca 100644
>> --- a/arch/powerpc/include/asm/irq.h
>> +++ b/arch/powerpc/include/asm/irq.h
>> @@ -63,8 +63,8 @@ extern struct thread_info *hardirq_ctx[NR_CPUS];
>> extern struct thread_info *softirq_ctx[NR_CPUS];
>>
>> extern void irq_ctx_init(void);
>> -extern void call_do_softirq(struct thread_info *tp);
>> -extern void call_do_irq(struct pt_regs *regs, struct thread_info *tp);
>> +extern void call_do_softirq(void *tp);
>> +extern void call_do_irq(struct pt_regs *regs, void *tp);
>
> void *sp for these ?
Yes, why not but it means changing the code. I wanted to minimise the
changes and avoid cosmetic. Or maybe should add a cosmetic patch at the
end ?
>
> This all seems okay to me except the 32-bit code which I don't know.
> Would it be any trouble for you to put the TI_CPU bits into their own
> patch?
No problem, I can put the TI_CPU bits in a separate patch.
>
> Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
>
Thanks
Christophe
>
>> extern void do_IRQ(struct pt_regs *regs);
>> extern void __init init_IRQ(void);
>> extern void __do_irq(struct pt_regs *regs);
>> diff --git a/arch/powerpc/include/asm/livepatch.h b/arch/powerpc/include/asm/livepatch.h
>> index 47a03b9b528b..818451bf629c 100644
>> --- a/arch/powerpc/include/asm/livepatch.h
>> +++ b/arch/powerpc/include/asm/livepatch.h
>> @@ -49,7 +49,7 @@ static inline void klp_init_thread_info(struct thread_info *ti)
>> ti->livepatch_sp = (unsigned long *)(ti + 1) + 1;
>> }
>> #else
>> -static void klp_init_thread_info(struct thread_info *ti) { }
>> +static inline void klp_init_thread_info(struct thread_info *ti) { }
>> #endif /* CONFIG_LIVEPATCH */
>>
>> #endif /* _ASM_POWERPC_LIVEPATCH_H */
>> diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h
>> index 353879db3e98..31873614392f 100644
>> --- a/arch/powerpc/include/asm/processor.h
>> +++ b/arch/powerpc/include/asm/processor.h
>> @@ -40,7 +40,7 @@
>>
>> #ifndef __ASSEMBLY__
>> #include <linux/types.h>
>> -#include <asm/thread_info.h>
>> +#include <linux/thread_info.h>
>> #include <asm/ptrace.h>
>> #include <asm/hw_breakpoint.h>
>>
>> @@ -333,7 +333,7 @@ struct thread_struct {
>>
>> #define INIT_SP (sizeof(init_stack) + (unsigned long) &init_stack)
>> #define INIT_SP_LIMIT \
>> - (_ALIGN_UP(sizeof(init_thread_info), 16) + (unsigned long) &init_stack)
>> + (_ALIGN_UP(sizeof(struct thread_info), 16) + (unsigned long) &init_stack)
>>
>> #ifdef CONFIG_SPE
>> #define SPEFSCR_INIT \
>> diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
>> index e5b314ed054e..f3a9cf19a986 100644
>> --- a/arch/powerpc/include/asm/reg.h
>> +++ b/arch/powerpc/include/asm/reg.h
>> @@ -1053,7 +1053,7 @@
>> * - SPRG9 debug exception scratch
>> *
>> * All 32-bit:
>> - * - SPRG3 current thread_info pointer
>> + * - SPRG3 current thread_struct physical addr pointer
>> * (virtual on BookE, physical on others)
>> *
>> * 32-bit classic:
>> diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c
>> index ba9d0fc98730..d1f161e48945 100644
>> --- a/arch/powerpc/kernel/asm-offsets.c
>> +++ b/arch/powerpc/kernel/asm-offsets.c
>> @@ -85,10 +85,10 @@ int main(void)
>> DEFINE(NMI_MASK, NMI_MASK);
>> OFFSET(TASKTHREADPPR, task_struct, thread.ppr);
>> #else
>> - OFFSET(THREAD_INFO, task_struct, stack);
>> DEFINE(THREAD_INFO_GAP, _ALIGN_UP(sizeof(struct thread_info), 16));
>> OFFSET(KSP_LIMIT, thread_struct, ksp_limit);
>> #endif /* CONFIG_PPC64 */
>> + OFFSET(TASK_STACK, task_struct, stack);
>>
>> #ifdef CONFIG_LIVEPATCH
>> OFFSET(TI_livepatch_sp, thread_info, livepatch_sp);
>> diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S
>> index e58c3f467db5..12c0721f65ea 100644
>> --- a/arch/powerpc/kernel/entry_32.S
>> +++ b/arch/powerpc/kernel/entry_32.S
>> @@ -1166,7 +1166,7 @@ ret_from_debug_exc:
>> mfspr r9,SPRN_SPRG_THREAD
>> lwz r10,SAVED_KSP_LIMIT(r1)
>> stw r10,KSP_LIMIT(r9)
>> - lwz r9,THREAD_INFO-THREAD(r9)
>> + lwz r9,TASK_STACK-THREAD(r9)
>> CURRENT_THREAD_INFO(r10, r1)
>> lwz r10,TI_PREEMPT(r10)
>> stw r10,TI_PREEMPT(r9)
>> diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
>> index 77a888bfcb53..697406572592 100644
>> --- a/arch/powerpc/kernel/entry_64.S
>> +++ b/arch/powerpc/kernel/entry_64.S
>> @@ -680,7 +680,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
>> 2:
>> #endif /* CONFIG_PPC_BOOK3S_64 */
>>
>> - CURRENT_THREAD_INFO(r7, r8) /* base of new stack */
>> + clrrdi r7, r8, THREAD_SHIFT /* base of new stack */
>> /* Note: this uses SWITCH_FRAME_SIZE rather than INT_FRAME_SIZE
>> because we don't need to leave the 288-byte ABI gap at the
>> top of the kernel stack. */
>> diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S
>> index 61ca27929355..dce6f2ff07e5 100644
>> --- a/arch/powerpc/kernel/head_32.S
>> +++ b/arch/powerpc/kernel/head_32.S
>> @@ -261,7 +261,7 @@ __secondary_hold_acknowledge:
>> tophys(r11,r1); /* use tophys(r1) if kernel */ \
>> beq 1f; \
>> mfspr r11,SPRN_SPRG_THREAD; \
>> - lwz r11,THREAD_INFO-THREAD(r11); \
>> + lwz r11,TASK_STACK-THREAD(r11); \
>> addi r11,r11,THREAD_SIZE; \
>> tophys(r11,r11); \
>> 1: subi r11,r11,INT_FRAME_SIZE /* alloc exc. frame */
>> @@ -841,7 +841,7 @@ __secondary_start:
>> bl init_idle_6xx
>> #endif /* CONFIG_6xx */
>>
>> - /* get current_thread_info and current */
>> + /* get current's stack and current */
>> lis r1,secondary_ti@ha
>> tophys(r1,r1)
>> lwz r1,secondary_ti@l(r1)
>> diff --git a/arch/powerpc/kernel/head_40x.S b/arch/powerpc/kernel/head_40x.S
>> index b19d78410511..3088c9f29f5e 100644
>> --- a/arch/powerpc/kernel/head_40x.S
>> +++ b/arch/powerpc/kernel/head_40x.S
>> @@ -115,7 +115,7 @@ _ENTRY(saved_ksp_limit)
>> andi. r11,r11,MSR_PR; \
>> beq 1f; \
>> mfspr r1,SPRN_SPRG_THREAD; /* if from user, start at top of */\
>> - lwz r1,THREAD_INFO-THREAD(r1); /* this thread's kernel stack */\
>> + lwz r1,TASK_STACK-THREAD(r1); /* this thread's kernel stack */\
>> addi r1,r1,THREAD_SIZE; \
>> 1: subi r1,r1,INT_FRAME_SIZE; /* Allocate an exception frame */\
>> tophys(r11,r1); \
>> @@ -158,7 +158,7 @@ _ENTRY(saved_ksp_limit)
>> beq 1f; \
>> /* COMING FROM USER MODE */ \
>> mfspr r11,SPRN_SPRG_THREAD; /* if from user, start at top of */\
>> - lwz r11,THREAD_INFO-THREAD(r11); /* this thread's kernel stack */\
>> + lwz r11,TASK_STACK-THREAD(r11); /* this thread's kernel stack */\
>> 1: addi r11,r11,THREAD_SIZE-INT_FRAME_SIZE; /* Alloc an excpt frm */\
>> tophys(r11,r11); \
>> stw r10,_CCR(r11); /* save various registers */\
>> diff --git a/arch/powerpc/kernel/head_44x.S b/arch/powerpc/kernel/head_44x.S
>> index 37e4a7cf0065..15d39b2499de 100644
>> --- a/arch/powerpc/kernel/head_44x.S
>> +++ b/arch/powerpc/kernel/head_44x.S
>> @@ -1020,7 +1020,7 @@ _GLOBAL(start_secondary_47x)
>>
>> /* Now we can get our task struct and real stack pointer */
>>
>> - /* Get current_thread_info and current */
>> + /* Get current's stack and current */
>> lis r1,secondary_ti@ha
>> lwz r1,secondary_ti@l(r1)
>> lwz r2,TI_TASK(r1)
>> diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S
>> index 6582f824d620..e56e36aa2b3d 100644
>> --- a/arch/powerpc/kernel/head_8xx.S
>> +++ b/arch/powerpc/kernel/head_8xx.S
>> @@ -124,7 +124,7 @@ turn_on_mmu:
>> tophys(r11,r1); /* use tophys(r1) if kernel */ \
>> beq 1f; \
>> mfspr r11,SPRN_SPRG_THREAD; \
>> - lwz r11,THREAD_INFO-THREAD(r11); \
>> + lwz r11,TASK_STACK-THREAD(r11); \
>> addi r11,r11,THREAD_SIZE; \
>> tophys(r11,r11); \
>> 1: subi r11,r11,INT_FRAME_SIZE /* alloc exc. frame */
>> diff --git a/arch/powerpc/kernel/head_booke.h b/arch/powerpc/kernel/head_booke.h
>> index d0862a100d29..20fe0c93a0bd 100644
>> --- a/arch/powerpc/kernel/head_booke.h
>> +++ b/arch/powerpc/kernel/head_booke.h
>> @@ -44,7 +44,7 @@
>> mr r11, r1; \
>> beq 1f; \
>> /* if from user, start at top of this thread's kernel stack */ \
>> - lwz r11, THREAD_INFO-THREAD(r10); \
>> + lwz r11, TASK_STACK-THREAD(r10); \
>> ALLOC_STACK_FRAME(r11, THREAD_SIZE); \
>> 1 : subi r11, r11, INT_FRAME_SIZE; /* Allocate exception frame */ \
>> stw r13, _CCR(r11); /* save various registers */ \
>> @@ -130,7 +130,7 @@
>> DO_KVM BOOKE_INTERRUPT_##intno exc_level_srr1; \
>> andi. r11,r11,MSR_PR; \
>> mfspr r11,SPRN_SPRG_THREAD; /* if from user, start at top of */\
>> - lwz r11,THREAD_INFO-THREAD(r11); /* this thread's kernel stack */\
>> + lwz r11,TASK_STACK-THREAD(r11); /* this thread's kernel stack */\
>> addi r11,r11,EXC_LVL_FRAME_OVERHEAD; /* allocate stack frame */\
>> beq 1f; \
>> /* COMING FROM USER MODE */ \
>> diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S
>> index e2750b856c8f..239ad8a4754e 100644
>> --- a/arch/powerpc/kernel/head_fsl_booke.S
>> +++ b/arch/powerpc/kernel/head_fsl_booke.S
>> @@ -243,8 +243,10 @@ set_ivor:
>> li r0,0
>> stwu r0,THREAD_SIZE-STACK_FRAME_OVERHEAD(r1)
>>
>> +#ifdef CONFIG_SMP
>> CURRENT_THREAD_INFO(r22, r1)
>> stw r24, TI_CPU(r22)
>> +#endif
>>
>> bl early_init
>>
>> @@ -702,7 +704,7 @@ finish_tlb_load:
>>
>> /* Get the next_tlbcam_idx percpu var */
>> #ifdef CONFIG_SMP
>> - lwz r12, THREAD_INFO-THREAD(r12)
>> + lwz r12, TASK_STACK-THREAD(r12)
>> lwz r15, TI_CPU(r12)
>> lis r14, __per_cpu_offset@h
>> ori r14, r14, __per_cpu_offset@l
>> @@ -1074,7 +1076,7 @@ __secondary_start:
>> mr r4,r24 /* Why? */
>> bl call_setup_cpu
>>
>> - /* get current_thread_info and current */
>> + /* get current's stack and current */
>> lis r1,secondary_ti@ha
>> lwz r1,secondary_ti@l(r1)
>> lwz r2,TI_TASK(r1)
>> diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
>> index 916ddc4aac44..aa53db3ba6e7 100644
>> --- a/arch/powerpc/kernel/irq.c
>> +++ b/arch/powerpc/kernel/irq.c
>> @@ -663,7 +663,7 @@ void do_IRQ(struct pt_regs *regs)
>> struct thread_info *curtp, *irqtp, *sirqtp;
>>
>> /* Switch to the irq stack to handle this */
>> - curtp = current_thread_info();
>> + curtp = (void*)(current_stack_pointer() & ~(THREAD_SIZE - 1));
>> irqtp = hardirq_ctx[raw_smp_processor_id()];
>> sirqtp = softirq_ctx[raw_smp_processor_id()];
>>
>> diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S
>> index 695b24a2d954..24a7f18ea10c 100644
>> --- a/arch/powerpc/kernel/misc_32.S
>> +++ b/arch/powerpc/kernel/misc_32.S
>> @@ -60,7 +60,7 @@ _GLOBAL(call_do_softirq)
>> blr
>>
>> /*
>> - * void call_do_irq(struct pt_regs *regs, struct thread_info *irqtp);
>> + * void call_do_irq(struct pt_regs *regs, void *irqtp);
>> */
>> _GLOBAL(call_do_irq)
>> mflr r0
>> @@ -183,10 +183,14 @@ _GLOBAL(low_choose_750fx_pll)
>> or r4,r4,r5
>> mtspr SPRN_HID1,r4
>>
>> +#ifdef CONFIG_SMP
>> /* Store new HID1 image */
>> CURRENT_THREAD_INFO(r6, r1)
>> lwz r6,TI_CPU(r6)
>> slwi r6,r6,2
>> +#else
>> + li r6, 0
>> +#endif
>> addis r6,r6,nap_save_hid1@ha
>> stw r4,nap_save_hid1@l(r6)
>>
>> @@ -599,7 +603,7 @@ EXPORT_SYMBOL(__bswapdi2)
>> #ifdef CONFIG_SMP
>> _GLOBAL(start_secondary_resume)
>> /* Reset stack */
>> - CURRENT_THREAD_INFO(r1, r1)
>> + rlwinm r1, r1, 0, 0, 31 - THREAD_SHIFT
>> addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD
>> li r3,0
>> stw r3,0(r1) /* Zero the stack frame pointer */
>> diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
>> index 03c2e1f134bc..111abb4df2ec 100644
>> --- a/arch/powerpc/kernel/process.c
>> +++ b/arch/powerpc/kernel/process.c
>> @@ -1240,8 +1240,8 @@ struct task_struct *__switch_to(struct task_struct *prev,
>> batch->active = 1;
>> }
>>
>> - if (current_thread_info()->task->thread.regs) {
>> - restore_math(current_thread_info()->task->thread.regs);
>> + if (current->thread.regs) {
>> + restore_math(current->thread.regs);
>>
>> /*
>> * The copy-paste buffer can only store into foreign real
>> @@ -1251,7 +1251,7 @@ struct task_struct *__switch_to(struct task_struct *prev,
>> * mappings, we must issue a cp_abort to clear any state and
>> * prevent snooping, corruption or a covert channel.
>> */
>> - if (current_thread_info()->task->thread.used_vas)
>> + if (current->thread.used_vas)
>> asm volatile(PPC_CP_ABORT);
>> }
>> #endif /* CONFIG_PPC_BOOK3S_64 */
>> diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c
>> index 8c507be12c3c..81ebf7d6f526 100644
>> --- a/arch/powerpc/kernel/setup_32.c
>> +++ b/arch/powerpc/kernel/setup_32.c
>> @@ -205,10 +205,8 @@ void __init irqstack_early_init(void)
>> /* interrupt stacks must be in lowmem, we get that for free on ppc32
>> * as the memblock is limited to lowmem by default */
>> for_each_possible_cpu(i) {
>> - softirq_ctx[i] = (struct thread_info *)
>> - __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
>> - hardirq_ctx[i] = (struct thread_info *)
>> - __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
>> + softirq_ctx[i] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
>> + hardirq_ctx[i] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
>> }
>> }
>>
>> @@ -226,13 +224,10 @@ void __init exc_lvl_early_init(void)
>> hw_cpu = 0;
>> #endif
>>
>> - critirq_ctx[hw_cpu] = (struct thread_info *)
>> - __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
>> + critirq_ctx[hw_cpu] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
>> #ifdef CONFIG_BOOKE
>> - dbgirq_ctx[hw_cpu] = (struct thread_info *)
>> - __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
>> - mcheckirq_ctx[hw_cpu] = (struct thread_info *)
>> - __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
>> + dbgirq_ctx[hw_cpu] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
>> + mcheckirq_ctx[hw_cpu] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
>> #endif
>> }
>> }
>> diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
>> index 61c1fadbc644..19dd0ea55714 100644
>> --- a/arch/powerpc/kernel/smp.c
>> +++ b/arch/powerpc/kernel/smp.c
>> @@ -20,6 +20,7 @@
>> #include <linux/kernel.h>
>> #include <linux/export.h>
>> #include <linux/sched/mm.h>
>> +#include <linux/sched/task_stack.h>
>> #include <linux/sched/topology.h>
>> #include <linux/smp.h>
>> #include <linux/interrupt.h>
>> @@ -812,7 +813,8 @@ static void cpu_idle_thread_init(unsigned int cpu, struct task_struct *idle)
>>
>> #ifdef CONFIG_PPC64
>> paca_ptrs[cpu]->__current = idle;
>> - paca_ptrs[cpu]->kstack = (unsigned long)ti + THREAD_SIZE - STACK_FRAME_OVERHEAD;
>> + paca_ptrs[cpu]->kstack = (unsigned long)task_stack_page(idle) +
>> + THREAD_SIZE - STACK_FRAME_OVERHEAD;
>> #endif
>> ti->cpu = cpu;
>> secondary_ti = current_set[cpu] = ti;
>> diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
>> index 694c1d92e796..0d8d6fee892a 100644
>> --- a/arch/powerpc/xmon/xmon.c
>> +++ b/arch/powerpc/xmon/xmon.c
>> @@ -2988,7 +2988,7 @@ static void show_task(struct task_struct *tsk)
>> printf("%px %016lx %6d %6d %c %2d %s\n", tsk,
>> tsk->thread.ksp,
>> tsk->pid, tsk->parent->pid,
>> - state, task_thread_info(tsk)->cpu,
>> + state, task_cpu(tsk),
>> tsk->comm);
>> }
>>
>> --
>> 2.13.3
>>
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [RFC PATCH v3 3/7] powerpc: Activate CONFIG_THREAD_INFO_IN_TASK
2018-10-03 5:47 ` Christophe LEROY
@ 2018-10-03 5:52 ` Nicholas Piggin
2018-10-03 6:04 ` Christophe LEROY
0 siblings, 1 reply; 32+ messages in thread
From: Nicholas Piggin @ 2018-10-03 5:52 UTC (permalink / raw)
To: Christophe LEROY
Cc: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, linux-kernel, linuxppc-dev
On Wed, 3 Oct 2018 07:47:05 +0200
Christophe LEROY <christophe.leroy@c-s.fr> wrote:
> Le 03/10/2018 à 07:30, Nicholas Piggin a écrit :
> > On Mon, 1 Oct 2018 12:30:23 +0000 (UTC)
> > Christophe Leroy <christophe.leroy@c-s.fr> wrote:
> >
> >> This patch activates CONFIG_THREAD_INFO_IN_TASK which
> >> moves the thread_info into task_struct.
> >>
> >> Moving thread_info into task_struct has the following advantages:
> >> - It protects thread_info from corruption in the case of stack
> >> overflows.
> >> - Its address is harder to determine if stack addresses are
> >> leaked, making a number of attacks more difficult.
> >>
> >> This has the following consequences:
> >> - thread_info is now located at the top of task_struct.
> >
> > "top"... I got confused for a minute thinking high address and
> > wondering how you can change CURRENT_THREAD_INFO just to point
> > to current :)
>
> Would 'beginning' be less confusing ?
Yes, good idea.
> >> @@ -83,7 +83,13 @@ int is_cpu_dead(unsigned int cpu);
> >> /* 32-bit */
> >> extern int smp_hw_index[];
> >>
> >> -#define raw_smp_processor_id() (current_thread_info()->cpu)
> >> +/*
> >> + * This is particularly ugly: it appears we can't actually get the definition
> >> + * of task_struct here, but we need access to the CPU this task is running on.
> >> + * Instead of using task_struct we're using _TASK_CPU which is extracted from
> >> + * asm-offsets.h by kbuild to get the current processor ID.
> >> + */
> >> +#define raw_smp_processor_id() (*(unsigned int*)((void*)current + _TASK_CPU))
> >
> > This is clever but yes ugly. Can't you include asm-offsets.h? riscv
> > seems to.
>
> riscv has a clean asm-offsets.h . Our's defines constant with the same
> name as those defined in other headers which are included in C files. So
> including asm-offsets in C files does create conflicts like:
>
> ./include/generated/asm-offsets.h:71:0: warning: "TASK_SIZE" redefined
> #define TASK_SIZE -2147483648 /* TASK_SIZE */
> ./arch/powerpc/include/asm/processor.h:95:0: note: this is the location
> of the previous definition
> #define TASK_SIZE (CONFIG_TASK_SIZE)
>
> ./include/generated/asm-offsets.h:98:0: warning: "NSEC_PER_SEC" redefined
> #define NSEC_PER_SEC 1000000000 /* NSEC_PER_SEC */
> ./include/linux/time64.h:36:0: note: this is the location of the
> previous definition
> #define NSEC_PER_SEC 1000000000L
>
> ./arch/powerpc/include/asm/nohash/32/pgtable.h:34:0: warning:
> "PGD_TABLE_SIZE" redefined
> #define PGD_TABLE_SIZE (sizeof(pgd_t) << PGD_INDEX_SIZE)
> ./include/generated/asm-offsets.h:101:0: note: this is the location of
> the previous definition
> #define PGD_TABLE_SIZE 256 /* PGD_TABLE_SIZE */
>
> ...
Okay.
>
> In v2, I had a patch to fix those redundancies
> (https://patchwork.ozlabs.org/patch/974363/) but I found it unconvenient.
Because of merge conflicts, or you did not like the new names?
Thanks,
Nick
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [RFC PATCH v3 4/7] powerpc: regain entire stack space
2018-10-03 5:34 ` Nicholas Piggin
@ 2018-10-03 5:52 ` Christophe LEROY
2018-10-03 6:30 ` Nicholas Piggin
0 siblings, 1 reply; 32+ messages in thread
From: Christophe LEROY @ 2018-10-03 5:52 UTC (permalink / raw)
To: Nicholas Piggin
Cc: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, linux-kernel, linuxppc-dev
Le 03/10/2018 à 07:34, Nicholas Piggin a écrit :
> On Mon, 1 Oct 2018 12:30:25 +0000 (UTC)
> Christophe Leroy <christophe.leroy@c-s.fr> wrote:
>
>> thread_info is not anymore in the stack, so the entire stack
>> can now be used.
>
> Nice.
>
>>
>> In the meantime, all pointers to the stacks are not anymore
>> pointers to thread_info so this patch changes them to void*
>
> Wasn't this previously effectively already the case with patch
> 3/7? You had thread_info sized space left there, but it was not
> used or initialized right? Does it make sense to move this part
> of it to the previous patch?
Not really.
In 3/7 I changed the prototypes of two functions that really used the
pointer as a task pointer only.
Here it change things that before 4/7 were really used as both stack
pointers and thread_info pointers.
Christophe
>
> Thanks,
> Nick
>
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [RFC PATCH v3 2/7] powerpc: Prepare for moving thread_info into task_struct
2018-10-03 5:49 ` Christophe LEROY
@ 2018-10-03 5:57 ` Nicholas Piggin
2018-10-04 14:29 ` Christophe LEROY
1 sibling, 0 replies; 32+ messages in thread
From: Nicholas Piggin @ 2018-10-03 5:57 UTC (permalink / raw)
To: Christophe LEROY
Cc: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, linux-kernel, linuxppc-dev
On Wed, 3 Oct 2018 07:49:44 +0200
Christophe LEROY <christophe.leroy@c-s.fr> wrote:
> Le 03/10/2018 à 07:02, Nicholas Piggin a écrit :
> > On Mon, 1 Oct 2018 12:30:21 +0000 (UTC)
> > Christophe Leroy <christophe.leroy@c-s.fr> wrote:
> >
> >> This patch cleans the powerpc kernel before activating
> >> CONFIG_THREAD_INFO_IN_TASK:
> >> - The purpose of the pointer given to call_do_softirq() and
> >> call_do_irq() is to point the new stack ==> change it to void*
> >> - Don't use CURRENT_THREAD_INFO() to locate the stack.
> >> - Fixed a few comments.
> >> - TI_CPU is only used when CONFIG_SMP is set.
> >> - Replace current_thread_info()->task by current
> >> - Remove unnecessary casts to thread_info, as they'll become invalid
> >> once thread_info is not in stack anymore.
> >> - Ensure task_struct 'cpu' fields is not used directly out of SMP code
> >> - Rename THREAD_INFO to TASK_STASK: As it is in fact the offset of the
> >> pointer to the stack in task_struct, this pointer will not be impacted
> >> by the move of THREAD_INFO.
> >> - Makes TASK_STACK available to PPC64 which will need it to the get
> >> stack pointer from current once the thread_info have been moved.
> >>
> >> Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
> >> ---
> >> arch/powerpc/include/asm/irq.h | 4 ++--
> >> arch/powerpc/include/asm/livepatch.h | 2 +-
> >> arch/powerpc/include/asm/processor.h | 4 ++--
> >> arch/powerpc/include/asm/reg.h | 2 +-
> >> arch/powerpc/kernel/asm-offsets.c | 2 +-
> >> arch/powerpc/kernel/entry_32.S | 2 +-
> >> arch/powerpc/kernel/entry_64.S | 2 +-
> >> arch/powerpc/kernel/head_32.S | 4 ++--
> >> arch/powerpc/kernel/head_40x.S | 4 ++--
> >> arch/powerpc/kernel/head_44x.S | 2 +-
> >> arch/powerpc/kernel/head_8xx.S | 2 +-
> >> arch/powerpc/kernel/head_booke.h | 4 ++--
> >> arch/powerpc/kernel/head_fsl_booke.S | 6 ++++--
> >> arch/powerpc/kernel/irq.c | 2 +-
> >> arch/powerpc/kernel/misc_32.S | 8 ++++++--
> >> arch/powerpc/kernel/process.c | 6 +++---
> >> arch/powerpc/kernel/setup_32.c | 15 +++++----------
> >> arch/powerpc/kernel/smp.c | 4 +++-
> >> arch/powerpc/xmon/xmon.c | 2 +-
> >> 19 files changed, 40 insertions(+), 37 deletions(-)
> >>
> >> diff --git a/arch/powerpc/include/asm/irq.h b/arch/powerpc/include/asm/irq.h
> >> index ee39ce56b2a2..8108d1fe33ca 100644
> >> --- a/arch/powerpc/include/asm/irq.h
> >> +++ b/arch/powerpc/include/asm/irq.h
> >> @@ -63,8 +63,8 @@ extern struct thread_info *hardirq_ctx[NR_CPUS];
> >> extern struct thread_info *softirq_ctx[NR_CPUS];
> >>
> >> extern void irq_ctx_init(void);
> >> -extern void call_do_softirq(struct thread_info *tp);
> >> -extern void call_do_irq(struct pt_regs *regs, struct thread_info *tp);
> >> +extern void call_do_softirq(void *tp);
> >> +extern void call_do_irq(struct pt_regs *regs, void *tp);
> >
> > void *sp for these ?
>
> Yes, why not but it means changing the code. I wanted to minimise the
> changes and avoid cosmetic.
Fair enough.
> Or maybe should add a cosmetic patch at the
> end ?
Yeah that would be nice, I don't mind too much if it goes as part of
the patches or as a cleanup afterward. There's a few other places that
could use similar minor.
> > This all seems okay to me except the 32-bit code which I don't know.
> > Would it be any trouble for you to put the TI_CPU bits into their own
> > patch?
>
> No problem, I can put the TI_CPU bits in a separate patch.
Great thanks.
Thanks,
Nick
>
> >
> > Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
> >
>
> Thanks
> Christophe
>
> >
> >> extern void do_IRQ(struct pt_regs *regs);
> >> extern void __init init_IRQ(void);
> >> extern void __do_irq(struct pt_regs *regs);
> >> diff --git a/arch/powerpc/include/asm/livepatch.h b/arch/powerpc/include/asm/livepatch.h
> >> index 47a03b9b528b..818451bf629c 100644
> >> --- a/arch/powerpc/include/asm/livepatch.h
> >> +++ b/arch/powerpc/include/asm/livepatch.h
> >> @@ -49,7 +49,7 @@ static inline void klp_init_thread_info(struct thread_info *ti)
> >> ti->livepatch_sp = (unsigned long *)(ti + 1) + 1;
> >> }
> >> #else
> >> -static void klp_init_thread_info(struct thread_info *ti) { }
> >> +static inline void klp_init_thread_info(struct thread_info *ti) { }
> >> #endif /* CONFIG_LIVEPATCH */
> >>
> >> #endif /* _ASM_POWERPC_LIVEPATCH_H */
> >> diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h
> >> index 353879db3e98..31873614392f 100644
> >> --- a/arch/powerpc/include/asm/processor.h
> >> +++ b/arch/powerpc/include/asm/processor.h
> >> @@ -40,7 +40,7 @@
> >>
> >> #ifndef __ASSEMBLY__
> >> #include <linux/types.h>
> >> -#include <asm/thread_info.h>
> >> +#include <linux/thread_info.h>
> >> #include <asm/ptrace.h>
> >> #include <asm/hw_breakpoint.h>
> >>
> >> @@ -333,7 +333,7 @@ struct thread_struct {
> >>
> >> #define INIT_SP (sizeof(init_stack) + (unsigned long) &init_stack)
> >> #define INIT_SP_LIMIT \
> >> - (_ALIGN_UP(sizeof(init_thread_info), 16) + (unsigned long) &init_stack)
> >> + (_ALIGN_UP(sizeof(struct thread_info), 16) + (unsigned long) &init_stack)
> >>
> >> #ifdef CONFIG_SPE
> >> #define SPEFSCR_INIT \
> >> diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
> >> index e5b314ed054e..f3a9cf19a986 100644
> >> --- a/arch/powerpc/include/asm/reg.h
> >> +++ b/arch/powerpc/include/asm/reg.h
> >> @@ -1053,7 +1053,7 @@
> >> * - SPRG9 debug exception scratch
> >> *
> >> * All 32-bit:
> >> - * - SPRG3 current thread_info pointer
> >> + * - SPRG3 current thread_struct physical addr pointer
> >> * (virtual on BookE, physical on others)
> >> *
> >> * 32-bit classic:
> >> diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c
> >> index ba9d0fc98730..d1f161e48945 100644
> >> --- a/arch/powerpc/kernel/asm-offsets.c
> >> +++ b/arch/powerpc/kernel/asm-offsets.c
> >> @@ -85,10 +85,10 @@ int main(void)
> >> DEFINE(NMI_MASK, NMI_MASK);
> >> OFFSET(TASKTHREADPPR, task_struct, thread.ppr);
> >> #else
> >> - OFFSET(THREAD_INFO, task_struct, stack);
> >> DEFINE(THREAD_INFO_GAP, _ALIGN_UP(sizeof(struct thread_info), 16));
> >> OFFSET(KSP_LIMIT, thread_struct, ksp_limit);
> >> #endif /* CONFIG_PPC64 */
> >> + OFFSET(TASK_STACK, task_struct, stack);
> >>
> >> #ifdef CONFIG_LIVEPATCH
> >> OFFSET(TI_livepatch_sp, thread_info, livepatch_sp);
> >> diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S
> >> index e58c3f467db5..12c0721f65ea 100644
> >> --- a/arch/powerpc/kernel/entry_32.S
> >> +++ b/arch/powerpc/kernel/entry_32.S
> >> @@ -1166,7 +1166,7 @@ ret_from_debug_exc:
> >> mfspr r9,SPRN_SPRG_THREAD
> >> lwz r10,SAVED_KSP_LIMIT(r1)
> >> stw r10,KSP_LIMIT(r9)
> >> - lwz r9,THREAD_INFO-THREAD(r9)
> >> + lwz r9,TASK_STACK-THREAD(r9)
> >> CURRENT_THREAD_INFO(r10, r1)
> >> lwz r10,TI_PREEMPT(r10)
> >> stw r10,TI_PREEMPT(r9)
> >> diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
> >> index 77a888bfcb53..697406572592 100644
> >> --- a/arch/powerpc/kernel/entry_64.S
> >> +++ b/arch/powerpc/kernel/entry_64.S
> >> @@ -680,7 +680,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
> >> 2:
> >> #endif /* CONFIG_PPC_BOOK3S_64 */
> >>
> >> - CURRENT_THREAD_INFO(r7, r8) /* base of new stack */
> >> + clrrdi r7, r8, THREAD_SHIFT /* base of new stack */
> >> /* Note: this uses SWITCH_FRAME_SIZE rather than INT_FRAME_SIZE
> >> because we don't need to leave the 288-byte ABI gap at the
> >> top of the kernel stack. */
> >> diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S
> >> index 61ca27929355..dce6f2ff07e5 100644
> >> --- a/arch/powerpc/kernel/head_32.S
> >> +++ b/arch/powerpc/kernel/head_32.S
> >> @@ -261,7 +261,7 @@ __secondary_hold_acknowledge:
> >> tophys(r11,r1); /* use tophys(r1) if kernel */ \
> >> beq 1f; \
> >> mfspr r11,SPRN_SPRG_THREAD; \
> >> - lwz r11,THREAD_INFO-THREAD(r11); \
> >> + lwz r11,TASK_STACK-THREAD(r11); \
> >> addi r11,r11,THREAD_SIZE; \
> >> tophys(r11,r11); \
> >> 1: subi r11,r11,INT_FRAME_SIZE /* alloc exc. frame */
> >> @@ -841,7 +841,7 @@ __secondary_start:
> >> bl init_idle_6xx
> >> #endif /* CONFIG_6xx */
> >>
> >> - /* get current_thread_info and current */
> >> + /* get current's stack and current */
> >> lis r1,secondary_ti@ha
> >> tophys(r1,r1)
> >> lwz r1,secondary_ti@l(r1)
> >> diff --git a/arch/powerpc/kernel/head_40x.S b/arch/powerpc/kernel/head_40x.S
> >> index b19d78410511..3088c9f29f5e 100644
> >> --- a/arch/powerpc/kernel/head_40x.S
> >> +++ b/arch/powerpc/kernel/head_40x.S
> >> @@ -115,7 +115,7 @@ _ENTRY(saved_ksp_limit)
> >> andi. r11,r11,MSR_PR; \
> >> beq 1f; \
> >> mfspr r1,SPRN_SPRG_THREAD; /* if from user, start at top of */\
> >> - lwz r1,THREAD_INFO-THREAD(r1); /* this thread's kernel stack */\
> >> + lwz r1,TASK_STACK-THREAD(r1); /* this thread's kernel stack */\
> >> addi r1,r1,THREAD_SIZE; \
> >> 1: subi r1,r1,INT_FRAME_SIZE; /* Allocate an exception frame */\
> >> tophys(r11,r1); \
> >> @@ -158,7 +158,7 @@ _ENTRY(saved_ksp_limit)
> >> beq 1f; \
> >> /* COMING FROM USER MODE */ \
> >> mfspr r11,SPRN_SPRG_THREAD; /* if from user, start at top of */\
> >> - lwz r11,THREAD_INFO-THREAD(r11); /* this thread's kernel stack */\
> >> + lwz r11,TASK_STACK-THREAD(r11); /* this thread's kernel stack */\
> >> 1: addi r11,r11,THREAD_SIZE-INT_FRAME_SIZE; /* Alloc an excpt frm */\
> >> tophys(r11,r11); \
> >> stw r10,_CCR(r11); /* save various registers */\
> >> diff --git a/arch/powerpc/kernel/head_44x.S b/arch/powerpc/kernel/head_44x.S
> >> index 37e4a7cf0065..15d39b2499de 100644
> >> --- a/arch/powerpc/kernel/head_44x.S
> >> +++ b/arch/powerpc/kernel/head_44x.S
> >> @@ -1020,7 +1020,7 @@ _GLOBAL(start_secondary_47x)
> >>
> >> /* Now we can get our task struct and real stack pointer */
> >>
> >> - /* Get current_thread_info and current */
> >> + /* Get current's stack and current */
> >> lis r1,secondary_ti@ha
> >> lwz r1,secondary_ti@l(r1)
> >> lwz r2,TI_TASK(r1)
> >> diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S
> >> index 6582f824d620..e56e36aa2b3d 100644
> >> --- a/arch/powerpc/kernel/head_8xx.S
> >> +++ b/arch/powerpc/kernel/head_8xx.S
> >> @@ -124,7 +124,7 @@ turn_on_mmu:
> >> tophys(r11,r1); /* use tophys(r1) if kernel */ \
> >> beq 1f; \
> >> mfspr r11,SPRN_SPRG_THREAD; \
> >> - lwz r11,THREAD_INFO-THREAD(r11); \
> >> + lwz r11,TASK_STACK-THREAD(r11); \
> >> addi r11,r11,THREAD_SIZE; \
> >> tophys(r11,r11); \
> >> 1: subi r11,r11,INT_FRAME_SIZE /* alloc exc. frame */
> >> diff --git a/arch/powerpc/kernel/head_booke.h b/arch/powerpc/kernel/head_booke.h
> >> index d0862a100d29..20fe0c93a0bd 100644
> >> --- a/arch/powerpc/kernel/head_booke.h
> >> +++ b/arch/powerpc/kernel/head_booke.h
> >> @@ -44,7 +44,7 @@
> >> mr r11, r1; \
> >> beq 1f; \
> >> /* if from user, start at top of this thread's kernel stack */ \
> >> - lwz r11, THREAD_INFO-THREAD(r10); \
> >> + lwz r11, TASK_STACK-THREAD(r10); \
> >> ALLOC_STACK_FRAME(r11, THREAD_SIZE); \
> >> 1 : subi r11, r11, INT_FRAME_SIZE; /* Allocate exception frame */ \
> >> stw r13, _CCR(r11); /* save various registers */ \
> >> @@ -130,7 +130,7 @@
> >> DO_KVM BOOKE_INTERRUPT_##intno exc_level_srr1; \
> >> andi. r11,r11,MSR_PR; \
> >> mfspr r11,SPRN_SPRG_THREAD; /* if from user, start at top of */\
> >> - lwz r11,THREAD_INFO-THREAD(r11); /* this thread's kernel stack */\
> >> + lwz r11,TASK_STACK-THREAD(r11); /* this thread's kernel stack */\
> >> addi r11,r11,EXC_LVL_FRAME_OVERHEAD; /* allocate stack frame */\
> >> beq 1f; \
> >> /* COMING FROM USER MODE */ \
> >> diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S
> >> index e2750b856c8f..239ad8a4754e 100644
> >> --- a/arch/powerpc/kernel/head_fsl_booke.S
> >> +++ b/arch/powerpc/kernel/head_fsl_booke.S
> >> @@ -243,8 +243,10 @@ set_ivor:
> >> li r0,0
> >> stwu r0,THREAD_SIZE-STACK_FRAME_OVERHEAD(r1)
> >>
> >> +#ifdef CONFIG_SMP
> >> CURRENT_THREAD_INFO(r22, r1)
> >> stw r24, TI_CPU(r22)
> >> +#endif
> >>
> >> bl early_init
> >>
> >> @@ -702,7 +704,7 @@ finish_tlb_load:
> >>
> >> /* Get the next_tlbcam_idx percpu var */
> >> #ifdef CONFIG_SMP
> >> - lwz r12, THREAD_INFO-THREAD(r12)
> >> + lwz r12, TASK_STACK-THREAD(r12)
> >> lwz r15, TI_CPU(r12)
> >> lis r14, __per_cpu_offset@h
> >> ori r14, r14, __per_cpu_offset@l
> >> @@ -1074,7 +1076,7 @@ __secondary_start:
> >> mr r4,r24 /* Why? */
> >> bl call_setup_cpu
> >>
> >> - /* get current_thread_info and current */
> >> + /* get current's stack and current */
> >> lis r1,secondary_ti@ha
> >> lwz r1,secondary_ti@l(r1)
> >> lwz r2,TI_TASK(r1)
> >> diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
> >> index 916ddc4aac44..aa53db3ba6e7 100644
> >> --- a/arch/powerpc/kernel/irq.c
> >> +++ b/arch/powerpc/kernel/irq.c
> >> @@ -663,7 +663,7 @@ void do_IRQ(struct pt_regs *regs)
> >> struct thread_info *curtp, *irqtp, *sirqtp;
> >>
> >> /* Switch to the irq stack to handle this */
> >> - curtp = current_thread_info();
> >> + curtp = (void*)(current_stack_pointer() & ~(THREAD_SIZE - 1));
> >> irqtp = hardirq_ctx[raw_smp_processor_id()];
> >> sirqtp = softirq_ctx[raw_smp_processor_id()];
> >>
> >> diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S
> >> index 695b24a2d954..24a7f18ea10c 100644
> >> --- a/arch/powerpc/kernel/misc_32.S
> >> +++ b/arch/powerpc/kernel/misc_32.S
> >> @@ -60,7 +60,7 @@ _GLOBAL(call_do_softirq)
> >> blr
> >>
> >> /*
> >> - * void call_do_irq(struct pt_regs *regs, struct thread_info *irqtp);
> >> + * void call_do_irq(struct pt_regs *regs, void *irqtp);
> >> */
> >> _GLOBAL(call_do_irq)
> >> mflr r0
> >> @@ -183,10 +183,14 @@ _GLOBAL(low_choose_750fx_pll)
> >> or r4,r4,r5
> >> mtspr SPRN_HID1,r4
> >>
> >> +#ifdef CONFIG_SMP
> >> /* Store new HID1 image */
> >> CURRENT_THREAD_INFO(r6, r1)
> >> lwz r6,TI_CPU(r6)
> >> slwi r6,r6,2
> >> +#else
> >> + li r6, 0
> >> +#endif
> >> addis r6,r6,nap_save_hid1@ha
> >> stw r4,nap_save_hid1@l(r6)
> >>
> >> @@ -599,7 +603,7 @@ EXPORT_SYMBOL(__bswapdi2)
> >> #ifdef CONFIG_SMP
> >> _GLOBAL(start_secondary_resume)
> >> /* Reset stack */
> >> - CURRENT_THREAD_INFO(r1, r1)
> >> + rlwinm r1, r1, 0, 0, 31 - THREAD_SHIFT
> >> addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD
> >> li r3,0
> >> stw r3,0(r1) /* Zero the stack frame pointer */
> >> diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
> >> index 03c2e1f134bc..111abb4df2ec 100644
> >> --- a/arch/powerpc/kernel/process.c
> >> +++ b/arch/powerpc/kernel/process.c
> >> @@ -1240,8 +1240,8 @@ struct task_struct *__switch_to(struct task_struct *prev,
> >> batch->active = 1;
> >> }
> >>
> >> - if (current_thread_info()->task->thread.regs) {
> >> - restore_math(current_thread_info()->task->thread.regs);
> >> + if (current->thread.regs) {
> >> + restore_math(current->thread.regs);
> >>
> >> /*
> >> * The copy-paste buffer can only store into foreign real
> >> @@ -1251,7 +1251,7 @@ struct task_struct *__switch_to(struct task_struct *prev,
> >> * mappings, we must issue a cp_abort to clear any state and
> >> * prevent snooping, corruption or a covert channel.
> >> */
> >> - if (current_thread_info()->task->thread.used_vas)
> >> + if (current->thread.used_vas)
> >> asm volatile(PPC_CP_ABORT);
> >> }
> >> #endif /* CONFIG_PPC_BOOK3S_64 */
> >> diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c
> >> index 8c507be12c3c..81ebf7d6f526 100644
> >> --- a/arch/powerpc/kernel/setup_32.c
> >> +++ b/arch/powerpc/kernel/setup_32.c
> >> @@ -205,10 +205,8 @@ void __init irqstack_early_init(void)
> >> /* interrupt stacks must be in lowmem, we get that for free on ppc32
> >> * as the memblock is limited to lowmem by default */
> >> for_each_possible_cpu(i) {
> >> - softirq_ctx[i] = (struct thread_info *)
> >> - __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
> >> - hardirq_ctx[i] = (struct thread_info *)
> >> - __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
> >> + softirq_ctx[i] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
> >> + hardirq_ctx[i] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
> >> }
> >> }
> >>
> >> @@ -226,13 +224,10 @@ void __init exc_lvl_early_init(void)
> >> hw_cpu = 0;
> >> #endif
> >>
> >> - critirq_ctx[hw_cpu] = (struct thread_info *)
> >> - __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
> >> + critirq_ctx[hw_cpu] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
> >> #ifdef CONFIG_BOOKE
> >> - dbgirq_ctx[hw_cpu] = (struct thread_info *)
> >> - __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
> >> - mcheckirq_ctx[hw_cpu] = (struct thread_info *)
> >> - __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
> >> + dbgirq_ctx[hw_cpu] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
> >> + mcheckirq_ctx[hw_cpu] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
> >> #endif
> >> }
> >> }
> >> diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
> >> index 61c1fadbc644..19dd0ea55714 100644
> >> --- a/arch/powerpc/kernel/smp.c
> >> +++ b/arch/powerpc/kernel/smp.c
> >> @@ -20,6 +20,7 @@
> >> #include <linux/kernel.h>
> >> #include <linux/export.h>
> >> #include <linux/sched/mm.h>
> >> +#include <linux/sched/task_stack.h>
> >> #include <linux/sched/topology.h>
> >> #include <linux/smp.h>
> >> #include <linux/interrupt.h>
> >> @@ -812,7 +813,8 @@ static void cpu_idle_thread_init(unsigned int cpu, struct task_struct *idle)
> >>
> >> #ifdef CONFIG_PPC64
> >> paca_ptrs[cpu]->__current = idle;
> >> - paca_ptrs[cpu]->kstack = (unsigned long)ti + THREAD_SIZE - STACK_FRAME_OVERHEAD;
> >> + paca_ptrs[cpu]->kstack = (unsigned long)task_stack_page(idle) +
> >> + THREAD_SIZE - STACK_FRAME_OVERHEAD;
> >> #endif
> >> ti->cpu = cpu;
> >> secondary_ti = current_set[cpu] = ti;
> >> diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
> >> index 694c1d92e796..0d8d6fee892a 100644
> >> --- a/arch/powerpc/xmon/xmon.c
> >> +++ b/arch/powerpc/xmon/xmon.c
> >> @@ -2988,7 +2988,7 @@ static void show_task(struct task_struct *tsk)
> >> printf("%px %016lx %6d %6d %c %2d %s\n", tsk,
> >> tsk->thread.ksp,
> >> tsk->pid, tsk->parent->pid,
> >> - state, task_thread_info(tsk)->cpu,
> >> + state, task_cpu(tsk),
> >> tsk->comm);
> >> }
> >>
> >> --
> >> 2.13.3
> >>
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [RFC PATCH v3 5/7] powerpc: 'current_set' is now a table of task_struct pointers
2018-10-03 5:41 ` Nicholas Piggin
@ 2018-10-03 6:00 ` Christophe LEROY
2018-10-03 6:09 ` Nicholas Piggin
0 siblings, 1 reply; 32+ messages in thread
From: Christophe LEROY @ 2018-10-03 6:00 UTC (permalink / raw)
To: Nicholas Piggin
Cc: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, linux-kernel, linuxppc-dev
Le 03/10/2018 à 07:41, Nicholas Piggin a écrit :
> On Mon, 1 Oct 2018 12:30:27 +0000 (UTC)
> Christophe Leroy <christophe.leroy@c-s.fr> wrote:
>
>> The table of pointers 'current_set' has been used for retrieving
>> the stack and current. They used to be thread_info pointers as
>> they were pointing to the stack and current was taken from the
>> 'task' field of the thread_info.
>>
>> Now, the pointers of 'current_set' table are now both pointers
>> to task_struct and pointers to thread_info.
>>
>> As they are used to get current, and the stack pointer is
>> retrieved from current's stack field, this patch changes
>> their type to task_struct, and renames secondary_ti to
>> secondary_current.
>
> I'm not sure if current_set is actually needed is it? Because
> 64-bit already initializes paca->ksave / PACAKSAVE. That might
> be a cleanup to do after your series.
head_64.S contains:
__secondary_start:
/* Set thread priority to MEDIUM */
HMT_MEDIUM
/* Initialize the kernel stack */
LOAD_REG_ADDR(r3, current_set)
sldi r28,r24,3 /* get current_set[cpu#] */
ldx r14,r3,r28
addi r14,r14,THREAD_SIZE-STACK_FRAME_OVERHEAD
std r14,PACAKSAVE(r13)
32-bit doesn't seem to use it, it only uses secondary_ti it seems.
>
> Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
>
Christophe
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [RFC PATCH v3 7/7] powerpc/64: Modify CURRENT_THREAD_INFO()
2018-10-03 5:44 ` Nicholas Piggin
@ 2018-10-03 6:01 ` Christophe LEROY
0 siblings, 0 replies; 32+ messages in thread
From: Christophe LEROY @ 2018-10-03 6:01 UTC (permalink / raw)
To: Nicholas Piggin
Cc: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, linux-kernel, linuxppc-dev
Le 03/10/2018 à 07:44, Nicholas Piggin a écrit :
> On Mon, 1 Oct 2018 12:30:31 +0000 (UTC)
> Christophe Leroy <christophe.leroy@c-s.fr> wrote:
>
>> CURRENT_THREAD_INFO() now uses the PACA to retrieve 'current' pointer,
>> it doesn't use 'sp' anymore.
>
> Can you remove this too now? I think it will be clearer what's going on
> and easier to read once everyone remembers current is the same offset as
> current thread_info.
Ok I will.
Christophe
>
> Overall nice series, thanks for doing this.
>
> Thanks,
> Nick
>
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [RFC PATCH v3 3/7] powerpc: Activate CONFIG_THREAD_INFO_IN_TASK
2018-10-03 5:52 ` Nicholas Piggin
@ 2018-10-03 6:04 ` Christophe LEROY
2018-10-03 6:23 ` Nicholas Piggin
0 siblings, 1 reply; 32+ messages in thread
From: Christophe LEROY @ 2018-10-03 6:04 UTC (permalink / raw)
To: Nicholas Piggin
Cc: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, linux-kernel, linuxppc-dev
Le 03/10/2018 à 07:52, Nicholas Piggin a écrit :
> On Wed, 3 Oct 2018 07:47:05 +0200
> Christophe LEROY <christophe.leroy@c-s.fr> wrote:
>
>> Le 03/10/2018 à 07:30, Nicholas Piggin a écrit :
>>> On Mon, 1 Oct 2018 12:30:23 +0000 (UTC)
>>> Christophe Leroy <christophe.leroy@c-s.fr> wrote:
>>>
>>>> This patch activates CONFIG_THREAD_INFO_IN_TASK which
>>>> moves the thread_info into task_struct.
>>>>
>>>> Moving thread_info into task_struct has the following advantages:
>>>> - It protects thread_info from corruption in the case of stack
>>>> overflows.
>>>> - Its address is harder to determine if stack addresses are
>>>> leaked, making a number of attacks more difficult.
>>>>
>>>> This has the following consequences:
>>>> - thread_info is now located at the top of task_struct.
>>>
>>> "top"... I got confused for a minute thinking high address and
>>> wondering how you can change CURRENT_THREAD_INFO just to point
>>> to current :)
>>
>> Would 'beginning' be less confusing ?
>
> Yes, good idea.
>
>>>> @@ -83,7 +83,13 @@ int is_cpu_dead(unsigned int cpu);
>>>> /* 32-bit */
>>>> extern int smp_hw_index[];
>>>>
>>>> -#define raw_smp_processor_id() (current_thread_info()->cpu)
>>>> +/*
>>>> + * This is particularly ugly: it appears we can't actually get the definition
>>>> + * of task_struct here, but we need access to the CPU this task is running on.
>>>> + * Instead of using task_struct we're using _TASK_CPU which is extracted from
>>>> + * asm-offsets.h by kbuild to get the current processor ID.
>>>> + */
>>>> +#define raw_smp_processor_id() (*(unsigned int*)((void*)current + _TASK_CPU))
>>>
>>> This is clever but yes ugly. Can't you include asm-offsets.h? riscv
>>> seems to.
>>
>> riscv has a clean asm-offsets.h . Our's defines constant with the same
>> name as those defined in other headers which are included in C files. So
>> including asm-offsets in C files does create conflicts like:
>>
>> ./include/generated/asm-offsets.h:71:0: warning: "TASK_SIZE" redefined
>> #define TASK_SIZE -2147483648 /* TASK_SIZE */
>> ./arch/powerpc/include/asm/processor.h:95:0: note: this is the location
>> of the previous definition
>> #define TASK_SIZE (CONFIG_TASK_SIZE)
>>
>> ./include/generated/asm-offsets.h:98:0: warning: "NSEC_PER_SEC" redefined
>> #define NSEC_PER_SEC 1000000000 /* NSEC_PER_SEC */
>> ./include/linux/time64.h:36:0: note: this is the location of the
>> previous definition
>> #define NSEC_PER_SEC 1000000000L
>>
>> ./arch/powerpc/include/asm/nohash/32/pgtable.h:34:0: warning:
>> "PGD_TABLE_SIZE" redefined
>> #define PGD_TABLE_SIZE (sizeof(pgd_t) << PGD_INDEX_SIZE)
>> ./include/generated/asm-offsets.h:101:0: note: this is the location of
>> the previous definition
>> #define PGD_TABLE_SIZE 256 /* PGD_TABLE_SIZE */
>>
>> ...
>
> Okay.
>
>>
>> In v2, I had a patch to fix those redundancies
>> (https://patchwork.ozlabs.org/patch/974363/) but I found it unconvenient.
>
> Because of merge conflicts, or you did not like the new names?
Both, because of the amount of changes it implies, and also because of
the new names. I find it quite convenient to be able to use same names
both in C and ASM. And I didn't want my serie to imply big-bangs in
unrelated or not directly related topics.
Christophe
>
> Thanks,
> Nick
>
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [RFC PATCH v3 5/7] powerpc: 'current_set' is now a table of task_struct pointers
2018-10-03 6:00 ` Christophe LEROY
@ 2018-10-03 6:09 ` Nicholas Piggin
0 siblings, 0 replies; 32+ messages in thread
From: Nicholas Piggin @ 2018-10-03 6:09 UTC (permalink / raw)
To: Christophe LEROY
Cc: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, linux-kernel, linuxppc-dev
On Wed, 3 Oct 2018 08:00:43 +0200
Christophe LEROY <christophe.leroy@c-s.fr> wrote:
> Le 03/10/2018 à 07:41, Nicholas Piggin a écrit :
> > On Mon, 1 Oct 2018 12:30:27 +0000 (UTC)
> > Christophe Leroy <christophe.leroy@c-s.fr> wrote:
> >
> >> The table of pointers 'current_set' has been used for retrieving
> >> the stack and current. They used to be thread_info pointers as
> >> they were pointing to the stack and current was taken from the
> >> 'task' field of the thread_info.
> >>
> >> Now, the pointers of 'current_set' table are now both pointers
> >> to task_struct and pointers to thread_info.
> >>
> >> As they are used to get current, and the stack pointer is
> >> retrieved from current's stack field, this patch changes
> >> their type to task_struct, and renames secondary_ti to
> >> secondary_current.
> >
> > I'm not sure if current_set is actually needed is it? Because
> > 64-bit already initializes paca->ksave / PACAKSAVE. That might
> > be a cleanup to do after your series.
>
> head_64.S contains:
>
> __secondary_start:
> /* Set thread priority to MEDIUM */
> HMT_MEDIUM
>
> /* Initialize the kernel stack */
> LOAD_REG_ADDR(r3, current_set)
> sldi r28,r24,3 /* get current_set[cpu#] */
> ldx r14,r3,r28
> addi r14,r14,THREAD_SIZE-STACK_FRAME_OVERHEAD
> std r14,PACAKSAVE(r13)
Right, I don't *think* that's needed because boot CPU should already
have set PACAKSAVE before starting secondaries here. ld r14,PACAKSAVE
should have the same result I think.
But never mind that for your series, just something I saw that could
be cleaned up.
Thanks,
Nick
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [RFC PATCH v3 3/7] powerpc: Activate CONFIG_THREAD_INFO_IN_TASK
2018-10-03 6:04 ` Christophe LEROY
@ 2018-10-03 6:23 ` Nicholas Piggin
0 siblings, 0 replies; 32+ messages in thread
From: Nicholas Piggin @ 2018-10-03 6:23 UTC (permalink / raw)
To: Christophe LEROY
Cc: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, linux-kernel, linuxppc-dev
On Wed, 3 Oct 2018 08:04:49 +0200
Christophe LEROY <christophe.leroy@c-s.fr> wrote:
> Le 03/10/2018 à 07:52, Nicholas Piggin a écrit :
> > On Wed, 3 Oct 2018 07:47:05 +0200
> > Christophe LEROY <christophe.leroy@c-s.fr> wrote:
> >
> >> Le 03/10/2018 à 07:30, Nicholas Piggin a écrit :
> >>> On Mon, 1 Oct 2018 12:30:23 +0000 (UTC)
> >>> Christophe Leroy <christophe.leroy@c-s.fr> wrote:
> >>>
> >>>> This patch activates CONFIG_THREAD_INFO_IN_TASK which
> >>>> moves the thread_info into task_struct.
> >>>>
> >>>> Moving thread_info into task_struct has the following advantages:
> >>>> - It protects thread_info from corruption in the case of stack
> >>>> overflows.
> >>>> - Its address is harder to determine if stack addresses are
> >>>> leaked, making a number of attacks more difficult.
> >>>>
> >>>> This has the following consequences:
> >>>> - thread_info is now located at the top of task_struct.
> >>>
> >>> "top"... I got confused for a minute thinking high address and
> >>> wondering how you can change CURRENT_THREAD_INFO just to point
> >>> to current :)
> >>
> >> Would 'beginning' be less confusing ?
> >
> > Yes, good idea.
> >
> >>>> @@ -83,7 +83,13 @@ int is_cpu_dead(unsigned int cpu);
> >>>> /* 32-bit */
> >>>> extern int smp_hw_index[];
> >>>>
> >>>> -#define raw_smp_processor_id() (current_thread_info()->cpu)
> >>>> +/*
> >>>> + * This is particularly ugly: it appears we can't actually get the definition
> >>>> + * of task_struct here, but we need access to the CPU this task is running on.
> >>>> + * Instead of using task_struct we're using _TASK_CPU which is extracted from
> >>>> + * asm-offsets.h by kbuild to get the current processor ID.
> >>>> + */
> >>>> +#define raw_smp_processor_id() (*(unsigned int*)((void*)current + _TASK_CPU))
> >>>
> >>> This is clever but yes ugly. Can't you include asm-offsets.h? riscv
> >>> seems to.
> >>
> >> riscv has a clean asm-offsets.h . Our's defines constant with the same
> >> name as those defined in other headers which are included in C files. So
> >> including asm-offsets in C files does create conflicts like:
> >>
> >> ./include/generated/asm-offsets.h:71:0: warning: "TASK_SIZE" redefined
> >> #define TASK_SIZE -2147483648 /* TASK_SIZE */
> >> ./arch/powerpc/include/asm/processor.h:95:0: note: this is the location
> >> of the previous definition
> >> #define TASK_SIZE (CONFIG_TASK_SIZE)
> >>
> >> ./include/generated/asm-offsets.h:98:0: warning: "NSEC_PER_SEC" redefined
> >> #define NSEC_PER_SEC 1000000000 /* NSEC_PER_SEC */
> >> ./include/linux/time64.h:36:0: note: this is the location of the
> >> previous definition
> >> #define NSEC_PER_SEC 1000000000L
> >>
> >> ./arch/powerpc/include/asm/nohash/32/pgtable.h:34:0: warning:
> >> "PGD_TABLE_SIZE" redefined
> >> #define PGD_TABLE_SIZE (sizeof(pgd_t) << PGD_INDEX_SIZE)
> >> ./include/generated/asm-offsets.h:101:0: note: this is the location of
> >> the previous definition
> >> #define PGD_TABLE_SIZE 256 /* PGD_TABLE_SIZE */
> >>
> >> ...
> >
> > Okay.
> >
> >>
> >> In v2, I had a patch to fix those redundancies
> >> (https://patchwork.ozlabs.org/patch/974363/) but I found it unconvenient.
> >
> > Because of merge conflicts, or you did not like the new names?
>
> Both, because of the amount of changes it implies, and also because of
> the new names. I find it quite convenient to be able to use same names
> both in C and ASM.
Yeah that's true. I guess this is okay for a one-off hack.
Thanks,
Nick
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [RFC PATCH v3 4/7] powerpc: regain entire stack space
2018-10-03 5:52 ` Christophe LEROY
@ 2018-10-03 6:30 ` Nicholas Piggin
2018-10-03 6:45 ` Christophe LEROY
0 siblings, 1 reply; 32+ messages in thread
From: Nicholas Piggin @ 2018-10-03 6:30 UTC (permalink / raw)
To: Christophe LEROY
Cc: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, linux-kernel, linuxppc-dev
On Wed, 3 Oct 2018 07:52:59 +0200
Christophe LEROY <christophe.leroy@c-s.fr> wrote:
> Le 03/10/2018 à 07:34, Nicholas Piggin a écrit :
> > On Mon, 1 Oct 2018 12:30:25 +0000 (UTC)
> > Christophe Leroy <christophe.leroy@c-s.fr> wrote:
> >
> >> thread_info is not anymore in the stack, so the entire stack
> >> can now be used.
> >
> > Nice.
> >
> >>
> >> In the meantime, all pointers to the stacks are not anymore
> >> pointers to thread_info so this patch changes them to void*
> >
> > Wasn't this previously effectively already the case with patch
> > 3/7? You had thread_info sized space left there, but it was not
> > used or initialized right? Does it make sense to move this part
> > of it to the previous patch?
>
> Not really.
>
> In 3/7 I changed the prototypes of two functions that really used the
> pointer as a task pointer only.
>
> Here it change things that before 4/7 were really used as both stack
> pointers and thread_info pointers.
What uses it as a thread_info pointer? It seems more like a stack
with some amount of unused space in it but that's all.
That said I don't care to nitpick too much where things go exactly
if you like it better here that's fine.
Thanks,
Nick
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [RFC PATCH v3 4/7] powerpc: regain entire stack space
2018-10-03 6:30 ` Nicholas Piggin
@ 2018-10-03 6:45 ` Christophe LEROY
2018-10-03 7:07 ` Nicholas Piggin
0 siblings, 1 reply; 32+ messages in thread
From: Christophe LEROY @ 2018-10-03 6:45 UTC (permalink / raw)
To: Nicholas Piggin
Cc: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, linux-kernel, linuxppc-dev
Le 03/10/2018 à 08:30, Nicholas Piggin a écrit :
> On Wed, 3 Oct 2018 07:52:59 +0200
> Christophe LEROY <christophe.leroy@c-s.fr> wrote:
>
>> Le 03/10/2018 à 07:34, Nicholas Piggin a écrit :
>>> On Mon, 1 Oct 2018 12:30:25 +0000 (UTC)
>>> Christophe Leroy <christophe.leroy@c-s.fr> wrote:
>>>
>>>> thread_info is not anymore in the stack, so the entire stack
>>>> can now be used.
>>>
>>> Nice.
>>>
>>>>
>>>> In the meantime, all pointers to the stacks are not anymore
>>>> pointers to thread_info so this patch changes them to void*
>>>
>>> Wasn't this previously effectively already the case with patch
>>> 3/7? You had thread_info sized space left there, but it was not
>>> used or initialized right? Does it make sense to move this part
>>> of it to the previous patch?
>>
>> Not really.
>>
>> In 3/7 I changed the prototypes of two functions that really used the
>> pointer as a task pointer only.
I meant 2/7 here sorry.
>>
>> Here it change things that before 4/7 were really used as both stack
>> pointers and thread_info pointers.
And here I meant 3/7
>
> What uses it as a thread_info pointer? It seems more like a stack
> with some amount of unused space in it but that's all.
Before 3/7, we have
void do_softirq_own_stack(void)
{
struct thread_info *curtp, *irqtp;
curtp = current_thread_info();
irqtp = softirq_ctx[smp_processor_id()];
irqtp->task = curtp->task;
irqtp->flags = 0;
call_do_softirq(irqtp);
irqtp->task = NULL;
/* Set any flag that may have been set on the
* alternate stack
*/
if (irqtp->flags)
set_bits(irqtp->flags, &curtp->flags);
}
After 3/7, we have
void do_softirq_own_stack(void)
{
struct thread_info *irqtp;
irqtp = softirq_ctx[smp_processor_id()];
call_do_softirq(irqtp);
}
So now only we can change irqtp to void* can't we ?
>
> That said I don't care to nitpick too much where things go exactly
> if you like it better here that's fine.
No worry, I may have missed something, your comments are always welcome.
Thanks
Christophe
>
> Thanks,
> Nick
>
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [RFC PATCH v3 4/7] powerpc: regain entire stack space
2018-10-03 6:45 ` Christophe LEROY
@ 2018-10-03 7:07 ` Nicholas Piggin
2018-10-03 9:30 ` Christophe LEROY
0 siblings, 1 reply; 32+ messages in thread
From: Nicholas Piggin @ 2018-10-03 7:07 UTC (permalink / raw)
To: Christophe LEROY
Cc: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, linux-kernel, linuxppc-dev
On Wed, 3 Oct 2018 08:45:25 +0200
Christophe LEROY <christophe.leroy@c-s.fr> wrote:
> Le 03/10/2018 à 08:30, Nicholas Piggin a écrit :
> > On Wed, 3 Oct 2018 07:52:59 +0200
> > Christophe LEROY <christophe.leroy@c-s.fr> wrote:
> >
> >> Le 03/10/2018 à 07:34, Nicholas Piggin a écrit :
> >>> On Mon, 1 Oct 2018 12:30:25 +0000 (UTC)
> >>> Christophe Leroy <christophe.leroy@c-s.fr> wrote:
> >>>
> >>>> thread_info is not anymore in the stack, so the entire stack
> >>>> can now be used.
> >>>
> >>> Nice.
> >>>
> >>>>
> >>>> In the meantime, all pointers to the stacks are not anymore
> >>>> pointers to thread_info so this patch changes them to void*
> >>>
> >>> Wasn't this previously effectively already the case with patch
> >>> 3/7? You had thread_info sized space left there, but it was not
> >>> used or initialized right? Does it make sense to move this part
> >>> of it to the previous patch?
> >>
> >> Not really.
> >>
> >> In 3/7 I changed the prototypes of two functions that really used the
> >> pointer as a task pointer only.
>
> I meant 2/7 here sorry.
>
> >>
> >> Here it change things that before 4/7 were really used as both stack
> >> pointers and thread_info pointers.
>
> And here I meant 3/7
>
> >
> > What uses it as a thread_info pointer? It seems more like a stack
> > with some amount of unused space in it but that's all.
>
> Before 3/7, we have
>
> void do_softirq_own_stack(void)
> {
> struct thread_info *curtp, *irqtp;
>
> curtp = current_thread_info();
> irqtp = softirq_ctx[smp_processor_id()];
> irqtp->task = curtp->task;
> irqtp->flags = 0;
> call_do_softirq(irqtp);
> irqtp->task = NULL;
>
> /* Set any flag that may have been set on the
> * alternate stack
> */
> if (irqtp->flags)
> set_bits(irqtp->flags, &curtp->flags);
> }
>
> After 3/7, we have
>
> void do_softirq_own_stack(void)
> {
> struct thread_info *irqtp;
>
> irqtp = softirq_ctx[smp_processor_id()];
> call_do_softirq(irqtp);
> }
>
>
> So now only we can change irqtp to void* can't we ?
In patch 3 we can, right? That's what I mean by moving from
thread_info * to void * in patch 3 rather than 4.
But if you prefer not to, it's fine. Maybe it keeps patch 3
a little smaller.
Thanks,
Nick
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [RFC PATCH v3 4/7] powerpc: regain entire stack space
2018-10-03 7:07 ` Nicholas Piggin
@ 2018-10-03 9:30 ` Christophe LEROY
0 siblings, 0 replies; 32+ messages in thread
From: Christophe LEROY @ 2018-10-03 9:30 UTC (permalink / raw)
To: Nicholas Piggin
Cc: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, linux-kernel, linuxppc-dev
Le 03/10/2018 à 09:07, Nicholas Piggin a écrit :
> On Wed, 3 Oct 2018 08:45:25 +0200
> Christophe LEROY <christophe.leroy@c-s.fr> wrote:
>
>> Le 03/10/2018 à 08:30, Nicholas Piggin a écrit :
>>> On Wed, 3 Oct 2018 07:52:59 +0200
>>> Christophe LEROY <christophe.leroy@c-s.fr> wrote:
>>>
>>>> Le 03/10/2018 à 07:34, Nicholas Piggin a écrit :
>>>>> On Mon, 1 Oct 2018 12:30:25 +0000 (UTC)
>>>>> Christophe Leroy <christophe.leroy@c-s.fr> wrote:
>>>>>
>>>>>> thread_info is not anymore in the stack, so the entire stack
>>>>>> can now be used.
>>>>>
>>>>> Nice.
>>>>>
>>>>>>
>>>>>> In the meantime, all pointers to the stacks are not anymore
>>>>>> pointers to thread_info so this patch changes them to void*
>>>>>
>>>>> Wasn't this previously effectively already the case with patch
>>>>> 3/7? You had thread_info sized space left there, but it was not
>>>>> used or initialized right? Does it make sense to move this part
>>>>> of it to the previous patch?
>>>>
>>>> Not really.
>>>>
>>>> In 3/7 I changed the prototypes of two functions that really used the
>>>> pointer as a task pointer only.
>>
>> I meant 2/7 here sorry.
>>
>>>>
>>>> Here it change things that before 4/7 were really used as both stack
>>>> pointers and thread_info pointers.
>>
>> And here I meant 3/7
>>
>>>
>>> What uses it as a thread_info pointer? It seems more like a stack
>>> with some amount of unused space in it but that's all.
>>
>> Before 3/7, we have
>>
>> void do_softirq_own_stack(void)
>> {
>> struct thread_info *curtp, *irqtp;
>>
>> curtp = current_thread_info();
>> irqtp = softirq_ctx[smp_processor_id()];
>> irqtp->task = curtp->task;
>> irqtp->flags = 0;
>> call_do_softirq(irqtp);
>> irqtp->task = NULL;
>>
>> /* Set any flag that may have been set on the
>> * alternate stack
>> */
>> if (irqtp->flags)
>> set_bits(irqtp->flags, &curtp->flags);
>> }
>>
>> After 3/7, we have
>>
>> void do_softirq_own_stack(void)
>> {
>> struct thread_info *irqtp;
>>
>> irqtp = softirq_ctx[smp_processor_id()];
>> call_do_softirq(irqtp);
>> }
>>
>>
>> So now only we can change irqtp to void* can't we ?
>
> In patch 3 we can, right? That's what I mean by moving from
> thread_info * to void * in patch 3 rather than 4.
Ah ok, that's what you meant. Sorry.
>
> But if you prefer not to, it's fine. Maybe it keeps patch 3
> a little smaller.
Yes indeed, that's the idea, keep patch 3 to the strict minimum and do
cleanups afterwards.
Christophe
>
> Thanks,
> Nick
>
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [RFC PATCH v3 1/7] book3s/64: avoid circular header inclusion in mmu-hash.h
2018-10-03 4:24 ` Nicholas Piggin
@ 2018-10-04 8:20 ` Christophe LEROY
2018-10-04 8:23 ` Aneesh Kumar K.V
0 siblings, 1 reply; 32+ messages in thread
From: Christophe LEROY @ 2018-10-04 8:20 UTC (permalink / raw)
To: Nicholas Piggin
Cc: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, linux-kernel, linuxppc-dev
Le 03/10/2018 à 06:24, Nicholas Piggin a écrit :
> On Mon, 1 Oct 2018 12:30:19 +0000 (UTC)
> Christophe Leroy <christophe.leroy@c-s.fr> wrote:
>
>> When activating CONFIG_THREAD_INFO_IN_TASK, linux/sched.h
>> includes asm/current.h. This generates a circular dependency.
>> To avoid that, asm/processor.h shall not be included in mmu-hash.h
>>
>> In order to do that, this patch moves into a new header called
>> asm/task_size.h the information from asm/processor.h requires by
>> mmu-hash.h
>
> Doesn't look like you use this header in 32-bit code. Put task_size.h
> in asm/64/ maybe?
There is no asm/64/ dir at the time being, only book3s/64/ and nohash/64/
I'm thinking about leaving it in asm/ but renaming it task_size_user64.h
Christophe
>
> Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
>
>>
>> Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
>> ---
>> arch/powerpc/include/asm/book3s/64/mmu-hash.h | 2 +-
>> arch/powerpc/include/asm/processor.h | 34 +---------------------
>> arch/powerpc/include/asm/task_size.h | 42 +++++++++++++++++++++++++++
>> arch/powerpc/kvm/book3s_hv_hmi.c | 1 +
>> 4 files changed, 45 insertions(+), 34 deletions(-)
>> create mode 100644 arch/powerpc/include/asm/task_size.h
>>
>> diff --git a/arch/powerpc/include/asm/book3s/64/mmu-hash.h b/arch/powerpc/include/asm/book3s/64/mmu-hash.h
>> index bbeaf6adf93c..7788e35f19f0 100644
>> --- a/arch/powerpc/include/asm/book3s/64/mmu-hash.h
>> +++ b/arch/powerpc/include/asm/book3s/64/mmu-hash.h
>> @@ -23,7 +23,7 @@
>> */
>> #include <asm/book3s/64/pgtable.h>
>> #include <asm/bug.h>
>> -#include <asm/processor.h>
>> +#include <asm/task_size.h>
>> #include <asm/cpu_has_feature.h>
>>
>> /*
>> diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h
>> index 350c584ca179..353879db3e98 100644
>> --- a/arch/powerpc/include/asm/processor.h
>> +++ b/arch/powerpc/include/asm/processor.h
>> @@ -101,40 +101,8 @@ void release_thread(struct task_struct *);
>> #endif
>>
>> #ifdef CONFIG_PPC64
>> -/*
>> - * 64-bit user address space can have multiple limits
>> - * For now supported values are:
>> - */
>> -#define TASK_SIZE_64TB (0x0000400000000000UL)
>> -#define TASK_SIZE_128TB (0x0000800000000000UL)
>> -#define TASK_SIZE_512TB (0x0002000000000000UL)
>> -#define TASK_SIZE_1PB (0x0004000000000000UL)
>> -#define TASK_SIZE_2PB (0x0008000000000000UL)
>> -/*
>> - * With 52 bits in the address we can support
>> - * upto 4PB of range.
>> - */
>> -#define TASK_SIZE_4PB (0x0010000000000000UL)
>>
>> -/*
>> - * For now 512TB is only supported with book3s and 64K linux page size.
>> - */
>> -#if defined(CONFIG_PPC_BOOK3S_64) && defined(CONFIG_PPC_64K_PAGES)
>> -/*
>> - * Max value currently used:
>> - */
>> -#define TASK_SIZE_USER64 TASK_SIZE_4PB
>> -#define DEFAULT_MAP_WINDOW_USER64 TASK_SIZE_128TB
>> -#define TASK_CONTEXT_SIZE TASK_SIZE_512TB
>> -#else
>> -#define TASK_SIZE_USER64 TASK_SIZE_64TB
>> -#define DEFAULT_MAP_WINDOW_USER64 TASK_SIZE_64TB
>> -/*
>> - * We don't need to allocate extended context ids for 4K page size, because
>> - * we limit the max effective address on this config to 64TB.
>> - */
>> -#define TASK_CONTEXT_SIZE TASK_SIZE_64TB
>> -#endif
>> +#include <asm/task_size.h>
>>
>> /*
>> * 32-bit user address space is 4GB - 1 page
>> diff --git a/arch/powerpc/include/asm/task_size.h b/arch/powerpc/include/asm/task_size.h
>> new file mode 100644
>> index 000000000000..ca45638617b0
>> --- /dev/null
>> +++ b/arch/powerpc/include/asm/task_size.h
>> @@ -0,0 +1,42 @@
>> +/* SPDX-License-Identifier: GPL-2.0 */
>> +#ifndef _ASM_POWERPC_TASK_SIZE_H
>> +#define _ASM_POWERPC_TASK_SIZE_H
>> +
>> +#ifdef CONFIG_PPC64
>> +/*
>> + * 64-bit user address space can have multiple limits
>> + * For now supported values are:
>> + */
>> +#define TASK_SIZE_64TB (0x0000400000000000UL)
>> +#define TASK_SIZE_128TB (0x0000800000000000UL)
>> +#define TASK_SIZE_512TB (0x0002000000000000UL)
>> +#define TASK_SIZE_1PB (0x0004000000000000UL)
>> +#define TASK_SIZE_2PB (0x0008000000000000UL)
>> +/*
>> + * With 52 bits in the address we can support
>> + * upto 4PB of range.
>> + */
>> +#define TASK_SIZE_4PB (0x0010000000000000UL)
>> +
>> +/*
>> + * For now 512TB is only supported with book3s and 64K linux page size.
>> + */
>> +#if defined(CONFIG_PPC_BOOK3S_64) && defined(CONFIG_PPC_64K_PAGES)
>> +/*
>> + * Max value currently used:
>> + */
>> +#define TASK_SIZE_USER64 TASK_SIZE_4PB
>> +#define DEFAULT_MAP_WINDOW_USER64 TASK_SIZE_128TB
>> +#define TASK_CONTEXT_SIZE TASK_SIZE_512TB
>> +#else
>> +#define TASK_SIZE_USER64 TASK_SIZE_64TB
>> +#define DEFAULT_MAP_WINDOW_USER64 TASK_SIZE_64TB
>> +/*
>> + * We don't need to allocate extended context ids for 4K page size, because
>> + * we limit the max effective address on this config to 64TB.
>> + */
>> +#define TASK_CONTEXT_SIZE TASK_SIZE_64TB
>> +#endif
>> +
>> +#endif /* CONFIG_PPC64 */
>> +#endif /* _ASM_POWERPC_TASK_SIZE_H */
>> diff --git a/arch/powerpc/kvm/book3s_hv_hmi.c b/arch/powerpc/kvm/book3s_hv_hmi.c
>> index e3f738eb1cac..64b5011475c7 100644
>> --- a/arch/powerpc/kvm/book3s_hv_hmi.c
>> +++ b/arch/powerpc/kvm/book3s_hv_hmi.c
>> @@ -24,6 +24,7 @@
>> #include <linux/compiler.h>
>> #include <asm/paca.h>
>> #include <asm/hmi.h>
>> +#include <asm/processor.h>
>>
>> void wait_for_subcore_guest_exit(void)
>> {
>> --
>> 2.13.3
>>
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [RFC PATCH v3 1/7] book3s/64: avoid circular header inclusion in mmu-hash.h
2018-10-04 8:20 ` Christophe LEROY
@ 2018-10-04 8:23 ` Aneesh Kumar K.V
2018-10-04 8:32 ` Christophe LEROY
0 siblings, 1 reply; 32+ messages in thread
From: Aneesh Kumar K.V @ 2018-10-04 8:23 UTC (permalink / raw)
To: Christophe LEROY, Nicholas Piggin
Cc: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, linux-kernel, linuxppc-dev
On 10/4/18 1:50 PM, Christophe LEROY wrote:
>
>
> Le 03/10/2018 à 06:24, Nicholas Piggin a écrit :
>> On Mon, 1 Oct 2018 12:30:19 +0000 (UTC)
>> Christophe Leroy <christophe.leroy@c-s.fr> wrote:
>>
>>> When activating CONFIG_THREAD_INFO_IN_TASK, linux/sched.h
>>> includes asm/current.h. This generates a circular dependency.
>>> To avoid that, asm/processor.h shall not be included in mmu-hash.h
>>>
>>> In order to do that, this patch moves into a new header called
>>> asm/task_size.h the information from asm/processor.h requires by
>>> mmu-hash.h
>>
>> Doesn't look like you use this header in 32-bit code. Put task_size.h
>> in asm/64/ maybe?
>
> There is no asm/64/ dir at the time being, only book3s/64/ and nohash/64/
>
> I'm thinking about leaving it in asm/ but renaming it task_size_user64.h
>
Quiet a lot of that is book3s 64 specifi because we have there.
#if defined(CONFIG_PPC_BOOK3S_64) && defined(CONFIG_PPC_64K_PAGES)
/*
* Max value currently used:
*/
-aneesh
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [RFC PATCH v3 1/7] book3s/64: avoid circular header inclusion in mmu-hash.h
2018-10-04 8:23 ` Aneesh Kumar K.V
@ 2018-10-04 8:32 ` Christophe LEROY
0 siblings, 0 replies; 32+ messages in thread
From: Christophe LEROY @ 2018-10-04 8:32 UTC (permalink / raw)
To: Aneesh Kumar K.V, Nicholas Piggin
Cc: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, linux-kernel, linuxppc-dev
Le 04/10/2018 à 10:23, Aneesh Kumar K.V a écrit :
> On 10/4/18 1:50 PM, Christophe LEROY wrote:
>>
>>
>> Le 03/10/2018 à 06:24, Nicholas Piggin a écrit :
>>> On Mon, 1 Oct 2018 12:30:19 +0000 (UTC)
>>> Christophe Leroy <christophe.leroy@c-s.fr> wrote:
>>>
>>>> When activating CONFIG_THREAD_INFO_IN_TASK, linux/sched.h
>>>> includes asm/current.h. This generates a circular dependency.
>>>> To avoid that, asm/processor.h shall not be included in mmu-hash.h
>>>>
>>>> In order to do that, this patch moves into a new header called
>>>> asm/task_size.h the information from asm/processor.h requires by
>>>> mmu-hash.h
>>>
>>> Doesn't look like you use this header in 32-bit code. Put task_size.h
>>> in asm/64/ maybe?
>>
>> There is no asm/64/ dir at the time being, only book3s/64/ and nohash/64/
>>
>> I'm thinking about leaving it in asm/ but renaming it task_size_user64.h
>>
>
> Quiet a lot of that is book3s 64 specifi because we have there.
>
> #if defined(CONFIG_PPC_BOOK3S_64) && defined(CONFIG_PPC_64K_PAGES)
> /*
> * Max value currently used:
> */
We have an #if / #else
#if defined(CONFIG_PPC_BOOK3S_64) && defined(CONFIG_PPC_64K_PAGES)
/*
* Max value currently used:
*/
#define TASK_SIZE_USER64 TASK_SIZE_4PB
#define DEFAULT_MAP_WINDOW_USER64 TASK_SIZE_128TB
#define TASK_CONTEXT_SIZE TASK_SIZE_512TB
#else
#define TASK_SIZE_USER64 TASK_SIZE_64TB
#define DEFAULT_MAP_WINDOW_USER64 TASK_SIZE_64TB
/*
* We don't need to allocate extended context ids for 4K page size, because
* we limit the max effective address on this config to 64TB.
*/
#define TASK_CONTEXT_SIZE TASK_SIZE_64TB
#endif
And processor .h derives several other consts applying to both BOOK3S64
et BOOK3E64 from that.
And arch/powerpc/mm/pgtable-book3e.c has:
BUILD_BUG_ON(TASK_SIZE_USER64 > PGTABLE_RANGE);
Christophe
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [RFC PATCH v3 2/7] powerpc: Prepare for moving thread_info into task_struct
2018-10-03 5:49 ` Christophe LEROY
2018-10-03 5:57 ` Nicholas Piggin
@ 2018-10-04 14:29 ` Christophe LEROY
1 sibling, 0 replies; 32+ messages in thread
From: Christophe LEROY @ 2018-10-04 14:29 UTC (permalink / raw)
To: Nicholas Piggin
Cc: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
aneesh.kumar, linux-kernel, linuxppc-dev
Le 03/10/2018 à 07:49, Christophe LEROY a écrit :
>
>
> Le 03/10/2018 à 07:02, Nicholas Piggin a écrit :
>> On Mon, 1 Oct 2018 12:30:21 +0000 (UTC)
>> Christophe Leroy <christophe.leroy@c-s.fr> wrote:
>>
>>> This patch cleans the powerpc kernel before activating
>>> CONFIG_THREAD_INFO_IN_TASK:
>>> - The purpose of the pointer given to call_do_softirq() and
>>> call_do_irq() is to point the new stack ==> change it to void*
>>> - Don't use CURRENT_THREAD_INFO() to locate the stack.
>>> - Fixed a few comments.
>>> - TI_CPU is only used when CONFIG_SMP is set.
>>> - Replace current_thread_info()->task by current
>>> - Remove unnecessary casts to thread_info, as they'll become invalid
>>> once thread_info is not in stack anymore.
>>> - Ensure task_struct 'cpu' fields is not used directly out of SMP code
>>> - Rename THREAD_INFO to TASK_STASK: As it is in fact the offset of the
>>> pointer to the stack in task_struct, this pointer will not be impacted
>>> by the move of THREAD_INFO.
>>> - Makes TASK_STACK available to PPC64 which will need it to the get
>>> stack pointer from current once the thread_info have been moved.
>>>
>>> Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
>>> ---
>>> arch/powerpc/include/asm/irq.h | 4 ++--
>>> arch/powerpc/include/asm/livepatch.h | 2 +-
>>> arch/powerpc/include/asm/processor.h | 4 ++--
>>> arch/powerpc/include/asm/reg.h | 2 +-
>>> arch/powerpc/kernel/asm-offsets.c | 2 +-
>>> arch/powerpc/kernel/entry_32.S | 2 +-
>>> arch/powerpc/kernel/entry_64.S | 2 +-
>>> arch/powerpc/kernel/head_32.S | 4 ++--
>>> arch/powerpc/kernel/head_40x.S | 4 ++--
>>> arch/powerpc/kernel/head_44x.S | 2 +-
>>> arch/powerpc/kernel/head_8xx.S | 2 +-
>>> arch/powerpc/kernel/head_booke.h | 4 ++--
>>> arch/powerpc/kernel/head_fsl_booke.S | 6 ++++--
>>> arch/powerpc/kernel/irq.c | 2 +-
>>> arch/powerpc/kernel/misc_32.S | 8 ++++++--
>>> arch/powerpc/kernel/process.c | 6 +++---
>>> arch/powerpc/kernel/setup_32.c | 15 +++++----------
>>> arch/powerpc/kernel/smp.c | 4 +++-
>>> arch/powerpc/xmon/xmon.c | 2 +-
>>> 19 files changed, 40 insertions(+), 37 deletions(-)
>>>
>>> diff --git a/arch/powerpc/include/asm/irq.h
>>> b/arch/powerpc/include/asm/irq.h
>>> index ee39ce56b2a2..8108d1fe33ca 100644
>>> --- a/arch/powerpc/include/asm/irq.h
>>> +++ b/arch/powerpc/include/asm/irq.h
>>> @@ -63,8 +63,8 @@ extern struct thread_info *hardirq_ctx[NR_CPUS];
>>> extern struct thread_info *softirq_ctx[NR_CPUS];
>>> extern void irq_ctx_init(void);
>>> -extern void call_do_softirq(struct thread_info *tp);
>>> -extern void call_do_irq(struct pt_regs *regs, struct thread_info *tp);
>>> +extern void call_do_softirq(void *tp);
>>> +extern void call_do_irq(struct pt_regs *regs, void *tp);
>>
>> void *sp for these ?
>
> Yes, why not but it means changing the code. I wanted to minimise the
> changes and avoid cosmetic. Or maybe should add a cosmetic patch at the
> end ?
In fact, I'll do it because the only additional impact is on a comment
in misc_32.S
Christophe
>
>>
>> This all seems okay to me except the 32-bit code which I don't know.
>> Would it be any trouble for you to put the TI_CPU bits into their own
>> patch?
>
> No problem, I can put the TI_CPU bits in a separate patch.
>
>>
>> Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
>>
>
> Thanks
> Christophe
>
>>
>>> extern void do_IRQ(struct pt_regs *regs);
>>> extern void __init init_IRQ(void);
>>> extern void __do_irq(struct pt_regs *regs);
>>> diff --git a/arch/powerpc/include/asm/livepatch.h
>>> b/arch/powerpc/include/asm/livepatch.h
>>> index 47a03b9b528b..818451bf629c 100644
>>> --- a/arch/powerpc/include/asm/livepatch.h
>>> +++ b/arch/powerpc/include/asm/livepatch.h
>>> @@ -49,7 +49,7 @@ static inline void klp_init_thread_info(struct
>>> thread_info *ti)
>>> ti->livepatch_sp = (unsigned long *)(ti + 1) + 1;
>>> }
>>> #else
>>> -static void klp_init_thread_info(struct thread_info *ti) { }
>>> +static inline void klp_init_thread_info(struct thread_info *ti) { }
>>> #endif /* CONFIG_LIVEPATCH */
>>> #endif /* _ASM_POWERPC_LIVEPATCH_H */
>>> diff --git a/arch/powerpc/include/asm/processor.h
>>> b/arch/powerpc/include/asm/processor.h
>>> index 353879db3e98..31873614392f 100644
>>> --- a/arch/powerpc/include/asm/processor.h
>>> +++ b/arch/powerpc/include/asm/processor.h
>>> @@ -40,7 +40,7 @@
>>> #ifndef __ASSEMBLY__
>>> #include <linux/types.h>
>>> -#include <asm/thread_info.h>
>>> +#include <linux/thread_info.h>
>>> #include <asm/ptrace.h>
>>> #include <asm/hw_breakpoint.h>
>>> @@ -333,7 +333,7 @@ struct thread_struct {
>>> #define INIT_SP (sizeof(init_stack) + (unsigned long)
>>> &init_stack)
>>> #define INIT_SP_LIMIT \
>>> - (_ALIGN_UP(sizeof(init_thread_info), 16) + (unsigned long)
>>> &init_stack)
>>> + (_ALIGN_UP(sizeof(struct thread_info), 16) + (unsigned long)
>>> &init_stack)
>>> #ifdef CONFIG_SPE
>>> #define SPEFSCR_INIT \
>>> diff --git a/arch/powerpc/include/asm/reg.h
>>> b/arch/powerpc/include/asm/reg.h
>>> index e5b314ed054e..f3a9cf19a986 100644
>>> --- a/arch/powerpc/include/asm/reg.h
>>> +++ b/arch/powerpc/include/asm/reg.h
>>> @@ -1053,7 +1053,7 @@
>>> * - SPRG9 debug exception scratch
>>> *
>>> * All 32-bit:
>>> - * - SPRG3 current thread_info pointer
>>> + * - SPRG3 current thread_struct physical addr pointer
>>> * (virtual on BookE, physical on others)
>>> *
>>> * 32-bit classic:
>>> diff --git a/arch/powerpc/kernel/asm-offsets.c
>>> b/arch/powerpc/kernel/asm-offsets.c
>>> index ba9d0fc98730..d1f161e48945 100644
>>> --- a/arch/powerpc/kernel/asm-offsets.c
>>> +++ b/arch/powerpc/kernel/asm-offsets.c
>>> @@ -85,10 +85,10 @@ int main(void)
>>> DEFINE(NMI_MASK, NMI_MASK);
>>> OFFSET(TASKTHREADPPR, task_struct, thread.ppr);
>>> #else
>>> - OFFSET(THREAD_INFO, task_struct, stack);
>>> DEFINE(THREAD_INFO_GAP, _ALIGN_UP(sizeof(struct thread_info),
>>> 16));
>>> OFFSET(KSP_LIMIT, thread_struct, ksp_limit);
>>> #endif /* CONFIG_PPC64 */
>>> + OFFSET(TASK_STACK, task_struct, stack);
>>> #ifdef CONFIG_LIVEPATCH
>>> OFFSET(TI_livepatch_sp, thread_info, livepatch_sp);
>>> diff --git a/arch/powerpc/kernel/entry_32.S
>>> b/arch/powerpc/kernel/entry_32.S
>>> index e58c3f467db5..12c0721f65ea 100644
>>> --- a/arch/powerpc/kernel/entry_32.S
>>> +++ b/arch/powerpc/kernel/entry_32.S
>>> @@ -1166,7 +1166,7 @@ ret_from_debug_exc:
>>> mfspr r9,SPRN_SPRG_THREAD
>>> lwz r10,SAVED_KSP_LIMIT(r1)
>>> stw r10,KSP_LIMIT(r9)
>>> - lwz r9,THREAD_INFO-THREAD(r9)
>>> + lwz r9,TASK_STACK-THREAD(r9)
>>> CURRENT_THREAD_INFO(r10, r1)
>>> lwz r10,TI_PREEMPT(r10)
>>> stw r10,TI_PREEMPT(r9)
>>> diff --git a/arch/powerpc/kernel/entry_64.S
>>> b/arch/powerpc/kernel/entry_64.S
>>> index 77a888bfcb53..697406572592 100644
>>> --- a/arch/powerpc/kernel/entry_64.S
>>> +++ b/arch/powerpc/kernel/entry_64.S
>>> @@ -680,7 +680,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
>>> 2:
>>> #endif /* CONFIG_PPC_BOOK3S_64 */
>>> - CURRENT_THREAD_INFO(r7, r8) /* base of new stack */
>>> + clrrdi r7, r8, THREAD_SHIFT /* base of new stack */
>>> /* Note: this uses SWITCH_FRAME_SIZE rather than INT_FRAME_SIZE
>>> because we don't need to leave the 288-byte ABI gap at the
>>> top of the kernel stack. */
>>> diff --git a/arch/powerpc/kernel/head_32.S
>>> b/arch/powerpc/kernel/head_32.S
>>> index 61ca27929355..dce6f2ff07e5 100644
>>> --- a/arch/powerpc/kernel/head_32.S
>>> +++ b/arch/powerpc/kernel/head_32.S
>>> @@ -261,7 +261,7 @@ __secondary_hold_acknowledge:
>>> tophys(r11,r1); /* use tophys(r1) if kernel */ \
>>> beq 1f; \
>>> mfspr r11,SPRN_SPRG_THREAD; \
>>> - lwz r11,THREAD_INFO-THREAD(r11); \
>>> + lwz r11,TASK_STACK-THREAD(r11); \
>>> addi r11,r11,THREAD_SIZE; \
>>> tophys(r11,r11); \
>>> 1: subi r11,r11,INT_FRAME_SIZE /* alloc exc. frame */
>>> @@ -841,7 +841,7 @@ __secondary_start:
>>> bl init_idle_6xx
>>> #endif /* CONFIG_6xx */
>>> - /* get current_thread_info and current */
>>> + /* get current's stack and current */
>>> lis r1,secondary_ti@ha
>>> tophys(r1,r1)
>>> lwz r1,secondary_ti@l(r1)
>>> diff --git a/arch/powerpc/kernel/head_40x.S
>>> b/arch/powerpc/kernel/head_40x.S
>>> index b19d78410511..3088c9f29f5e 100644
>>> --- a/arch/powerpc/kernel/head_40x.S
>>> +++ b/arch/powerpc/kernel/head_40x.S
>>> @@ -115,7 +115,7 @@ _ENTRY(saved_ksp_limit)
>>> andi. r11,r11,MSR_PR; \
>>> beq 1f; \
>>> mfspr r1,SPRN_SPRG_THREAD; /* if from user, start at top
>>> of */\
>>> - lwz r1,THREAD_INFO-THREAD(r1); /* this thread's kernel
>>> stack */\
>>> + lwz r1,TASK_STACK-THREAD(r1); /* this thread's kernel stack
>>> */\
>>> addi r1,r1,THREAD_SIZE; \
>>> 1: subi r1,r1,INT_FRAME_SIZE; /* Allocate an exception
>>> frame */\
>>> tophys(r11,r1); \
>>> @@ -158,7 +158,7 @@ _ENTRY(saved_ksp_limit)
>>> beq 1f; \
>>> /* COMING FROM USER MODE */ \
>>> mfspr r11,SPRN_SPRG_THREAD; /* if from user, start at top
>>> of */\
>>> - lwz r11,THREAD_INFO-THREAD(r11); /* this thread's kernel
>>> stack */\
>>> + lwz r11,TASK_STACK-THREAD(r11); /* this thread's kernel stack
>>> */\
>>> 1: addi r11,r11,THREAD_SIZE-INT_FRAME_SIZE; /* Alloc an excpt
>>> frm */\
>>> tophys(r11,r11); \
>>> stw r10,_CCR(r11); /* save various registers */\
>>> diff --git a/arch/powerpc/kernel/head_44x.S
>>> b/arch/powerpc/kernel/head_44x.S
>>> index 37e4a7cf0065..15d39b2499de 100644
>>> --- a/arch/powerpc/kernel/head_44x.S
>>> +++ b/arch/powerpc/kernel/head_44x.S
>>> @@ -1020,7 +1020,7 @@ _GLOBAL(start_secondary_47x)
>>> /* Now we can get our task struct and real stack pointer */
>>> - /* Get current_thread_info and current */
>>> + /* Get current's stack and current */
>>> lis r1,secondary_ti@ha
>>> lwz r1,secondary_ti@l(r1)
>>> lwz r2,TI_TASK(r1)
>>> diff --git a/arch/powerpc/kernel/head_8xx.S
>>> b/arch/powerpc/kernel/head_8xx.S
>>> index 6582f824d620..e56e36aa2b3d 100644
>>> --- a/arch/powerpc/kernel/head_8xx.S
>>> +++ b/arch/powerpc/kernel/head_8xx.S
>>> @@ -124,7 +124,7 @@ turn_on_mmu:
>>> tophys(r11,r1); /* use tophys(r1) if kernel */ \
>>> beq 1f; \
>>> mfspr r11,SPRN_SPRG_THREAD; \
>>> - lwz r11,THREAD_INFO-THREAD(r11); \
>>> + lwz r11,TASK_STACK-THREAD(r11); \
>>> addi r11,r11,THREAD_SIZE; \
>>> tophys(r11,r11); \
>>> 1: subi r11,r11,INT_FRAME_SIZE /* alloc exc. frame */
>>> diff --git a/arch/powerpc/kernel/head_booke.h
>>> b/arch/powerpc/kernel/head_booke.h
>>> index d0862a100d29..20fe0c93a0bd 100644
>>> --- a/arch/powerpc/kernel/head_booke.h
>>> +++ b/arch/powerpc/kernel/head_booke.h
>>> @@ -44,7 +44,7 @@
>>> mr r11, r1; \
>>> beq 1f; \
>>> /* if from user, start at top of this thread's kernel stack
>>> */ \
>>> - lwz r11, THREAD_INFO-THREAD(r10); \
>>> + lwz r11, TASK_STACK-THREAD(r10); \
>>> ALLOC_STACK_FRAME(r11, THREAD_SIZE); \
>>> 1 : subi r11, r11, INT_FRAME_SIZE; /* Allocate exception
>>> frame */ \
>>> stw r13, _CCR(r11); /* save various registers
>>> */ \
>>> @@ -130,7 +130,7 @@
>>> DO_KVM BOOKE_INTERRUPT_##intno
>>> exc_level_srr1; \
>>> andi. r11,r11,MSR_PR; \
>>> mfspr r11,SPRN_SPRG_THREAD; /* if from user, start at top
>>> of */\
>>> - lwz r11,THREAD_INFO-THREAD(r11); /* this thread's kernel
>>> stack */\
>>> + lwz r11,TASK_STACK-THREAD(r11); /* this thread's kernel stack
>>> */\
>>> addi r11,r11,EXC_LVL_FRAME_OVERHEAD; /* allocate stack
>>> frame */\
>>> beq 1f; \
>>> /* COMING FROM USER MODE */ \
>>> diff --git a/arch/powerpc/kernel/head_fsl_booke.S
>>> b/arch/powerpc/kernel/head_fsl_booke.S
>>> index e2750b856c8f..239ad8a4754e 100644
>>> --- a/arch/powerpc/kernel/head_fsl_booke.S
>>> +++ b/arch/powerpc/kernel/head_fsl_booke.S
>>> @@ -243,8 +243,10 @@ set_ivor:
>>> li r0,0
>>> stwu r0,THREAD_SIZE-STACK_FRAME_OVERHEAD(r1)
>>> +#ifdef CONFIG_SMP
>>> CURRENT_THREAD_INFO(r22, r1)
>>> stw r24, TI_CPU(r22)
>>> +#endif
>>> bl early_init
>>> @@ -702,7 +704,7 @@ finish_tlb_load:
>>> /* Get the next_tlbcam_idx percpu var */
>>> #ifdef CONFIG_SMP
>>> - lwz r12, THREAD_INFO-THREAD(r12)
>>> + lwz r12, TASK_STACK-THREAD(r12)
>>> lwz r15, TI_CPU(r12)
>>> lis r14, __per_cpu_offset@h
>>> ori r14, r14, __per_cpu_offset@l
>>> @@ -1074,7 +1076,7 @@ __secondary_start:
>>> mr r4,r24 /* Why? */
>>> bl call_setup_cpu
>>> - /* get current_thread_info and current */
>>> + /* get current's stack and current */
>>> lis r1,secondary_ti@ha
>>> lwz r1,secondary_ti@l(r1)
>>> lwz r2,TI_TASK(r1)
>>> diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
>>> index 916ddc4aac44..aa53db3ba6e7 100644
>>> --- a/arch/powerpc/kernel/irq.c
>>> +++ b/arch/powerpc/kernel/irq.c
>>> @@ -663,7 +663,7 @@ void do_IRQ(struct pt_regs *regs)
>>> struct thread_info *curtp, *irqtp, *sirqtp;
>>> /* Switch to the irq stack to handle this */
>>> - curtp = current_thread_info();
>>> + curtp = (void*)(current_stack_pointer() & ~(THREAD_SIZE - 1));
>>> irqtp = hardirq_ctx[raw_smp_processor_id()];
>>> sirqtp = softirq_ctx[raw_smp_processor_id()];
>>> diff --git a/arch/powerpc/kernel/misc_32.S
>>> b/arch/powerpc/kernel/misc_32.S
>>> index 695b24a2d954..24a7f18ea10c 100644
>>> --- a/arch/powerpc/kernel/misc_32.S
>>> +++ b/arch/powerpc/kernel/misc_32.S
>>> @@ -60,7 +60,7 @@ _GLOBAL(call_do_softirq)
>>> blr
>>> /*
>>> - * void call_do_irq(struct pt_regs *regs, struct thread_info *irqtp);
>>> + * void call_do_irq(struct pt_regs *regs, void *irqtp);
>>> */
>>> _GLOBAL(call_do_irq)
>>> mflr r0
>>> @@ -183,10 +183,14 @@ _GLOBAL(low_choose_750fx_pll)
>>> or r4,r4,r5
>>> mtspr SPRN_HID1,r4
>>> +#ifdef CONFIG_SMP
>>> /* Store new HID1 image */
>>> CURRENT_THREAD_INFO(r6, r1)
>>> lwz r6,TI_CPU(r6)
>>> slwi r6,r6,2
>>> +#else
>>> + li r6, 0
>>> +#endif
>>> addis r6,r6,nap_save_hid1@ha
>>> stw r4,nap_save_hid1@l(r6)
>>> @@ -599,7 +603,7 @@ EXPORT_SYMBOL(__bswapdi2)
>>> #ifdef CONFIG_SMP
>>> _GLOBAL(start_secondary_resume)
>>> /* Reset stack */
>>> - CURRENT_THREAD_INFO(r1, r1)
>>> + rlwinm r1, r1, 0, 0, 31 - THREAD_SHIFT
>>> addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD
>>> li r3,0
>>> stw r3,0(r1) /* Zero the stack frame pointer */
>>> diff --git a/arch/powerpc/kernel/process.c
>>> b/arch/powerpc/kernel/process.c
>>> index 03c2e1f134bc..111abb4df2ec 100644
>>> --- a/arch/powerpc/kernel/process.c
>>> +++ b/arch/powerpc/kernel/process.c
>>> @@ -1240,8 +1240,8 @@ struct task_struct *__switch_to(struct
>>> task_struct *prev,
>>> batch->active = 1;
>>> }
>>> - if (current_thread_info()->task->thread.regs) {
>>> - restore_math(current_thread_info()->task->thread.regs);
>>> + if (current->thread.regs) {
>>> + restore_math(current->thread.regs);
>>> /*
>>> * The copy-paste buffer can only store into foreign real
>>> @@ -1251,7 +1251,7 @@ struct task_struct *__switch_to(struct
>>> task_struct *prev,
>>> * mappings, we must issue a cp_abort to clear any state and
>>> * prevent snooping, corruption or a covert channel.
>>> */
>>> - if (current_thread_info()->task->thread.used_vas)
>>> + if (current->thread.used_vas)
>>> asm volatile(PPC_CP_ABORT);
>>> }
>>> #endif /* CONFIG_PPC_BOOK3S_64 */
>>> diff --git a/arch/powerpc/kernel/setup_32.c
>>> b/arch/powerpc/kernel/setup_32.c
>>> index 8c507be12c3c..81ebf7d6f526 100644
>>> --- a/arch/powerpc/kernel/setup_32.c
>>> +++ b/arch/powerpc/kernel/setup_32.c
>>> @@ -205,10 +205,8 @@ void __init irqstack_early_init(void)
>>> /* interrupt stacks must be in lowmem, we get that for free on
>>> ppc32
>>> * as the memblock is limited to lowmem by default */
>>> for_each_possible_cpu(i) {
>>> - softirq_ctx[i] = (struct thread_info *)
>>> - __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
>>> - hardirq_ctx[i] = (struct thread_info *)
>>> - __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
>>> + softirq_ctx[i] = __va(memblock_alloc(THREAD_SIZE,
>>> THREAD_SIZE));
>>> + hardirq_ctx[i] = __va(memblock_alloc(THREAD_SIZE,
>>> THREAD_SIZE));
>>> }
>>> }
>>> @@ -226,13 +224,10 @@ void __init exc_lvl_early_init(void)
>>> hw_cpu = 0;
>>> #endif
>>> - critirq_ctx[hw_cpu] = (struct thread_info *)
>>> - __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
>>> + critirq_ctx[hw_cpu] = __va(memblock_alloc(THREAD_SIZE,
>>> THREAD_SIZE));
>>> #ifdef CONFIG_BOOKE
>>> - dbgirq_ctx[hw_cpu] = (struct thread_info *)
>>> - __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
>>> - mcheckirq_ctx[hw_cpu] = (struct thread_info *)
>>> - __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
>>> + dbgirq_ctx[hw_cpu] = __va(memblock_alloc(THREAD_SIZE,
>>> THREAD_SIZE));
>>> + mcheckirq_ctx[hw_cpu] = __va(memblock_alloc(THREAD_SIZE,
>>> THREAD_SIZE));
>>> #endif
>>> }
>>> }
>>> diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
>>> index 61c1fadbc644..19dd0ea55714 100644
>>> --- a/arch/powerpc/kernel/smp.c
>>> +++ b/arch/powerpc/kernel/smp.c
>>> @@ -20,6 +20,7 @@
>>> #include <linux/kernel.h>
>>> #include <linux/export.h>
>>> #include <linux/sched/mm.h>
>>> +#include <linux/sched/task_stack.h>
>>> #include <linux/sched/topology.h>
>>> #include <linux/smp.h>
>>> #include <linux/interrupt.h>
>>> @@ -812,7 +813,8 @@ static void cpu_idle_thread_init(unsigned int
>>> cpu, struct task_struct *idle)
>>> #ifdef CONFIG_PPC64
>>> paca_ptrs[cpu]->__current = idle;
>>> - paca_ptrs[cpu]->kstack = (unsigned long)ti + THREAD_SIZE -
>>> STACK_FRAME_OVERHEAD;
>>> + paca_ptrs[cpu]->kstack = (unsigned long)task_stack_page(idle) +
>>> + THREAD_SIZE - STACK_FRAME_OVERHEAD;
>>> #endif
>>> ti->cpu = cpu;
>>> secondary_ti = current_set[cpu] = ti;
>>> diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
>>> index 694c1d92e796..0d8d6fee892a 100644
>>> --- a/arch/powerpc/xmon/xmon.c
>>> +++ b/arch/powerpc/xmon/xmon.c
>>> @@ -2988,7 +2988,7 @@ static void show_task(struct task_struct *tsk)
>>> printf("%px %016lx %6d %6d %c %2d %s\n", tsk,
>>> tsk->thread.ksp,
>>> tsk->pid, tsk->parent->pid,
>>> - state, task_thread_info(tsk)->cpu,
>>> + state, task_cpu(tsk),
>>> tsk->comm);
>>> }
>>> --
>>> 2.13.3
>>>
^ permalink raw reply [flat|nested] 32+ messages in thread
end of thread, other threads:[~2018-10-04 14:29 UTC | newest]
Thread overview: 32+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-10-01 12:30 [RFC PATCH v3 0/7] powerpc: Switch to CONFIG_THREAD_INFO_IN_TASK Christophe Leroy
2018-10-01 12:30 ` [RFC PATCH v3 1/7] book3s/64: avoid circular header inclusion in mmu-hash.h Christophe Leroy
2018-10-03 4:24 ` Nicholas Piggin
2018-10-04 8:20 ` Christophe LEROY
2018-10-04 8:23 ` Aneesh Kumar K.V
2018-10-04 8:32 ` Christophe LEROY
2018-10-01 12:30 ` [RFC PATCH v3 2/7] powerpc: Prepare for moving thread_info into task_struct Christophe Leroy
2018-10-03 5:02 ` Nicholas Piggin
2018-10-03 5:49 ` Christophe LEROY
2018-10-03 5:57 ` Nicholas Piggin
2018-10-04 14:29 ` Christophe LEROY
2018-10-01 12:30 ` [RFC PATCH v3 3/7] powerpc: Activate CONFIG_THREAD_INFO_IN_TASK Christophe Leroy
2018-10-03 5:30 ` Nicholas Piggin
2018-10-03 5:47 ` Christophe LEROY
2018-10-03 5:52 ` Nicholas Piggin
2018-10-03 6:04 ` Christophe LEROY
2018-10-03 6:23 ` Nicholas Piggin
2018-10-01 12:30 ` [RFC PATCH v3 4/7] powerpc: regain entire stack space Christophe Leroy
2018-10-03 5:34 ` Nicholas Piggin
2018-10-03 5:52 ` Christophe LEROY
2018-10-03 6:30 ` Nicholas Piggin
2018-10-03 6:45 ` Christophe LEROY
2018-10-03 7:07 ` Nicholas Piggin
2018-10-03 9:30 ` Christophe LEROY
2018-10-01 12:30 ` [RFC PATCH v3 5/7] powerpc: 'current_set' is now a table of task_struct pointers Christophe Leroy
2018-10-03 5:41 ` Nicholas Piggin
2018-10-03 6:00 ` Christophe LEROY
2018-10-03 6:09 ` Nicholas Piggin
2018-10-01 12:30 ` [RFC PATCH v3 6/7] powerpc/32: Remove CURRENT_THREAD_INFO and rename TI_CPU Christophe Leroy
2018-10-01 12:30 ` [RFC PATCH v3 7/7] powerpc/64: Modify CURRENT_THREAD_INFO() Christophe Leroy
2018-10-03 5:44 ` Nicholas Piggin
2018-10-03 6:01 ` Christophe LEROY
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).