Messages in this thread | | | Date | Mon, 21 Sep 2015 10:25:39 +0100 | From | Catalin Marinas <> | Subject | Re: [PATCH v2] arm64: Introduce IRQ stack |
| |
On Sat, Sep 19, 2015 at 05:44:37PM +0900, Jungseok Lee wrote: > On Sep 19, 2015, at 12:31 AM, Catalin Marinas wrote: > > On Fri, Sep 18, 2015 at 04:03:02PM +0100, Catalin Marinas wrote: > >> On Fri, Sep 18, 2015 at 09:57:56PM +0900, Jungseok Lee wrote: > >>> On Sep 18, 2015, at 1:21 AM, Catalin Marinas wrote: > >>>> So, without any better suggestion for current_thread_info(), I'm giving > >>>> up the idea of using SPSel == 0 in the kernel. I'll look at your patch > >>>> in more detail. BTW, I don't think we need the any count for the irq > >>>> stack as we don't re-enter the same IRQ stack. [...] > >>> BTW, in this context, it is only meaningful to decide whether a current interrupt > >>> is re-enterrant or not. Its actual value is not important, but I could not figure > >>> out a better implementation than this one yet. Any suggestions are welcome! [...] > > Another thought (it seems that x86 does something similar): we know the > > IRQ stack is not re-entered until interrupts are enabled in > > __do_softirq. If we enable __ARCH_HAS_DO_SOFTIRQ, we can implement an > > arm64-specific do_softirq_own_stack() which increments a counter before > > calling __do_softirq. The difference from your patch is that > > irq_stack_entry only reads such counter, doesn't need to write it. > > > > Yet another idea is to reserve some space in the lower address part of > > the stack with a "stack type" information. It still requires another > > read, so I think the x86 approach is probably better. > > I've realized both hardirq and softirq should be handled on a separate stack > in order to reduce kernel stack size, which is a principal objective of this > patch.
The objective is to reduce the kernel thread stack size (THREAD_SIZE). This can get pretty deep on some syscalls and together with IRQs (hard or soft), we run out of stack.
So, for now, just stick to reducing THREAD_SIZE by moving the IRQs off this stack. If we later find that hardirqs + softirqs can't fit on the same _IRQ_ stack, we could either increase it or allocate separate stack for softirqs. These are static anyway, allocated during boot. But I wouldn't get distracted with separate hard and soft IRQ stacks for now, I doubt we would see any issues (when a softirq runs, the IRQ stack is pretty much empty, apart from the pt_regs).
> (If I'm not missing something) It is not possible to get a big win > with implementing do_softirq_own_stack() since hardirq is handled using a task > stack. This prevents a size of kernel stack from being decreased.
What I meant is that hard and soft IRQs both run on the IRQ stack (not the thread stack). But instead of incrementing a counter every time you take a hard IRQ, just increment it in do_softirq_own_stack() with a simple read+check in elX_irq. The "own_stack" is not the most appropriate name because we still have the same IRQ stack but I'm not really bothered about this.
> However, it would be meaningful to separate hard IRQ stack and soft IRQ one > as the next step.
Only if we see IRQ stack overflowing, otherwise I don't think it's worth the effort.
-- Catalin
| |