/* * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * vineetg: June 2011 * -"/proc/meminfo | grep PageTables" kept on increasing * Recently added pgtable dtor was not getting called. * * vineetg: May 2011 * -Variable pg-sz means that Page Tables could be variable sized themselves * So calculate it based on addr traversal split [pgd-bits:pte-bits:xxx] * -Page Table size capped to max 1 to save memory - hence verified. * -Since these deal with constants, gcc compile-time optimizes them. * * vineetg: Nov 2010 * -Added pgtable ctor/dtor used for pgtable mem accounting * * vineetg: April 2010 * -Switched pgtable_t from being struct page * to unsigned long * =Needed so that Page Table allocator (pte_alloc_one) is not forced to * to deal with struct page. Thay way in future we can make it allocate * multiple PG Tbls in one Page Frame * =sweet side effect is avoiding calls to ugly page_address( ) from the * pg-tlb allocator sub-sys (pte_alloc_one, ptr_free, pmd_populate * * Amit Bhor, Sameer Dhavale: Codito Technologies 2004 */ #ifndef _ASM_ARC_PGALLOC_H #define _ASM_ARC_PGALLOC_H #include <linux/mm.h> #include <linux/log2.h> static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, pte_t *pte) { pmd_set(pmd, pte); } static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, pgtable_t ptep) { pmd_set(pmd, (pte_t *) ptep); } static inline int __get_order_pgd(void) { return get_order(PTRS_PER_PGD * sizeof(pgd_t)); } static inline pgd_t *pgd_alloc(struct mm_struct *mm) { int num, num2; pgd_t *ret = (pgd_t *) __get_free_pages(GFP_KERNEL, __get_order_pgd()); if (ret) { num = USER_PTRS_PER_PGD + USER_KERNEL_GUTTER / PGDIR_SIZE; memzero(ret, num * sizeof(pgd_t)); num2 = VMALLOC_SIZE / PGDIR_SIZE; memcpy(ret + num, swapper_pg_dir + num, num2 * sizeof(pgd_t)); memzero(ret + num + num2, (PTRS_PER_PGD - num - num2) * sizeof(pgd_t)); } return ret; } static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) { free_pages((unsigned long)pgd, __get_order_pgd()); } /* * With software-only page-tables, addr-split for traversal is tweakable and * that directly governs how big tables would be at each level. * Further, the MMU page size is configurable. * Thus we need to programatically assert the size constraint * All of this is const math, allowing gcc to do constant folding/propagation. */ static inline int __get_order_pte(void) { return get_order(PTRS_PER_PTE * sizeof(pte_t)); } static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address) { pte_t *pte; pte = (pte_t *) __get_free_pages(GFP_KERNEL | __GFP_ZERO, __get_order_pte()); return pte; } static inline pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address) { pgtable_t pte_pg; struct page *page; pte_pg = (pgtable_t)__get_free_pages(GFP_KERNEL, __get_order_pte()); if (!pte_pg) return 0; memzero((void *)pte_pg, PTRS_PER_PTE * sizeof(pte_t)); page = virt_to_page(pte_pg); if (!pgtable_page_ctor(page)) { __free_page(page); return 0; } return pte_pg; } static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) { free_pages((unsigned long)pte, __get_order_pte()); /* takes phy addr */ } static inline void pte_free(struct mm_struct *mm, pgtable_t ptep) { pgtable_page_dtor(virt_to_page(ptep)); free_pages((unsigned long)ptep, __get_order_pte()); } #define __pte_free_tlb(tlb, pte, addr) pte_free((tlb)->mm, pte) #define check_pgt_cache() do { } while (0) #define pmd_pgtable(pmd) ((pgtable_t) pmd_page_vaddr(pmd)) #endif /* _ASM_ARC_PGALLOC_H */
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
Kbuild | File | 681 B | 0644 |
|
arcregs.h | File | 8.59 KB | 0644 |
|
asm-offsets.h | File | 311 B | 0644 |
|
atomic.h | File | 15.14 KB | 0644 |
|
barrier.h | File | 1.75 KB | 0644 |
|
bitops.h | File | 9.81 KB | 0644 |
|
bug.h | File | 938 B | 0644 |
|
cache.h | File | 3.77 KB | 0644 |
|
cacheflush.h | File | 3.88 KB | 0644 |
|
checksum.h | File | 2.45 KB | 0644 |
|
cmpxchg.h | File | 5.4 KB | 0644 |
|
current.h | File | 695 B | 0644 |
|
delay.h | File | 1.99 KB | 0644 |
|
disasm.h | File | 3.87 KB | 0644 |
|
dma-mapping.h | File | 734 B | 0644 |
|
dma.h | File | 459 B | 0644 |
|
dwarf.h | File | 892 B | 0644 |
|
elf.h | File | 2.15 KB | 0644 |
|
entry-arcv2.h | File | 4.85 KB | 0644 |
|
entry-compact.h | File | 9.29 KB | 0644 |
|
entry.h | File | 6.73 KB | 0644 |
|
exec.h | File | 410 B | 0644 |
|
fb.h | File | 411 B | 0644 |
|
futex.h | File | 3.67 KB | 0644 |
|
highmem.h | File | 1.46 KB | 0644 |
|
hugepage.h | File | 2.41 KB | 0644 |
|
io.h | File | 6.43 KB | 0644 |
|
irq.h | File | 825 B | 0644 |
|
irqflags-arcv2.h | File | 3.45 KB | 0644 |
|
irqflags-compact.h | File | 4.25 KB | 0644 |
|
irqflags.h | File | 509 B | 0644 |
|
kdebug.h | File | 400 B | 0644 |
|
kgdb.h | File | 1.35 KB | 0644 |
|
kmap_types.h | File | 489 B | 0644 |
|
kprobes.h | File | 1.37 KB | 0644 |
|
linkage.h | File | 1.42 KB | 0644 |
|
mach_desc.h | File | 2.06 KB | 0644 |
|
mmu.h | File | 2.44 KB | 0644 |
|
mmu_context.h | File | 5.67 KB | 0644 |
|
mmzone.h | File | 989 B | 0644 |
|
module.h | File | 661 B | 0644 |
|
page.h | File | 2.99 KB | 0644 |
|
pci.h | File | 705 B | 0644 |
|
perf_event.h | File | 6.86 KB | 0644 |
|
pgalloc.h | File | 3.79 KB | 0644 |
|
pgtable.h | File | 14.2 KB | 0644 |
|
processor.h | File | 4.69 KB | 0644 |
|
ptrace.h | File | 3.87 KB | 0644 |
|
sections.h | File | 407 B | 0644 |
|
segment.h | File | 612 B | 0644 |
|
serial.h | File | 644 B | 0644 |
|
setup.h | File | 1.18 KB | 0644 |
|
shmparam.h | File | 442 B | 0644 |
|
smp.h | File | 4.25 KB | 0644 |
|
spinlock.h | File | 8.79 KB | 0644 |
|
spinlock_types.h | File | 1.03 KB | 0644 |
|
stacktrace.h | File | 1.29 KB | 0644 |
|
string.h | File | 1.15 KB | 0644 |
|
switch_to.h | File | 1.17 KB | 0644 |
|
syscall.h | File | 1.57 KB | 0644 |
|
syscalls.h | File | 653 B | 0644 |
|
thread_info.h | File | 3.39 KB | 0644 |
|
timex.h | File | 508 B | 0644 |
|
tlb-mmu1.h | File | 3.48 KB | 0644 |
|
tlb.h | File | 1.23 KB | 0644 |
|
tlbflush.h | File | 1.76 KB | 0644 |
|
uaccess.h | File | 18.45 KB | 0644 |
|
unaligned.h | File | 771 B | 0644 |
|
unwind.h | File | 3.51 KB | 0644 |
|