From: Christophe Leroy <christophe.leroy@c-s.fr> To: Benjamin Herrenschmidt <benh@kernel.crashing.org>, Paul Mackerras <paulus@samba.org>, Michael Ellerman <mpe@ellerman.id.au>, segher@kernel.crashing.org Cc: linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org Subject: [PATCH v4 1/2] powerpc/irq: bring back ksp_limit management in C functions. Date: Thu, 10 Oct 2019 05:36:31 +0000 (UTC) [thread overview] Message-ID: <f12fb9a6cc52d83ee9ddf15a36ee12ac77e6379f.1570684298.git.christophe.leroy@c-s.fr> (raw) Commit cbc9565ee826 ("powerpc: Remove ksp_limit on ppc64") moved PPC32 ksp_limit handling in assembly functions call_do_softirq() and call_do_irq() as they are different for PPC32 and PPC64. In preparation of replacing these functions by inline assembly, partialy revert that commit to bring back ksp_limit assignment in the callers. To get and set ksp_limit without a forest of #ifdefs CONFIG_PPC32, use helpers that will void on PPC64. Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> --- v2: added forward declaration of struct task_struct to avoid build failure. v3: included linux/sched.h, forward declaration is not enough. v4: no change --- arch/powerpc/include/asm/irq.h | 22 ++++++++++++++++++++++ arch/powerpc/kernel/irq.c | 14 +++++++++++++- arch/powerpc/kernel/misc_32.S | 14 -------------- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/arch/powerpc/include/asm/irq.h b/arch/powerpc/include/asm/irq.h index 814dfab7e392..0c6469983c66 100644 --- a/arch/powerpc/include/asm/irq.h +++ b/arch/powerpc/include/asm/irq.h @@ -10,6 +10,7 @@ #include <linux/threads.h> #include <linux/list.h> #include <linux/radix-tree.h> +#include <linux/sched.h> #include <asm/types.h> #include <linux/atomic.h> @@ -64,5 +65,26 @@ extern void __do_irq(struct pt_regs *regs); int irq_choose_cpu(const struct cpumask *mask); +#ifdef CONFIG_PPC32 +static inline unsigned long get_ksp_limit(struct task_struct *tsk) +{ + return tsk->thread.ksp_limit; +} + +static inline void set_ksp_limit(struct task_struct *tsk, unsigned long limit) +{ + tsk->thread.ksp_limit = limit; +} +#else +static inline unsigned long get_ksp_limit(struct task_struct *tsk) +{ + return 0; +} + +static inline void set_ksp_limit(struct task_struct *tsk, unsigned long limit) +{ +} +#endif + #endif /* _ASM_IRQ_H */ #endif /* __KERNEL__ */ diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 5645bc9cbc09..04204be49577 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c @@ -646,6 +646,7 @@ void do_IRQ(struct pt_regs *regs) { struct pt_regs *old_regs = set_irq_regs(regs); void *cursp, *irqsp, *sirqsp; + unsigned long saved_ksp_limit = get_ksp_limit(current); /* Switch to the irq stack to handle this */ cursp = (void *)(current_stack_pointer() & ~(THREAD_SIZE - 1)); @@ -658,9 +659,15 @@ void do_IRQ(struct pt_regs *regs) set_irq_regs(old_regs); return; } + /* Adjust the stack limit */ + set_ksp_limit(current, (unsigned long)irqsp); + /* Switch stack and call */ call_do_irq(regs, irqsp); + /* Restore stack limit */ + set_ksp_limit(current, saved_ksp_limit); + set_irq_regs(old_regs); } @@ -681,7 +688,12 @@ void *hardirq_ctx[NR_CPUS] __read_mostly; void do_softirq_own_stack(void) { - call_do_softirq(softirq_ctx[smp_processor_id()]); + void *irqsp = softirq_ctx[smp_processor_id()]; + unsigned long saved_ksp_limit = get_ksp_limit(current); + + set_ksp_limit(current, (unsigned long)irqsp); + call_do_softirq(irqsp); + set_ksp_limit(current, saved_ksp_limit); } irq_hw_number_t virq_to_hw(unsigned int virq) diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S index 82df4b09e79f..a5422f7782b3 100644 --- a/arch/powerpc/kernel/misc_32.S +++ b/arch/powerpc/kernel/misc_32.S @@ -33,23 +33,14 @@ .text -/* - * We store the saved ksp_limit in the unused part - * of the STACK_FRAME_OVERHEAD - */ _GLOBAL(call_do_softirq) mflr r0 stw r0,4(r1) - lwz r10,THREAD+KSP_LIMIT(r2) - stw r3, THREAD+KSP_LIMIT(r2) stwu r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r3) mr r1,r3 - stw r10,8(r1) bl __do_softirq - lwz r10,8(r1) lwz r1,0(r1) lwz r0,4(r1) - stw r10,THREAD+KSP_LIMIT(r2) mtlr r0 blr @@ -59,16 +50,11 @@ _GLOBAL(call_do_softirq) _GLOBAL(call_do_irq) mflr r0 stw r0,4(r1) - lwz r10,THREAD+KSP_LIMIT(r2) - stw r4, THREAD+KSP_LIMIT(r2) stwu r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r4) mr r1,r4 - stw r10,8(r1) bl __do_irq - lwz r10,8(r1) lwz r1,0(r1) lwz r0,4(r1) - stw r10,THREAD+KSP_LIMIT(r2) mtlr r0 blr -- 2.13.3
WARNING: multiple messages have this Message-ID (diff)
From: Christophe Leroy <christophe.leroy@c-s.fr> To: Benjamin Herrenschmidt <benh@kernel.crashing.org>, Paul Mackerras <paulus@samba.org>, Michael Ellerman <mpe@ellerman.id.au>, segher@kernel.crashing.org Cc: linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 1/2] powerpc/irq: bring back ksp_limit management in C functions. Date: Thu, 10 Oct 2019 05:36:31 +0000 (UTC) [thread overview] Message-ID: <f12fb9a6cc52d83ee9ddf15a36ee12ac77e6379f.1570684298.git.christophe.leroy@c-s.fr> (raw) Commit cbc9565ee826 ("powerpc: Remove ksp_limit on ppc64") moved PPC32 ksp_limit handling in assembly functions call_do_softirq() and call_do_irq() as they are different for PPC32 and PPC64. In preparation of replacing these functions by inline assembly, partialy revert that commit to bring back ksp_limit assignment in the callers. To get and set ksp_limit without a forest of #ifdefs CONFIG_PPC32, use helpers that will void on PPC64. Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> --- v2: added forward declaration of struct task_struct to avoid build failure. v3: included linux/sched.h, forward declaration is not enough. v4: no change --- arch/powerpc/include/asm/irq.h | 22 ++++++++++++++++++++++ arch/powerpc/kernel/irq.c | 14 +++++++++++++- arch/powerpc/kernel/misc_32.S | 14 -------------- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/arch/powerpc/include/asm/irq.h b/arch/powerpc/include/asm/irq.h index 814dfab7e392..0c6469983c66 100644 --- a/arch/powerpc/include/asm/irq.h +++ b/arch/powerpc/include/asm/irq.h @@ -10,6 +10,7 @@ #include <linux/threads.h> #include <linux/list.h> #include <linux/radix-tree.h> +#include <linux/sched.h> #include <asm/types.h> #include <linux/atomic.h> @@ -64,5 +65,26 @@ extern void __do_irq(struct pt_regs *regs); int irq_choose_cpu(const struct cpumask *mask); +#ifdef CONFIG_PPC32 +static inline unsigned long get_ksp_limit(struct task_struct *tsk) +{ + return tsk->thread.ksp_limit; +} + +static inline void set_ksp_limit(struct task_struct *tsk, unsigned long limit) +{ + tsk->thread.ksp_limit = limit; +} +#else +static inline unsigned long get_ksp_limit(struct task_struct *tsk) +{ + return 0; +} + +static inline void set_ksp_limit(struct task_struct *tsk, unsigned long limit) +{ +} +#endif + #endif /* _ASM_IRQ_H */ #endif /* __KERNEL__ */ diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 5645bc9cbc09..04204be49577 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c @@ -646,6 +646,7 @@ void do_IRQ(struct pt_regs *regs) { struct pt_regs *old_regs = set_irq_regs(regs); void *cursp, *irqsp, *sirqsp; + unsigned long saved_ksp_limit = get_ksp_limit(current); /* Switch to the irq stack to handle this */ cursp = (void *)(current_stack_pointer() & ~(THREAD_SIZE - 1)); @@ -658,9 +659,15 @@ void do_IRQ(struct pt_regs *regs) set_irq_regs(old_regs); return; } + /* Adjust the stack limit */ + set_ksp_limit(current, (unsigned long)irqsp); + /* Switch stack and call */ call_do_irq(regs, irqsp); + /* Restore stack limit */ + set_ksp_limit(current, saved_ksp_limit); + set_irq_regs(old_regs); } @@ -681,7 +688,12 @@ void *hardirq_ctx[NR_CPUS] __read_mostly; void do_softirq_own_stack(void) { - call_do_softirq(softirq_ctx[smp_processor_id()]); + void *irqsp = softirq_ctx[smp_processor_id()]; + unsigned long saved_ksp_limit = get_ksp_limit(current); + + set_ksp_limit(current, (unsigned long)irqsp); + call_do_softirq(irqsp); + set_ksp_limit(current, saved_ksp_limit); } irq_hw_number_t virq_to_hw(unsigned int virq) diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S index 82df4b09e79f..a5422f7782b3 100644 --- a/arch/powerpc/kernel/misc_32.S +++ b/arch/powerpc/kernel/misc_32.S @@ -33,23 +33,14 @@ .text -/* - * We store the saved ksp_limit in the unused part - * of the STACK_FRAME_OVERHEAD - */ _GLOBAL(call_do_softirq) mflr r0 stw r0,4(r1) - lwz r10,THREAD+KSP_LIMIT(r2) - stw r3, THREAD+KSP_LIMIT(r2) stwu r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r3) mr r1,r3 - stw r10,8(r1) bl __do_softirq - lwz r10,8(r1) lwz r1,0(r1) lwz r0,4(r1) - stw r10,THREAD+KSP_LIMIT(r2) mtlr r0 blr @@ -59,16 +50,11 @@ _GLOBAL(call_do_softirq) _GLOBAL(call_do_irq) mflr r0 stw r0,4(r1) - lwz r10,THREAD+KSP_LIMIT(r2) - stw r4, THREAD+KSP_LIMIT(r2) stwu r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r4) mr r1,r4 - stw r10,8(r1) bl __do_irq - lwz r10,8(r1) lwz r1,0(r1) lwz r0,4(r1) - stw r10,THREAD+KSP_LIMIT(r2) mtlr r0 blr -- 2.13.3
next reply other threads:[~2019-10-10 5:36 UTC|newest] Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-10-10 5:36 Christophe Leroy [this message] 2019-10-10 5:36 ` [PATCH v4 1/2] powerpc/irq: bring back ksp_limit management in C functions Christophe Leroy 2019-10-10 5:36 ` [PATCH v4 2/2] powerpc/irq: inline call_do_irq() and call_do_softirq() Christophe Leroy 2019-10-10 5:36 ` Christophe Leroy 2019-11-21 6:14 ` Michael Ellerman 2019-11-21 6:14 ` Michael Ellerman 2019-11-21 10:15 ` Segher Boessenkool 2019-11-21 10:15 ` Segher Boessenkool 2019-11-25 10:32 ` Michael Ellerman 2019-11-25 10:32 ` Michael Ellerman 2019-11-25 14:25 ` Segher Boessenkool 2019-11-25 14:25 ` Segher Boessenkool 2019-11-27 13:50 ` Christophe Leroy 2019-11-27 13:50 ` Christophe Leroy 2019-11-27 14:59 ` Segher Boessenkool 2019-11-27 14:59 ` Segher Boessenkool 2019-11-27 15:15 ` Christophe Leroy 2019-11-27 15:15 ` Christophe Leroy 2019-11-29 18:46 ` Segher Boessenkool 2019-11-29 18:46 ` Segher Boessenkool 2019-12-04 4:32 ` Christophe Leroy 2019-12-04 4:32 ` Christophe Leroy 2019-12-06 20:59 ` Segher Boessenkool 2019-12-06 20:59 ` Segher Boessenkool 2019-12-07 9:42 ` Christophe Leroy 2019-12-07 9:42 ` Christophe Leroy 2019-12-07 17:40 ` Segher Boessenkool 2019-12-07 17:40 ` Segher Boessenkool 2019-12-09 10:53 ` Michael Ellerman 2019-12-09 10:53 ` Michael Ellerman 2019-12-19 6:57 ` Christophe Leroy 2019-12-19 6:57 ` Christophe Leroy
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=f12fb9a6cc52d83ee9ddf15a36ee12ac77e6379f.1570684298.git.christophe.leroy@c-s.fr \ --to=christophe.leroy@c-s.fr \ --cc=benh@kernel.crashing.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linuxppc-dev@lists.ozlabs.org \ --cc=mpe@ellerman.id.au \ --cc=paulus@samba.org \ --cc=segher@kernel.crashing.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.