1caab277bSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 21d18c47cSCatalin Marinas /* 31d18c47cSCatalin Marinas * PGD allocation/freeing 41d18c47cSCatalin Marinas * 51d18c47cSCatalin Marinas * Copyright (C) 2012 ARM Ltd. 61d18c47cSCatalin Marinas * Author: Catalin Marinas <catalin.marinas@arm.com> 71d18c47cSCatalin Marinas */ 81d18c47cSCatalin Marinas 91d18c47cSCatalin Marinas #include <linux/mm.h> 101d18c47cSCatalin Marinas #include <linux/gfp.h> 111d18c47cSCatalin Marinas #include <linux/highmem.h> 121d18c47cSCatalin Marinas #include <linux/slab.h> 131d18c47cSCatalin Marinas 141d18c47cSCatalin Marinas #include <asm/pgalloc.h> 151d18c47cSCatalin Marinas #include <asm/page.h> 161d18c47cSCatalin Marinas #include <asm/tlbflush.h> 171d18c47cSCatalin Marinas 18a349b302SJinbum Park static struct kmem_cache *pgd_cache __ro_after_init; 192a0b5c0dSCatalin Marinas pgd_alloc(struct mm_struct * mm)201d18c47cSCatalin Marinaspgd_t *pgd_alloc(struct mm_struct *mm) 211d18c47cSCatalin Marinas { 2250f11a8aSMike Rapoport gfp_t gfp = GFP_PGTABLE_USER; 2350f11a8aSMike Rapoport 241d18c47cSCatalin Marinas if (PGD_SIZE == PAGE_SIZE) 2550f11a8aSMike Rapoport return (pgd_t *)__get_free_page(gfp); 261d18c47cSCatalin Marinas else 2750f11a8aSMike Rapoport return kmem_cache_alloc(pgd_cache, gfp); 281d18c47cSCatalin Marinas } 291d18c47cSCatalin Marinas pgd_free(struct mm_struct * mm,pgd_t * pgd)301d18c47cSCatalin Marinasvoid pgd_free(struct mm_struct *mm, pgd_t *pgd) 311d18c47cSCatalin Marinas { 321d18c47cSCatalin Marinas if (PGD_SIZE == PAGE_SIZE) 331d18c47cSCatalin Marinas free_page((unsigned long)pgd); 341d18c47cSCatalin Marinas else 352a0b5c0dSCatalin Marinas kmem_cache_free(pgd_cache, pgd); 361d18c47cSCatalin Marinas } 372a0b5c0dSCatalin Marinas pgtable_cache_init(void)38*782de70cSMike Rapoportvoid __init pgtable_cache_init(void) 392a0b5c0dSCatalin Marinas { 4039b5be9bSWill Deacon if (PGD_SIZE == PAGE_SIZE) 4139b5be9bSWill Deacon return; 4239b5be9bSWill Deacon 43529c4b05SKristina Martsenko #ifdef CONFIG_ARM64_PA_BITS_52 44529c4b05SKristina Martsenko /* 45529c4b05SKristina Martsenko * With 52-bit physical addresses, the architecture requires the 46529c4b05SKristina Martsenko * top-level table to be aligned to at least 64 bytes. 47529c4b05SKristina Martsenko */ 48529c4b05SKristina Martsenko BUILD_BUG_ON(PGD_SIZE < 64); 49529c4b05SKristina Martsenko #endif 50529c4b05SKristina Martsenko 512a0b5c0dSCatalin Marinas /* 522a0b5c0dSCatalin Marinas * Naturally aligned pgds required by the architecture. 532a0b5c0dSCatalin Marinas */ 542a0b5c0dSCatalin Marinas pgd_cache = kmem_cache_create("pgd_cache", PGD_SIZE, PGD_SIZE, 552a0b5c0dSCatalin Marinas SLAB_PANIC, NULL); 562a0b5c0dSCatalin Marinas } 57