lkml.org 
[lkml]   [2019]   [Jul]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v10 04/22] arm64: mm: Add p?d_leaf() definitions
    Date
    walk_page_range() is going to be allowed to walk page tables other than
    those of user space. For this it needs to know when it has reached a
    'leaf' entry in the page tables. This information will be provided by the
    p?d_leaf() functions/macros.

    For arm64, we already have p?d_sect() macros which we can reuse for
    p?d_leaf().

    pud_sect() is defined as a dummy function when CONFIG_PGTABLE_LEVELS < 3
    or CONFIG_ARM64_64K_PAGES is defined. However when the kernel is
    configured this way then architecturally it isn't allowed to have a
    large page at this level, and any code using these page walking macros
    is implicitly relying on the page size/number of levels being the same as
    the kernel. So it is safe to reuse this for p?d_leaf() as it is an
    architectural restriction.

    CC: Catalin Marinas <catalin.marinas@arm.com>
    CC: Will Deacon <will@kernel.org>
    Signed-off-by: Steven Price <steven.price@arm.com>
    ---
    arch/arm64/include/asm/pgtable.h | 2 ++
    1 file changed, 2 insertions(+)

    diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h
    index 87a4b2ddc1a1..2c123d59dbff 100644
    --- a/arch/arm64/include/asm/pgtable.h
    +++ b/arch/arm64/include/asm/pgtable.h
    @@ -446,6 +446,7 @@ extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
    PMD_TYPE_TABLE)
    #define pmd_sect(pmd) ((pmd_val(pmd) & PMD_TYPE_MASK) == \
    PMD_TYPE_SECT)
    +#define pmd_leaf(pmd) pmd_sect(pmd)

    #if defined(CONFIG_ARM64_64K_PAGES) || CONFIG_PGTABLE_LEVELS < 3
    #define pud_sect(pud) (0)
    @@ -528,6 +529,7 @@ static inline void pte_unmap(pte_t *pte) { }
    #define pud_none(pud) (!pud_val(pud))
    #define pud_bad(pud) (!(pud_val(pud) & PUD_TABLE_BIT))
    #define pud_present(pud) pte_present(pud_pte(pud))
    +#define pud_leaf(pud) pud_sect(pud)
    #define pud_valid(pud) pte_valid(pud_pte(pud))

    static inline void set_pud(pud_t *pudp, pud_t pud)
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-07-31 17:48    [W:4.112 / U:0.140 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site