mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-18 09:44:18 +08:00
782bb5a532
All SH-X2 and SH-X3 parts support an extended TLB mode, which has been left as experimental since support was originally merged. Now that it's had some time to stabilize and get some exposure to various platforms, we can drop it as an option and default enable it across the board. This is also good future proofing for newer parts that will drop support for the legacy TLB mode completely. This will also force 3-level page tables for all newer parts, which is necessary both for the varying page sizes and larger memories. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
57 lines
1.2 KiB
C
57 lines
1.2 KiB
C
#include <linux/mm.h>
|
|
|
|
#define PGALLOC_GFP GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO
|
|
|
|
static struct kmem_cache *pgd_cachep;
|
|
#if PAGETABLE_LEVELS > 2
|
|
static struct kmem_cache *pmd_cachep;
|
|
#endif
|
|
|
|
void pgd_ctor(void *x)
|
|
{
|
|
pgd_t *pgd = x;
|
|
|
|
memcpy(pgd + USER_PTRS_PER_PGD,
|
|
swapper_pg_dir + USER_PTRS_PER_PGD,
|
|
(PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
|
|
}
|
|
|
|
void pgtable_cache_init(void)
|
|
{
|
|
pgd_cachep = kmem_cache_create("pgd_cache",
|
|
PTRS_PER_PGD * (1<<PTE_MAGNITUDE),
|
|
PAGE_SIZE, SLAB_PANIC, pgd_ctor);
|
|
#if PAGETABLE_LEVELS > 2
|
|
pmd_cachep = kmem_cache_create("pmd_cache",
|
|
PTRS_PER_PMD * (1<<PTE_MAGNITUDE),
|
|
PAGE_SIZE, SLAB_PANIC, NULL);
|
|
#endif
|
|
}
|
|
|
|
pgd_t *pgd_alloc(struct mm_struct *mm)
|
|
{
|
|
return kmem_cache_alloc(pgd_cachep, PGALLOC_GFP);
|
|
}
|
|
|
|
void pgd_free(struct mm_struct *mm, pgd_t *pgd)
|
|
{
|
|
kmem_cache_free(pgd_cachep, pgd);
|
|
}
|
|
|
|
#if PAGETABLE_LEVELS > 2
|
|
void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
|
|
{
|
|
set_pud(pud, __pud((unsigned long)pmd));
|
|
}
|
|
|
|
pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
|
|
{
|
|
return kmem_cache_alloc(pmd_cachep, PGALLOC_GFP);
|
|
}
|
|
|
|
void pmd_free(struct mm_struct *mm, pmd_t *pmd)
|
|
{
|
|
kmem_cache_free(pmd_cachep, pmd);
|
|
}
|
|
#endif /* PAGETABLE_LEVELS > 2 */
|