ARC: mm: switch pgtable_to to pte_t *
ARC is the only arch with unsigned long type (vs. struct page *). Historically this was done to avoid the page_address() calls in various arch hooks which need to get the virtual/logical address of the table. Some arches alternately define it as pte_t *, and is as efficient as unsigned long (generated code doesn't change) Suggested-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
This commit is contained in:
parent
049e6dde7e
commit
e8a75963a4
|
@ -43,7 +43,6 @@ typedef struct {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
unsigned long pgprot;
|
unsigned long pgprot;
|
||||||
} pgprot_t;
|
} pgprot_t;
|
||||||
typedef unsigned long pgtable_t;
|
|
||||||
|
|
||||||
#define pte_val(x) ((x).pte)
|
#define pte_val(x) ((x).pte)
|
||||||
#define pgd_val(x) ((x).pgd)
|
#define pgd_val(x) ((x).pgd)
|
||||||
|
@ -60,7 +59,6 @@ typedef unsigned long pgtable_t;
|
||||||
typedef unsigned long pte_t;
|
typedef unsigned long pte_t;
|
||||||
typedef unsigned long pgd_t;
|
typedef unsigned long pgd_t;
|
||||||
typedef unsigned long pgprot_t;
|
typedef unsigned long pgprot_t;
|
||||||
typedef unsigned long pgtable_t;
|
|
||||||
|
|
||||||
#define pte_val(x) (x)
|
#define pte_val(x) (x)
|
||||||
#define pgd_val(x) (x)
|
#define pgd_val(x) (x)
|
||||||
|
@ -71,6 +69,8 @@ typedef unsigned long pgtable_t;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
typedef pte_t * pgtable_t;
|
||||||
|
|
||||||
#define ARCH_PFN_OFFSET (CONFIG_LINUX_LINK_BASE >> PAGE_SHIFT)
|
#define ARCH_PFN_OFFSET (CONFIG_LINUX_LINK_BASE >> PAGE_SHIFT)
|
||||||
|
|
||||||
#define pfn_valid(pfn) (((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
|
#define pfn_valid(pfn) (((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
|
||||||
|
|
|
@ -107,7 +107,7 @@ pte_alloc_one(struct mm_struct *mm, unsigned long address)
|
||||||
pgtable_t pte_pg;
|
pgtable_t pte_pg;
|
||||||
struct page *page;
|
struct page *page;
|
||||||
|
|
||||||
pte_pg = __get_free_pages(GFP_KERNEL | __GFP_REPEAT, __get_order_pte());
|
pte_pg = (pgtable_t)__get_free_pages(GFP_KERNEL | __GFP_REPEAT, __get_order_pte());
|
||||||
if (!pte_pg)
|
if (!pte_pg)
|
||||||
return 0;
|
return 0;
|
||||||
memzero((void *)pte_pg, PTRS_PER_PTE * 4);
|
memzero((void *)pte_pg, PTRS_PER_PTE * 4);
|
||||||
|
@ -128,12 +128,12 @@ static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
|
||||||
static inline void pte_free(struct mm_struct *mm, pgtable_t ptep)
|
static inline void pte_free(struct mm_struct *mm, pgtable_t ptep)
|
||||||
{
|
{
|
||||||
pgtable_page_dtor(virt_to_page(ptep));
|
pgtable_page_dtor(virt_to_page(ptep));
|
||||||
free_pages(ptep, __get_order_pte());
|
free_pages((unsigned long)ptep, __get_order_pte());
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __pte_free_tlb(tlb, pte, addr) pte_free((tlb)->mm, pte)
|
#define __pte_free_tlb(tlb, pte, addr) pte_free((tlb)->mm, pte)
|
||||||
|
|
||||||
#define check_pgt_cache() do { } while (0)
|
#define check_pgt_cache() do { } while (0)
|
||||||
#define pmd_pgtable(pmd) pmd_page_vaddr(pmd)
|
#define pmd_pgtable(pmd) ((pgtable_t) pmd_page_vaddr(pmd))
|
||||||
|
|
||||||
#endif /* _ASM_ARC_PGALLOC_H */
|
#endif /* _ASM_ARC_PGALLOC_H */
|
||||||
|
|
Loading…
Reference in New Issue