mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-24 11:34:50 +08:00
ca15ca406f
Patch series "mm: cleanup usage of <asm/pgalloc.h>" Most architectures have very similar versions of pXd_alloc_one() and pXd_free_one() for intermediate levels of page table. These patches add generic versions of these functions in <asm-generic/pgalloc.h> and enable use of the generic functions where appropriate. In addition, functions declared and defined in <asm/pgalloc.h> headers are used mostly by core mm and early mm initialization in arch and there is no actual reason to have the <asm/pgalloc.h> included all over the place. The first patch in this series removes unneeded includes of <asm/pgalloc.h> In the end it didn't work out as neatly as I hoped and moving pXd_alloc_track() definitions to <asm-generic/pgalloc.h> would require unnecessary changes to arches that have custom page table allocations, so I've decided to move lib/ioremap.c to mm/ and make pgalloc-track.h local to mm/. This patch (of 8): In most cases <asm/pgalloc.h> header is required only for allocations of page table memory. Most of the .c files that include that header do not use symbols declared in <asm/pgalloc.h> and do not require that header. As for the other header files that used to include <asm/pgalloc.h>, it is possible to move that include into the .c file that actually uses symbols from <asm/pgalloc.h> and drop the include from the header file. The process was somewhat automated using sed -i -E '/[<"]asm\/pgalloc\.h/d' \ $(grep -L -w -f /tmp/xx \ $(git grep -E -l '[<"]asm/pgalloc\.h')) where /tmp/xx contains all the symbols defined in arch/*/include/asm/pgalloc.h. [rppt@linux.ibm.com: fix powerpc warning] Signed-off-by: Mike Rapoport <rppt@linux.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Reviewed-by: Pekka Enberg <penberg@kernel.org> Acked-by: Geert Uytterhoeven <geert@linux-m68k.org> [m68k] Cc: Abdul Haleem <abdhalee@linux.vnet.ibm.com> Cc: Andy Lutomirski <luto@kernel.org> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Christophe Leroy <christophe.leroy@csgroup.eu> Cc: Joerg Roedel <joro@8bytes.org> Cc: Max Filippov <jcmvbkbc@gmail.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Satheesh Rajendran <sathnaga@linux.vnet.ibm.com> Cc: Stafford Horne <shorne@gmail.com> Cc: Stephen Rothwell <sfr@canb.auug.org.au> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Joerg Roedel <jroedel@suse.de> Cc: Matthew Wilcox <willy@infradead.org> Link: http://lkml.kernel.org/r/20200627143453.31835-1-rppt@kernel.org Link: http://lkml.kernel.org/r/20200627143453.31835-2-rppt@kernel.org Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
159 lines
3.8 KiB
C
159 lines
3.8 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/*
|
|
* This file contains pgtable related functions for 64-bit machines.
|
|
*
|
|
* Derived from arch/ppc64/mm/init.c
|
|
* Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
|
|
*
|
|
* Modifications by Paul Mackerras (PowerMac) (paulus@samba.org)
|
|
* and Cort Dougan (PReP) (cort@cs.nmt.edu)
|
|
* Copyright (C) 1996 Paul Mackerras
|
|
*
|
|
* Derived from "arch/i386/mm/init.c"
|
|
* Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds
|
|
*
|
|
* Dave Engebretsen <engebret@us.ibm.com>
|
|
* Rework for PPC64 port.
|
|
*/
|
|
|
|
#include <linux/signal.h>
|
|
#include <linux/sched.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/string.h>
|
|
#include <linux/export.h>
|
|
#include <linux/types.h>
|
|
#include <linux/mman.h>
|
|
#include <linux/mm.h>
|
|
#include <linux/swap.h>
|
|
#include <linux/stddef.h>
|
|
#include <linux/vmalloc.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/hugetlb.h>
|
|
|
|
#include <asm/page.h>
|
|
#include <asm/prom.h>
|
|
#include <asm/mmu_context.h>
|
|
#include <asm/mmu.h>
|
|
#include <asm/smp.h>
|
|
#include <asm/machdep.h>
|
|
#include <asm/tlb.h>
|
|
#include <asm/processor.h>
|
|
#include <asm/cputable.h>
|
|
#include <asm/sections.h>
|
|
#include <asm/firmware.h>
|
|
#include <asm/dma.h>
|
|
|
|
#include <mm/mmu_decl.h>
|
|
|
|
|
|
#ifdef CONFIG_PPC_BOOK3S_64
|
|
/*
|
|
* partition table and process table for ISA 3.0
|
|
*/
|
|
struct prtb_entry *process_tb;
|
|
struct patb_entry *partition_tb;
|
|
/*
|
|
* page table size
|
|
*/
|
|
unsigned long __pte_index_size;
|
|
EXPORT_SYMBOL(__pte_index_size);
|
|
unsigned long __pmd_index_size;
|
|
EXPORT_SYMBOL(__pmd_index_size);
|
|
unsigned long __pud_index_size;
|
|
EXPORT_SYMBOL(__pud_index_size);
|
|
unsigned long __pgd_index_size;
|
|
EXPORT_SYMBOL(__pgd_index_size);
|
|
unsigned long __pud_cache_index;
|
|
EXPORT_SYMBOL(__pud_cache_index);
|
|
unsigned long __pte_table_size;
|
|
EXPORT_SYMBOL(__pte_table_size);
|
|
unsigned long __pmd_table_size;
|
|
EXPORT_SYMBOL(__pmd_table_size);
|
|
unsigned long __pud_table_size;
|
|
EXPORT_SYMBOL(__pud_table_size);
|
|
unsigned long __pgd_table_size;
|
|
EXPORT_SYMBOL(__pgd_table_size);
|
|
unsigned long __pmd_val_bits;
|
|
EXPORT_SYMBOL(__pmd_val_bits);
|
|
unsigned long __pud_val_bits;
|
|
EXPORT_SYMBOL(__pud_val_bits);
|
|
unsigned long __pgd_val_bits;
|
|
EXPORT_SYMBOL(__pgd_val_bits);
|
|
unsigned long __kernel_virt_start;
|
|
EXPORT_SYMBOL(__kernel_virt_start);
|
|
unsigned long __vmalloc_start;
|
|
EXPORT_SYMBOL(__vmalloc_start);
|
|
unsigned long __vmalloc_end;
|
|
EXPORT_SYMBOL(__vmalloc_end);
|
|
unsigned long __kernel_io_start;
|
|
EXPORT_SYMBOL(__kernel_io_start);
|
|
unsigned long __kernel_io_end;
|
|
struct page *vmemmap;
|
|
EXPORT_SYMBOL(vmemmap);
|
|
unsigned long __pte_frag_nr;
|
|
EXPORT_SYMBOL(__pte_frag_nr);
|
|
unsigned long __pte_frag_size_shift;
|
|
EXPORT_SYMBOL(__pte_frag_size_shift);
|
|
#endif
|
|
|
|
#ifndef __PAGETABLE_PUD_FOLDED
|
|
/* 4 level page table */
|
|
struct page *p4d_page(p4d_t p4d)
|
|
{
|
|
if (p4d_is_leaf(p4d)) {
|
|
VM_WARN_ON(!p4d_huge(p4d));
|
|
return pte_page(p4d_pte(p4d));
|
|
}
|
|
return virt_to_page(p4d_page_vaddr(p4d));
|
|
}
|
|
#endif
|
|
|
|
struct page *pud_page(pud_t pud)
|
|
{
|
|
if (pud_is_leaf(pud)) {
|
|
VM_WARN_ON(!pud_huge(pud));
|
|
return pte_page(pud_pte(pud));
|
|
}
|
|
return virt_to_page(pud_page_vaddr(pud));
|
|
}
|
|
|
|
/*
|
|
* For hugepage we have pfn in the pmd, we use PTE_RPN_SHIFT bits for flags
|
|
* For PTE page, we have a PTE_FRAG_SIZE (4K) aligned virtual address.
|
|
*/
|
|
struct page *pmd_page(pmd_t pmd)
|
|
{
|
|
if (pmd_is_leaf(pmd)) {
|
|
VM_WARN_ON(!(pmd_large(pmd) || pmd_huge(pmd)));
|
|
return pte_page(pmd_pte(pmd));
|
|
}
|
|
return virt_to_page(pmd_page_vaddr(pmd));
|
|
}
|
|
|
|
#ifdef CONFIG_STRICT_KERNEL_RWX
|
|
void mark_rodata_ro(void)
|
|
{
|
|
if (!mmu_has_feature(MMU_FTR_KERNEL_RO)) {
|
|
pr_warn("Warning: Unable to mark rodata read only on this CPU.\n");
|
|
return;
|
|
}
|
|
|
|
if (radix_enabled())
|
|
radix__mark_rodata_ro();
|
|
else
|
|
hash__mark_rodata_ro();
|
|
|
|
// mark_initmem_nx() should have already run by now
|
|
ptdump_check_wx();
|
|
}
|
|
|
|
void mark_initmem_nx(void)
|
|
{
|
|
if (radix_enabled())
|
|
radix__mark_initmem_nx();
|
|
else
|
|
hash__mark_initmem_nx();
|
|
}
|
|
#endif
|