[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAK8P3a0dNbwyJm3Zq-H6MQDrEcTA+wu01VvSHtFVyBT2NtMRCQ@mail.gmail.com>
Date: Mon, 23 May 2022 10:16:56 +0200
From: Arnd Bergmann <arnd@...db.de>
To: Jisheng Zhang <jszhang@...nel.org>
Cc: Arnd Bergmann <arnd@...db.de>,
Paul Walmsley <paul.walmsley@...ive.com>,
Palmer Dabbelt <palmer@...belt.com>,
Albert Ou <aou@...s.berkeley.edu>,
linux-riscv <linux-riscv@...ts.infradead.org>,
Linux Kernel Mailing List <linux-kernel@...r.kernel.org>
Subject: Re: [PATCH v2] riscv: add irq stack support
On Sun, May 15, 2022 at 7:14 AM Jisheng Zhang <jszhang@...nel.org> wrote:
> On Mon, Mar 07, 2022 at 08:19:35PM +0100, Arnd Bergmann wrote:
> > On Mon, Mar 7, 2022 at 3:08 PM Jisheng Zhang <jszhang@...nel.org> wrote:
> > > +2:
> >
> > What is the benefit of doing this in assembler? Is it measurably faster?
> >
> > I see that arm64 does the same thing in C code, and it would be best to
> > have a common implementation for doing this, in terms of maintainability.
> >
>
> Sorry for delay. The assembler code is mainly to cal the stack ptr then
> change the SP to use the stack, which equals to arm64 call_on_irq_stack()
> which is implemented in assembler too.
I understand that you need to be in asm code to switch the stack, it
just felt that the arm64 method is a bit easier to debug here.
I suppose being able to keep using generic_handle_arch_irq() is also
beneficial, so it doesn't make much difference either way.
> > > + for_each_possible_cpu(cpu) {
> > > +#ifdef CONFIG_VMAP_STACK
> > > + void *s = __vmalloc_node(IRQ_STACK_SIZE, THREAD_ALIGN,
> > > + THREADINFO_GFP, cpu_to_node(cpu),
> > > + __builtin_return_address(0));
> > > +#else
> > > + void *s = (void *)__get_free_pages(GFP_KERNEL, get_order(IRQ_STACK_SIZE));
> > > +#endif
> >
> > On a related topic: is there a reason to still keep the non-VMAP_STACK
>
> irq stack is 16KB on RV64 now, vmalloc doesn't gurantee physical
> continuous pages, I want to keep the stack physical continuous
> characteristic for !VMAP_STACK case.
I don't understand. What is the benefit of having a physically continuous
stack? If this is required for something, you could still get that with a VMAP
stack by using alloc_pages() to allocate the stack and them using vmap() to
put it into the vmalloc range with appropriate guard pages.
I think we really want to avoid the case of missing guard pages around
the stack, and eliminate the part where the stack is in the linear map.
Arnd
Powered by blists - more mailing lists