Message ID | 20221208025816.138712-10-guoren@kernel.org (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | riscv: Add GENERIC_ENTRY support and related features | expand |
guoren@kernel.org writes: > From: Guo Ren <guoren@linux.alibaba.com> > > Add the HAVE_SOFTIRQ_ON_OWN_STACK feature for the IRQ_STACKS config. The > irq and softirq use the same independent irq_stack of percpu by time > division multiplexing. > > Tested-by: Jisheng Zhang <jszhang@kernel.org> > Signed-off-by: Guo Ren <guoren@linux.alibaba.com> > Signed-off-by: Guo Ren <guoren@kernel.org> > --- > arch/riscv/Kconfig | 7 ++++--- > arch/riscv/kernel/irq.c | 33 +++++++++++++++++++++++++++++++++ > 2 files changed, 37 insertions(+), 3 deletions(-) > > diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig > index 0a9d4bdc0338..bd4c4ae4cdc9 100644 > --- a/arch/riscv/Kconfig > +++ b/arch/riscv/Kconfig > @@ -447,12 +447,13 @@ config FPU > If you don't know what to do here, say Y. > > config IRQ_STACKS > - bool "Independent irq stacks" if EXPERT > + bool "Independent irq & softirq stacks" if EXPERT > default y > select HAVE_IRQ_EXIT_ON_IRQ_STACK > + select HAVE_SOFTIRQ_ON_OWN_STACK HAVE_IRQ_EXIT_ON_IRQ_STACK is used by softirq.c Shouldn't that be selected introduced in this patch, instead of the previous one? > help > - Add independent irq stacks for percpu to prevent kernel stack overflows. > - We may save some memory footprint by disabling IRQ_STACKS. > + Add independent irq & softirq stacks for percpu to prevent kernel stack > + overflows. We may save some memory footprint by disabling IRQ_STACKS. Same comment from previous patch. Please use the same wording/config as other archs. > endmenu # "Platform type" > > diff --git a/arch/riscv/kernel/irq.c b/arch/riscv/kernel/irq.c > index 5d77f692b198..a6406da34937 100644 > --- a/arch/riscv/kernel/irq.c > +++ b/arch/riscv/kernel/irq.c > @@ -11,6 +11,7 @@ > #include <linux/seq_file.h> > #include <asm/smp.h> > #include <asm/vmap_stack.h> > +#include <asm/softirq_stack.h> > > #ifdef CONFIG_IRQ_STACKS > static DEFINE_PER_CPU(ulong *, irq_stack_ptr); > @@ -38,6 +39,38 @@ static void init_irq_stacks(void) > per_cpu(irq_stack_ptr, cpu) = per_cpu(irq_stack, cpu); > } > #endif /* CONFIG_VMAP_STACK */ > + > +#ifdef CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK > +void do_softirq_own_stack(void) > +{ > +#ifdef CONFIG_IRQ_STACKS > + if (on_thread_stack()) { > + ulong *sp = per_cpu(irq_stack_ptr, smp_processor_id()) > + + IRQ_STACK_SIZE/sizeof(ulong); > + __asm__ __volatile( > + "addi sp, sp, -"RISCV_SZPTR "\n" > + REG_S" ra, (sp) \n" > + "addi sp, sp, -"RISCV_SZPTR "\n" > + REG_S" s0, (sp) \n" > + "addi s0, sp, 2*"RISCV_SZPTR "\n" > + "move sp, %[sp] \n" > + "call __do_softirq \n" > + "addi sp, s0, -2*"RISCV_SZPTR"\n" > + REG_L" s0, (sp) \n" > + "addi sp, sp, "RISCV_SZPTR "\n" > + REG_L" ra, (sp) \n" > + "addi sp, sp, "RISCV_SZPTR "\n" > + : > + : [sp] "r" (sp) > + : "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", > + "t0", "t1", "t2", "t3", "t4", "t5", "t6", > + "memory"); Same as previous patch. Please avoid C&P and have a look at how call_on_stack is done on x86. Björn
On Thu, Dec 8, 2022 at 6:12 PM Björn Töpel <bjorn@kernel.org> wrote: > > guoren@kernel.org writes: > > > From: Guo Ren <guoren@linux.alibaba.com> > > > > Add the HAVE_SOFTIRQ_ON_OWN_STACK feature for the IRQ_STACKS config. The > > irq and softirq use the same independent irq_stack of percpu by time > > division multiplexing. > > > > Tested-by: Jisheng Zhang <jszhang@kernel.org> > > Signed-off-by: Guo Ren <guoren@linux.alibaba.com> > > Signed-off-by: Guo Ren <guoren@kernel.org> > > --- > > arch/riscv/Kconfig | 7 ++++--- > > arch/riscv/kernel/irq.c | 33 +++++++++++++++++++++++++++++++++ > > 2 files changed, 37 insertions(+), 3 deletions(-) > > > > diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig > > index 0a9d4bdc0338..bd4c4ae4cdc9 100644 > > --- a/arch/riscv/Kconfig > > +++ b/arch/riscv/Kconfig > > @@ -447,12 +447,13 @@ config FPU > > If you don't know what to do here, say Y. > > > > config IRQ_STACKS > > - bool "Independent irq stacks" if EXPERT > > + bool "Independent irq & softirq stacks" if EXPERT > > default y > > select HAVE_IRQ_EXIT_ON_IRQ_STACK > > + select HAVE_SOFTIRQ_ON_OWN_STACK > > HAVE_IRQ_EXIT_ON_IRQ_STACK is used by softirq.c Shouldn't that be > selected introduced in this patch, instead of the previous one? This patch depends on the previous one. And the previous one could work separately. > > > help > > - Add independent irq stacks for percpu to prevent kernel stack overflows. > > - We may save some memory footprint by disabling IRQ_STACKS. > > + Add independent irq & softirq stacks for percpu to prevent kernel stack > > + overflows. We may save some memory footprint by disabling IRQ_STACKS. > > Same comment from previous patch. Please use the same wording/config as > other archs. > > > endmenu # "Platform type" > > > > diff --git a/arch/riscv/kernel/irq.c b/arch/riscv/kernel/irq.c > > index 5d77f692b198..a6406da34937 100644 > > --- a/arch/riscv/kernel/irq.c > > +++ b/arch/riscv/kernel/irq.c > > @@ -11,6 +11,7 @@ > > #include <linux/seq_file.h> > > #include <asm/smp.h> > > #include <asm/vmap_stack.h> > > +#include <asm/softirq_stack.h> > > > > #ifdef CONFIG_IRQ_STACKS > > static DEFINE_PER_CPU(ulong *, irq_stack_ptr); > > @@ -38,6 +39,38 @@ static void init_irq_stacks(void) > > per_cpu(irq_stack_ptr, cpu) = per_cpu(irq_stack, cpu); > > } > > #endif /* CONFIG_VMAP_STACK */ > > + > > +#ifdef CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK > > +void do_softirq_own_stack(void) > > +{ > > +#ifdef CONFIG_IRQ_STACKS > > + if (on_thread_stack()) { > > + ulong *sp = per_cpu(irq_stack_ptr, smp_processor_id()) > > + + IRQ_STACK_SIZE/sizeof(ulong); > > + __asm__ __volatile( > > + "addi sp, sp, -"RISCV_SZPTR "\n" > > + REG_S" ra, (sp) \n" > > + "addi sp, sp, -"RISCV_SZPTR "\n" > > + REG_S" s0, (sp) \n" > > + "addi s0, sp, 2*"RISCV_SZPTR "\n" > > + "move sp, %[sp] \n" > > + "call __do_softirq \n" > > + "addi sp, s0, -2*"RISCV_SZPTR"\n" > > + REG_L" s0, (sp) \n" > > + "addi sp, sp, "RISCV_SZPTR "\n" > > + REG_L" ra, (sp) \n" > > + "addi sp, sp, "RISCV_SZPTR "\n" > > + : > > + : [sp] "r" (sp) > > + : "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", > > + "t0", "t1", "t2", "t3", "t4", "t5", "t6", > > + "memory"); > > Same as previous patch. Please avoid C&P and have a look at how > call_on_stack is done on x86. Okay. > > > Björn
Guo Ren <guoren@kernel.org> writes: > On Thu, Dec 8, 2022 at 6:12 PM Björn Töpel <bjorn@kernel.org> wrote: >> >> guoren@kernel.org writes: >> >> > From: Guo Ren <guoren@linux.alibaba.com> >> > >> > Add the HAVE_SOFTIRQ_ON_OWN_STACK feature for the IRQ_STACKS config. The >> > irq and softirq use the same independent irq_stack of percpu by time >> > division multiplexing. >> > >> > Tested-by: Jisheng Zhang <jszhang@kernel.org> >> > Signed-off-by: Guo Ren <guoren@linux.alibaba.com> >> > Signed-off-by: Guo Ren <guoren@kernel.org> >> > --- >> > arch/riscv/Kconfig | 7 ++++--- >> > arch/riscv/kernel/irq.c | 33 +++++++++++++++++++++++++++++++++ >> > 2 files changed, 37 insertions(+), 3 deletions(-) >> > >> > diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig >> > index 0a9d4bdc0338..bd4c4ae4cdc9 100644 >> > --- a/arch/riscv/Kconfig >> > +++ b/arch/riscv/Kconfig >> > @@ -447,12 +447,13 @@ config FPU >> > If you don't know what to do here, say Y. >> > >> > config IRQ_STACKS >> > - bool "Independent irq stacks" if EXPERT >> > + bool "Independent irq & softirq stacks" if EXPERT >> > default y >> > select HAVE_IRQ_EXIT_ON_IRQ_STACK >> > + select HAVE_SOFTIRQ_ON_OWN_STACK >> >> HAVE_IRQ_EXIT_ON_IRQ_STACK is used by softirq.c Shouldn't that be >> selected introduced in this patch, instead of the previous one? > This patch depends on the previous one. And the previous one could > work separately. Let me try to be more clear: IRQ_STACKS should be introduced in the previous patch, which adds per-cpu stacks to hardirq. This patch adds per-cpu stacks for softirq, and the softirq related selects: select HAVE_IRQ_EXIT_ON_IRQ_STACK select HAVE_SOFTIRQ_ON_OWN_STACK Hence, the "HAVE_IRQ_EXIT_ON_IRQ_STACK" select should be part of *this* patch, not the previous. Or am I missing something? Björn
On Fri, Dec 9, 2022 at 3:50 PM Björn Töpel <bjorn@kernel.org> wrote: > > Guo Ren <guoren@kernel.org> writes: > > > On Thu, Dec 8, 2022 at 6:12 PM Björn Töpel <bjorn@kernel.org> wrote: > >> > >> guoren@kernel.org writes: > >> > >> > From: Guo Ren <guoren@linux.alibaba.com> > >> > > >> > Add the HAVE_SOFTIRQ_ON_OWN_STACK feature for the IRQ_STACKS config. The > >> > irq and softirq use the same independent irq_stack of percpu by time > >> > division multiplexing. > >> > > >> > Tested-by: Jisheng Zhang <jszhang@kernel.org> > >> > Signed-off-by: Guo Ren <guoren@linux.alibaba.com> > >> > Signed-off-by: Guo Ren <guoren@kernel.org> > >> > --- > >> > arch/riscv/Kconfig | 7 ++++--- > >> > arch/riscv/kernel/irq.c | 33 +++++++++++++++++++++++++++++++++ > >> > 2 files changed, 37 insertions(+), 3 deletions(-) > >> > > >> > diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig > >> > index 0a9d4bdc0338..bd4c4ae4cdc9 100644 > >> > --- a/arch/riscv/Kconfig > >> > +++ b/arch/riscv/Kconfig > >> > @@ -447,12 +447,13 @@ config FPU > >> > If you don't know what to do here, say Y. > >> > > >> > config IRQ_STACKS > >> > - bool "Independent irq stacks" if EXPERT > >> > + bool "Independent irq & softirq stacks" if EXPERT > >> > default y > >> > select HAVE_IRQ_EXIT_ON_IRQ_STACK > >> > + select HAVE_SOFTIRQ_ON_OWN_STACK > >> > >> HAVE_IRQ_EXIT_ON_IRQ_STACK is used by softirq.c Shouldn't that be > >> selected introduced in this patch, instead of the previous one? > > This patch depends on the previous one. And the previous one could > > work separately. > > Let me try to be more clear: IRQ_STACKS should be introduced in the > previous patch, which adds per-cpu stacks to hardirq. This patch adds > per-cpu stacks for softirq, and the softirq related selects: > > select HAVE_IRQ_EXIT_ON_IRQ_STACK > select HAVE_SOFTIRQ_ON_OWN_STACK > > Hence, the "HAVE_IRQ_EXIT_ON_IRQ_STACK" select should be part of *this* > patch, not the previous. > > Or am I missing something? You are right, HAVE_IRQ_EXIT_ON_IRQ_STACK is belong to SOFTIRQ: static inline void invoke_softirq(void) { ... if (!force_irqthreads() || !__this_cpu_read(ksoftirqd)) { #ifdef CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK ... __do_softirq(); #else ... do_softirq_own_stack(); #endif ... } I would fix that in the next version. > > > Björn
diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig index 0a9d4bdc0338..bd4c4ae4cdc9 100644 --- a/arch/riscv/Kconfig +++ b/arch/riscv/Kconfig @@ -447,12 +447,13 @@ config FPU If you don't know what to do here, say Y. config IRQ_STACKS - bool "Independent irq stacks" if EXPERT + bool "Independent irq & softirq stacks" if EXPERT default y select HAVE_IRQ_EXIT_ON_IRQ_STACK + select HAVE_SOFTIRQ_ON_OWN_STACK help - Add independent irq stacks for percpu to prevent kernel stack overflows. - We may save some memory footprint by disabling IRQ_STACKS. + Add independent irq & softirq stacks for percpu to prevent kernel stack + overflows. We may save some memory footprint by disabling IRQ_STACKS. endmenu # "Platform type" diff --git a/arch/riscv/kernel/irq.c b/arch/riscv/kernel/irq.c index 5d77f692b198..a6406da34937 100644 --- a/arch/riscv/kernel/irq.c +++ b/arch/riscv/kernel/irq.c @@ -11,6 +11,7 @@ #include <linux/seq_file.h> #include <asm/smp.h> #include <asm/vmap_stack.h> +#include <asm/softirq_stack.h> #ifdef CONFIG_IRQ_STACKS static DEFINE_PER_CPU(ulong *, irq_stack_ptr); @@ -38,6 +39,38 @@ static void init_irq_stacks(void) per_cpu(irq_stack_ptr, cpu) = per_cpu(irq_stack, cpu); } #endif /* CONFIG_VMAP_STACK */ + +#ifdef CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK +void do_softirq_own_stack(void) +{ +#ifdef CONFIG_IRQ_STACKS + if (on_thread_stack()) { + ulong *sp = per_cpu(irq_stack_ptr, smp_processor_id()) + + IRQ_STACK_SIZE/sizeof(ulong); + __asm__ __volatile( + "addi sp, sp, -"RISCV_SZPTR "\n" + REG_S" ra, (sp) \n" + "addi sp, sp, -"RISCV_SZPTR "\n" + REG_S" s0, (sp) \n" + "addi s0, sp, 2*"RISCV_SZPTR "\n" + "move sp, %[sp] \n" + "call __do_softirq \n" + "addi sp, s0, -2*"RISCV_SZPTR"\n" + REG_L" s0, (sp) \n" + "addi sp, sp, "RISCV_SZPTR "\n" + REG_L" ra, (sp) \n" + "addi sp, sp, "RISCV_SZPTR "\n" + : + : [sp] "r" (sp) + : "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", + "t0", "t1", "t2", "t3", "t4", "t5", "t6", + "memory"); + } else +#endif + __do_softirq(); +} +#endif /* CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK */ + #else static void init_irq_stacks(void) {} #endif /* CONFIG_IRQ_STACKS */