From: Matthew Wilcox <willy@infradead.org> To: linux-mm@kvack.org Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org>, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Will Deacon <will@kernel.org>, Catalin Marinas <catalin.marinas@arm.com>, Russell King <linux@armlinux.org.uk>, Geert Uytterhoeven <geert@linux-m68k.org>, linux-m68k@lists.linux-m68k.org Subject: [PATCH 3/7] arm: Thread mm_struct throughout page table allocation Date: Tue, 28 Apr 2020 12:44:45 -0700 [thread overview] Message-ID: <20200428194449.22615-4-willy@infradead.org> (raw) In-Reply-To: <20200428194449.22615-1-willy@infradead.org> From: "Matthew Wilcox (Oracle)" <willy@infradead.org> An upcoming patch will pass mm_struct to the page table constructor. Make sure ARM has the appropriate mm_struct at the point it needs to call the constructor. Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> --- arch/arm/mm/mmu.c | 64 +++++++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index ec8d0008bfa1..e5275bfbe695 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c @@ -690,7 +690,9 @@ EXPORT_SYMBOL(phys_mem_access_prot); #define vectors_base() (vectors_high() ? 0xffff0000 : 0) -static void __init *early_alloc(unsigned long sz) +typedef void *(arm_pt_alloc_t)(unsigned long size, struct mm_struct *); + +static void __init *early_alloc(unsigned long sz, struct mm_struct *mm) { void *ptr = memblock_alloc(sz, sz); @@ -701,7 +703,7 @@ static void __init *early_alloc(unsigned long sz) return ptr; } -static void *__init late_alloc(unsigned long sz) +static void *__init late_alloc(unsigned long sz, struct mm_struct *mm) { void *ptr = (void *)__get_free_pages(GFP_PGTABLE_KERNEL, get_order(sz)); @@ -710,31 +712,30 @@ static void *__init late_alloc(unsigned long sz) return ptr; } -static pte_t * __init arm_pte_alloc(pmd_t *pmd, unsigned long addr, - unsigned long prot, - void *(*alloc)(unsigned long sz)) +static pte_t * __init arm_pte_alloc(struct mm_struct *mm, pmd_t *pmd, + unsigned long addr, unsigned long prot, + arm_pt_alloc_t alloc) { if (pmd_none(*pmd)) { - pte_t *pte = alloc(PTE_HWTABLE_OFF + PTE_HWTABLE_SIZE); + pte_t *pte = alloc(PTE_HWTABLE_OFF + PTE_HWTABLE_SIZE, mm); __pmd_populate(pmd, __pa(pte), prot); } BUG_ON(pmd_bad(*pmd)); return pte_offset_kernel(pmd, addr); } -static pte_t * __init early_pte_alloc(pmd_t *pmd, unsigned long addr, - unsigned long prot) +static pte_t * __init early_pte_alloc(struct mm_struct *mm, pmd_t *pmd, + unsigned long addr, unsigned long prot) { - return arm_pte_alloc(pmd, addr, prot, early_alloc); + return arm_pte_alloc(mm, pmd, addr, prot, early_alloc); } -static void __init alloc_init_pte(pmd_t *pmd, unsigned long addr, - unsigned long end, unsigned long pfn, - const struct mem_type *type, - void *(*alloc)(unsigned long sz), - bool ng) +static void __init alloc_init_pte(struct mm_struct *mm, pmd_t *pmd, + unsigned long addr, unsigned long end, + unsigned long pfn, const struct mem_type *type, + arm_pt_alloc_t alloc, bool ng) { - pte_t *pte = arm_pte_alloc(pmd, addr, type->prot_l1, alloc); + pte_t *pte = arm_pte_alloc(mm, pmd, addr, type->prot_l1, alloc); do { set_pte_ext(pte, pfn_pte(pfn, __pgprot(type->prot_pte)), ng ? PTE_EXT_NG : 0); @@ -769,10 +770,10 @@ static void __init __map_init_section(pmd_t *pmd, unsigned long addr, flush_pmd_entry(p); } -static void __init alloc_init_pmd(pud_t *pud, unsigned long addr, - unsigned long end, phys_addr_t phys, - const struct mem_type *type, - void *(*alloc)(unsigned long sz), bool ng) +static void __init alloc_init_pmd(struct mm_struct *mm, pud_t *pud, + unsigned long addr, unsigned long end, + phys_addr_t phys, const struct mem_type *type, + arm_pt_alloc_t alloc, bool ng) { pmd_t *pmd = pmd_offset(pud, addr); unsigned long next; @@ -792,7 +793,7 @@ static void __init alloc_init_pmd(pud_t *pud, unsigned long addr, ((addr | next | phys) & ~SECTION_MASK) == 0) { __map_init_section(pmd, addr, next, phys, type, ng); } else { - alloc_init_pte(pmd, addr, next, + alloc_init_pte(mm, pmd, addr, next, __phys_to_pfn(phys), type, alloc, ng); } @@ -801,17 +802,17 @@ static void __init alloc_init_pmd(pud_t *pud, unsigned long addr, } while (pmd++, addr = next, addr != end); } -static void __init alloc_init_pud(pgd_t *pgd, unsigned long addr, - unsigned long end, phys_addr_t phys, - const struct mem_type *type, - void *(*alloc)(unsigned long sz), bool ng) +static void __init alloc_init_pud(struct mm_struct *mm, pgd_t *pgd, + unsigned long addr, unsigned long end, + phys_addr_t phys, const struct mem_type *type, + arm_pt_alloc_t alloc, bool ng) { pud_t *pud = pud_offset(pgd, addr); unsigned long next; do { next = pud_addr_end(addr, end); - alloc_init_pmd(pud, addr, next, phys, type, alloc, ng); + alloc_init_pmd(mm, pud, addr, next, phys, type, alloc, ng); phys += next - addr; } while (pud++, addr = next, addr != end); } @@ -879,8 +880,7 @@ static void __init create_36bit_mapping(struct mm_struct *mm, #endif /* !CONFIG_ARM_LPAE */ static void __init __create_mapping(struct mm_struct *mm, struct map_desc *md, - void *(*alloc)(unsigned long sz), - bool ng) + arm_pt_alloc_t alloc, bool ng) { unsigned long addr, length, end; phys_addr_t phys; @@ -914,7 +914,7 @@ static void __init __create_mapping(struct mm_struct *mm, struct map_desc *md, do { unsigned long next = pgd_addr_end(addr, end); - alloc_init_pud(pgd, addr, next, phys, type, alloc, ng); + alloc_init_pud(mm, pgd, addr, next, phys, type, alloc, ng); phys += next - addr; addr = next; @@ -1316,7 +1316,7 @@ static void __init devicemaps_init(const struct machine_desc *mdesc) /* * Allocate the vector page early. */ - vectors = early_alloc(PAGE_SIZE * 2); + vectors = early_alloc(PAGE_SIZE * 2, &init_mm); early_trap_init(vectors); @@ -1413,11 +1413,11 @@ static void __init devicemaps_init(const struct machine_desc *mdesc) static void __init kmap_init(void) { #ifdef CONFIG_HIGHMEM - pkmap_page_table = early_pte_alloc(pmd_off_k(PKMAP_BASE), + pkmap_page_table = early_pte_alloc(&init_mm, pmd_off_k(PKMAP_BASE), PKMAP_BASE, _PAGE_KERNEL_TABLE); #endif - early_pte_alloc(pmd_off_k(FIXADDR_START), FIXADDR_START, + early_pte_alloc(&init_mm, pmd_off_k(FIXADDR_START), FIXADDR_START, _PAGE_KERNEL_TABLE); } @@ -1630,7 +1630,7 @@ void __init paging_init(const struct machine_desc *mdesc) top_pmd = pmd_off_k(0xffff0000); /* allocate the zero page. */ - zero_page = early_alloc(PAGE_SIZE); + zero_page = early_alloc(PAGE_SIZE, &init_mm); bootmem_init(); -- 2.26.2
WARNING: multiple messages have this Message-ID (diff)
From: Matthew Wilcox <willy@infradead.org> To: linux-mm@kvack.org Cc: Catalin Marinas <catalin.marinas@arm.com>, linux-kernel@vger.kernel.org, "Matthew Wilcox \(Oracle\)" <willy@infradead.org>, Russell King <linux@armlinux.org.uk>, linux-m68k@lists.linux-m68k.org, Geert Uytterhoeven <geert@linux-m68k.org>, Will Deacon <will@kernel.org>, linux-arm-kernel@lists.infradead.org Subject: [PATCH 3/7] arm: Thread mm_struct throughout page table allocation Date: Tue, 28 Apr 2020 12:44:45 -0700 [thread overview] Message-ID: <20200428194449.22615-4-willy@infradead.org> (raw) In-Reply-To: <20200428194449.22615-1-willy@infradead.org> From: "Matthew Wilcox (Oracle)" <willy@infradead.org> An upcoming patch will pass mm_struct to the page table constructor. Make sure ARM has the appropriate mm_struct at the point it needs to call the constructor. Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> --- arch/arm/mm/mmu.c | 64 +++++++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index ec8d0008bfa1..e5275bfbe695 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c @@ -690,7 +690,9 @@ EXPORT_SYMBOL(phys_mem_access_prot); #define vectors_base() (vectors_high() ? 0xffff0000 : 0) -static void __init *early_alloc(unsigned long sz) +typedef void *(arm_pt_alloc_t)(unsigned long size, struct mm_struct *); + +static void __init *early_alloc(unsigned long sz, struct mm_struct *mm) { void *ptr = memblock_alloc(sz, sz); @@ -701,7 +703,7 @@ static void __init *early_alloc(unsigned long sz) return ptr; } -static void *__init late_alloc(unsigned long sz) +static void *__init late_alloc(unsigned long sz, struct mm_struct *mm) { void *ptr = (void *)__get_free_pages(GFP_PGTABLE_KERNEL, get_order(sz)); @@ -710,31 +712,30 @@ static void *__init late_alloc(unsigned long sz) return ptr; } -static pte_t * __init arm_pte_alloc(pmd_t *pmd, unsigned long addr, - unsigned long prot, - void *(*alloc)(unsigned long sz)) +static pte_t * __init arm_pte_alloc(struct mm_struct *mm, pmd_t *pmd, + unsigned long addr, unsigned long prot, + arm_pt_alloc_t alloc) { if (pmd_none(*pmd)) { - pte_t *pte = alloc(PTE_HWTABLE_OFF + PTE_HWTABLE_SIZE); + pte_t *pte = alloc(PTE_HWTABLE_OFF + PTE_HWTABLE_SIZE, mm); __pmd_populate(pmd, __pa(pte), prot); } BUG_ON(pmd_bad(*pmd)); return pte_offset_kernel(pmd, addr); } -static pte_t * __init early_pte_alloc(pmd_t *pmd, unsigned long addr, - unsigned long prot) +static pte_t * __init early_pte_alloc(struct mm_struct *mm, pmd_t *pmd, + unsigned long addr, unsigned long prot) { - return arm_pte_alloc(pmd, addr, prot, early_alloc); + return arm_pte_alloc(mm, pmd, addr, prot, early_alloc); } -static void __init alloc_init_pte(pmd_t *pmd, unsigned long addr, - unsigned long end, unsigned long pfn, - const struct mem_type *type, - void *(*alloc)(unsigned long sz), - bool ng) +static void __init alloc_init_pte(struct mm_struct *mm, pmd_t *pmd, + unsigned long addr, unsigned long end, + unsigned long pfn, const struct mem_type *type, + arm_pt_alloc_t alloc, bool ng) { - pte_t *pte = arm_pte_alloc(pmd, addr, type->prot_l1, alloc); + pte_t *pte = arm_pte_alloc(mm, pmd, addr, type->prot_l1, alloc); do { set_pte_ext(pte, pfn_pte(pfn, __pgprot(type->prot_pte)), ng ? PTE_EXT_NG : 0); @@ -769,10 +770,10 @@ static void __init __map_init_section(pmd_t *pmd, unsigned long addr, flush_pmd_entry(p); } -static void __init alloc_init_pmd(pud_t *pud, unsigned long addr, - unsigned long end, phys_addr_t phys, - const struct mem_type *type, - void *(*alloc)(unsigned long sz), bool ng) +static void __init alloc_init_pmd(struct mm_struct *mm, pud_t *pud, + unsigned long addr, unsigned long end, + phys_addr_t phys, const struct mem_type *type, + arm_pt_alloc_t alloc, bool ng) { pmd_t *pmd = pmd_offset(pud, addr); unsigned long next; @@ -792,7 +793,7 @@ static void __init alloc_init_pmd(pud_t *pud, unsigned long addr, ((addr | next | phys) & ~SECTION_MASK) == 0) { __map_init_section(pmd, addr, next, phys, type, ng); } else { - alloc_init_pte(pmd, addr, next, + alloc_init_pte(mm, pmd, addr, next, __phys_to_pfn(phys), type, alloc, ng); } @@ -801,17 +802,17 @@ static void __init alloc_init_pmd(pud_t *pud, unsigned long addr, } while (pmd++, addr = next, addr != end); } -static void __init alloc_init_pud(pgd_t *pgd, unsigned long addr, - unsigned long end, phys_addr_t phys, - const struct mem_type *type, - void *(*alloc)(unsigned long sz), bool ng) +static void __init alloc_init_pud(struct mm_struct *mm, pgd_t *pgd, + unsigned long addr, unsigned long end, + phys_addr_t phys, const struct mem_type *type, + arm_pt_alloc_t alloc, bool ng) { pud_t *pud = pud_offset(pgd, addr); unsigned long next; do { next = pud_addr_end(addr, end); - alloc_init_pmd(pud, addr, next, phys, type, alloc, ng); + alloc_init_pmd(mm, pud, addr, next, phys, type, alloc, ng); phys += next - addr; } while (pud++, addr = next, addr != end); } @@ -879,8 +880,7 @@ static void __init create_36bit_mapping(struct mm_struct *mm, #endif /* !CONFIG_ARM_LPAE */ static void __init __create_mapping(struct mm_struct *mm, struct map_desc *md, - void *(*alloc)(unsigned long sz), - bool ng) + arm_pt_alloc_t alloc, bool ng) { unsigned long addr, length, end; phys_addr_t phys; @@ -914,7 +914,7 @@ static void __init __create_mapping(struct mm_struct *mm, struct map_desc *md, do { unsigned long next = pgd_addr_end(addr, end); - alloc_init_pud(pgd, addr, next, phys, type, alloc, ng); + alloc_init_pud(mm, pgd, addr, next, phys, type, alloc, ng); phys += next - addr; addr = next; @@ -1316,7 +1316,7 @@ static void __init devicemaps_init(const struct machine_desc *mdesc) /* * Allocate the vector page early. */ - vectors = early_alloc(PAGE_SIZE * 2); + vectors = early_alloc(PAGE_SIZE * 2, &init_mm); early_trap_init(vectors); @@ -1413,11 +1413,11 @@ static void __init devicemaps_init(const struct machine_desc *mdesc) static void __init kmap_init(void) { #ifdef CONFIG_HIGHMEM - pkmap_page_table = early_pte_alloc(pmd_off_k(PKMAP_BASE), + pkmap_page_table = early_pte_alloc(&init_mm, pmd_off_k(PKMAP_BASE), PKMAP_BASE, _PAGE_KERNEL_TABLE); #endif - early_pte_alloc(pmd_off_k(FIXADDR_START), FIXADDR_START, + early_pte_alloc(&init_mm, pmd_off_k(FIXADDR_START), FIXADDR_START, _PAGE_KERNEL_TABLE); } @@ -1630,7 +1630,7 @@ void __init paging_init(const struct machine_desc *mdesc) top_pmd = pmd_off_k(0xffff0000); /* allocate the zero page. */ - zero_page = early_alloc(PAGE_SIZE); + zero_page = early_alloc(PAGE_SIZE, &init_mm); bootmem_init(); -- 2.26.2 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2020-04-28 19:45 UTC|newest] Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-04-28 19:44 [PATCH 0/7] Record the mm_struct in the page table pages Matthew Wilcox 2020-04-28 19:44 ` Matthew Wilcox 2020-04-28 19:44 ` [PATCH 1/7] mm: Document x86 uses a linked list of pgds Matthew Wilcox 2020-04-28 19:44 ` Matthew Wilcox 2020-04-28 21:41 ` Ira Weiny 2020-04-28 21:41 ` Ira Weiny 2020-04-28 22:52 ` Matthew Wilcox 2020-04-28 22:52 ` Matthew Wilcox 2020-04-29 18:29 ` Ira Weiny 2020-04-29 18:29 ` Ira Weiny 2020-04-28 19:44 ` [PATCH 2/7] mm: Move pt_mm within struct page Matthew Wilcox 2020-04-28 19:44 ` Matthew Wilcox 2020-04-29 7:34 ` Geert Uytterhoeven 2020-04-29 7:34 ` Geert Uytterhoeven 2020-04-29 7:34 ` Geert Uytterhoeven 2020-04-29 12:53 ` Matthew Wilcox 2020-04-29 12:53 ` Matthew Wilcox 2020-04-28 19:44 ` Matthew Wilcox [this message] 2020-04-28 19:44 ` [PATCH 3/7] arm: Thread mm_struct throughout page table allocation Matthew Wilcox 2020-04-28 19:44 ` [PATCH 4/7] arm64: " Matthew Wilcox 2020-04-28 19:44 ` Matthew Wilcox 2020-04-29 9:58 ` Mark Rutland 2020-04-29 9:58 ` Mark Rutland 2020-04-28 19:44 ` [PATCH 5/7] m68k: " Matthew Wilcox 2020-04-28 19:44 ` Matthew Wilcox 2020-04-29 7:44 ` Geert Uytterhoeven 2020-04-29 7:44 ` Geert Uytterhoeven 2020-04-29 7:44 ` Geert Uytterhoeven 2020-04-28 19:44 ` [PATCH 6/7] mm: Set pt_mm in PTE constructor Matthew Wilcox 2020-04-28 19:44 ` Matthew Wilcox 2020-04-29 7:46 ` Geert Uytterhoeven 2020-04-29 7:46 ` Geert Uytterhoeven 2020-04-29 7:46 ` Geert Uytterhoeven 2020-04-28 19:44 ` [PATCH 7/7] mm: Set pt_mm in PMD constructor Matthew Wilcox 2020-04-28 19:44 ` Matthew Wilcox 2020-04-29 0:52 ` Kirill A. Shutemov 2020-04-29 0:52 ` Kirill A. Shutemov 2020-04-29 0:26 ` [PATCH 0/7] Record the mm_struct in the page table pages Kirill A. Shutemov 2020-04-29 0:26 ` Kirill A. Shutemov 2020-04-29 1:51 ` Matthew Wilcox 2020-04-29 1:51 ` Matthew Wilcox 2020-05-24 7:42 ` Mike Rapoport 2020-05-24 7:42 ` Mike Rapoport
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=20200428194449.22615-4-willy@infradead.org \ --to=willy@infradead.org \ --cc=catalin.marinas@arm.com \ --cc=geert@linux-m68k.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-m68k@lists.linux-m68k.org \ --cc=linux-mm@kvack.org \ --cc=linux@armlinux.org.uk \ --cc=will@kernel.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.