From: Rolf Eike Beer <eike-kernel@sf-tec.de>
To: John David Anglin <dave.anglin@bell.net>,
linux-parisc@vger.kernel.org, Helge Deller <deller@gmx.de>
Cc: Matthew Wilcox <willy@infradead.org>
Subject: Re: [PATCH] parisc: Optimize per-pagetable spinlocks (v11)
Date: Thu, 28 Jan 2021 09:36:01 +0100 [thread overview]
Message-ID: <2053670.irdbgypaU6@eto.sf-tec.de> (raw)
In-Reply-To: <20210127211851.GA32689@ls3530.fritz.box>
[-- Attachment #1: Type: text/plain, Size: 4603 bytes --]
Am Mittwoch, 27. Januar 2021, 22:18:51 CET schrieb Helge Deller:
> On parisc a spinlock is stored in the next page behind the pgd which
> protects against parallel accesses to the pgd. That's why one additional
> page (PGD_ALLOC_ORDER) is allocated for the pgd.
>
> Matthew Wilcox suggested that we instead should use a pointer in the
> struct page table for this spinlock and noted, that the comments for the
> PGD_ORDER and PMD_ORDER defines were wrong.
>
> Both suggestions are addressed in this patch. The pgd spinlock
> (parisc_pgd_lock) is stored in the struct page table. In
> switch_mm_irqs_off() the physical address of this lock is loaded into
> cr28 (tr4) and the pgd into cr25, so that the fault handlers can
> directly access the lock.
>
> The currently implemened Hybrid L2/L3 page table scheme (where the pmd
> is adjacent to the pgd) is dropped now too.
>
> Suggested-by: Matthew Wilcox <willy@infradead.org>
> Fixes: b37d1c1898b2 ("parisc: Use per-pagetable spinlock")
> Signed-off-by: Helge Deller <deller@gmx.de>
> Signed-off-by: John David Anglin <dave.anglin@bell.net>
>
> diff --git a/arch/parisc/include/asm/mmu_context.h
> b/arch/parisc/include/asm/mmu_context.h index 46f8c22c5977..3e02b1f75e54
> 100644
> --- a/arch/parisc/include/asm/mmu_context.h
> +++ b/arch/parisc/include/asm/mmu_context.h
> @@ -5,6 +5,7 @@
> #include <linux/mm.h>
> #include <linux/sched.h>
> #include <linux/atomic.h>
> +#include <linux/spinlock.h>
> #include <asm-generic/mm_hooks.h>
>
> /* on PA-RISC, we actually have enough contexts to justify an allocator
> @@ -50,6 +51,14 @@ static inline void switch_mm_irqs_off(struct mm_struct
> *prev, struct mm_struct *next, struct task_struct *tsk)
> {
> if (prev != next) {
> +#ifdef CONFIG_SMP
> + /* phys address of tlb lock in cr28 (tr4) for TLB faults
*/
> + struct page *page;
> +
> + page = virt_to_page((unsigned long) next->pgd);
This is one of the few cases you have a space after the cast.
Another one is in pgd_alloc():
>+ page = virt_to_page((unsigned long) pgd);
> diff --git a/arch/parisc/include/asm/pgalloc.h
> b/arch/parisc/include/asm/pgalloc.h index a6482b2ce0ea..9c1a54543c87 100644
> --- a/arch/parisc/include/asm/pgalloc.h
> +++ b/arch/parisc/include/asm/pgalloc.h
> @@ -68,43 +66,27 @@ static inline void pud_populate(struct mm_struct *mm,
> pud_t *pud, pmd_t *pmd) (__u32)(__pa((unsigned long)pmd) >>
> PxD_VALUE_SHIFT)));
> }
>
> -static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long
> address)
> +static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned
> long addr)
Does that change add benefit?
> {
> - return (pmd_t *)__get_free_pages(GFP_PGTABLE_KERNEL, PMD_ORDER);
> + pmd_t *pmd;
> +
> + pmd = (pmd_t *)__get_free_pages(GFP_PGTABLE_KERNEL, PMD_ORDER);
> + if (pmd)
Maybe annotate that as likely() as it was in pgd_alloc() before?
> + memset ((void *)pmd, 0, PAGE_SIZE << PMD_ORDER);
> + return pmd;
> }
> diff --git a/arch/parisc/include/asm/pgtable.h
> b/arch/parisc/include/asm/pgtable.h index 75cf84070fc9..c08c7b37e5f4 100644
> --- a/arch/parisc/include/asm/pgtable.h
> +++ b/arch/parisc/include/asm/pgtable.h
> @@ -94,10 +96,12 @@ static inline void purge_tlb_entries(struct mm_struct
> *mm, unsigned long addr) #define set_pte_at(mm, addr, ptep, pteval)
\
> do {
\
> unsigned long flags;
\
> - spin_lock_irqsave(pgd_spinlock((mm)->pgd), flags);\
> + spinlock_t *pgd_lock;
\
> + pgd_lock = pgd_spinlock((mm)->pgd); \
These should just fit into a single line.
> + spin_lock_irqsave(pgd_lock, flags); \
> set_pte(ptep, pteval);
\
> purge_tlb_entries(mm, addr);
\
> - spin_unlock_irqrestore(pgd_spinlock((mm)->pgd), flags);\
> + spin_unlock_irqrestore(pgd_lock, flags); \
> } while (0)
>
> #endif /* !__ASSEMBLY__ */
> diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c
> index 3ec633b11b54..4f3f180b0b20 100644
> --- a/arch/parisc/mm/init.c
> +++ b/arch/parisc/mm/init.c
> @@ -681,6 +681,24 @@ static void __init parisc_bootmem_free(void)
> free_area_init(max_zone_pfn);
> }
>
> +static void __init parisc_init_pgd_lock(void)
> +{
> + struct page *page;
> +
> + page = virt_to_page((unsigned long) &swapper_pg_dir);
Another space.
> + page->parisc_pgd_lock = &pa_swapper_pg_lock;
> +}
> +
> +#ifdef CONFIG_SMP
> +spinlock_t *pgd_spinlock(pgd_t *pgd)
> +{
> + struct page *page;
> +
> + page = virt_to_page((unsigned long) pgd);
> + return page->parisc_pgd_lock;
> +}
> +#endif
This is very simple, and I suspect it being called rather often. Wouldn't it
make sense to make it inline?
Eike
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 195 bytes --]
next prev parent reply other threads:[~2021-01-28 8:37 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <c696f95d-a5ba-1f73-fbe9-a5d3f25e79c0@bell.net>
[not found] ` <2786b971-254a-ae07-ea24-38e57bd29892@bell.net>
[not found] ` <d4751664-6627-920e-9c44-7f9b7e287431@bell.net>
[not found] ` <6fb36e0e-62f5-68c7-92ec-c6dd16841813@bell.net>
[not found] ` <44ee7e09-90e7-0766-f0e4-bde2d3cdc2ec@bell.net>
[not found] ` <5100eb80-975f-d77d-846a-5aabc25d0f95@bell.net>
[not found] ` <e023991b-ba2e-f6da-94fb-0988ad70e717@bell.net>
[not found] ` <9b9c6446-365f-9ca6-b89f-c330fca11952@bell.net>
[not found] ` <94210da5-5642-82ef-85ae-688e1c07473d@gmx.de>
[not found] ` <4f76001d-f050-286f-4b6f-790554583eea@bell.net>
2021-01-27 21:18 ` [PATCH] parisc: Optimize per-pagetable spinlocks (v11) Helge Deller
2021-01-28 8:36 ` Rolf Eike Beer [this message]
2021-01-28 15:24 ` [PATCH] parisc: Optimize per-pagetable spinlocks (v12) Helge Deller
2021-02-10 14:52 ` [PATCH] parisc: Optimize per-pagetable spinlocks (v11) Guenter Roeck
2021-02-10 17:23 ` Helge Deller
2021-02-10 18:57 ` John David Anglin
2021-02-11 1:20 ` Guenter Roeck
2021-02-11 14:38 ` John David Anglin
2021-02-11 21:51 ` Guenter Roeck
2021-02-11 22:16 ` John David Anglin
2021-02-11 23:12 ` Guenter Roeck
2021-02-11 23:14 ` Helge Deller
2021-02-11 23:22 ` Helge Deller
2021-02-11 23:23 ` John David Anglin
2021-02-11 23:34 ` John David Anglin
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=2053670.irdbgypaU6@eto.sf-tec.de \
--to=eike-kernel@sf-tec.de \
--cc=dave.anglin@bell.net \
--cc=deller@gmx.de \
--cc=linux-parisc@vger.kernel.org \
--cc=willy@infradead.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: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox