2005-04-17 02:20:36 +04:00
# ifndef _ASM_IA64_PGALLOC_H
# define _ASM_IA64_PGALLOC_H
/*
* This file contains the functions and defines necessary to allocate
* page tables .
*
* This hopefully works with any ( fixed ) ia - 64 page - size , as defined
* in < asm / page . h > ( currently 8192 ) .
*
* Copyright ( C ) 1998 - 2001 Hewlett - Packard Co
* David Mosberger - Tang < davidm @ hpl . hp . com >
* Copyright ( C ) 2000 , Goutham Rao < goutham . rao @ intel . com >
*/
# include <linux/compiler.h>
# include <linux/mm.h>
# include <linux/page-flags.h>
# include <linux/threads.h>
2007-05-11 09:42:53 +04:00
# include <linux/quicklist.h>
2005-04-17 02:20:36 +04:00
# include <asm/mmu_context.h>
2005-04-26 00:13:16 +04:00
static inline pgd_t * pgd_alloc ( struct mm_struct * mm )
2005-04-17 02:20:36 +04:00
{
2007-05-11 09:42:53 +04:00
return quicklist_alloc ( 0 , GFP_KERNEL , NULL ) ;
2005-04-17 02:20:36 +04:00
}
2008-02-05 09:29:14 +03:00
static inline void pgd_free ( struct mm_struct * mm , pgd_t * pgd )
2005-04-17 02:20:36 +04:00
{
2007-05-11 09:42:53 +04:00
quicklist_free ( 0 , NULL , pgd ) ;
2005-04-17 02:20:36 +04:00
}
2005-11-11 18:35:43 +03:00
# ifdef CONFIG_PGTABLE_4
static inline void
pgd_populate ( struct mm_struct * mm , pgd_t * pgd_entry , pud_t * pud )
{
pgd_val ( * pgd_entry ) = __pa ( pud ) ;
}
static inline pud_t * pud_alloc_one ( struct mm_struct * mm , unsigned long addr )
{
2007-05-11 09:42:53 +04:00
return quicklist_alloc ( 0 , GFP_KERNEL , NULL ) ;
2005-11-11 18:35:43 +03:00
}
2008-02-05 09:29:14 +03:00
static inline void pud_free ( struct mm_struct * mm , pud_t * pud )
2005-11-11 18:35:43 +03:00
{
2007-05-11 09:42:53 +04:00
quicklist_free ( 0 , NULL , pud ) ;
2005-11-11 18:35:43 +03:00
}
2008-02-05 09:29:14 +03:00
# define __pud_free_tlb(tlb, pud) pud_free((tlb)->mm, pud)
2005-11-11 18:35:43 +03:00
# endif /* CONFIG_PGTABLE_4 */
2005-04-26 00:13:16 +04:00
static inline void
pud_populate ( struct mm_struct * mm , pud_t * pud_entry , pmd_t * pmd )
2005-04-17 02:20:36 +04:00
{
2005-04-26 00:13:16 +04:00
pud_val ( * pud_entry ) = __pa ( pmd ) ;
}
2005-04-17 02:20:36 +04:00
2005-04-26 00:13:16 +04:00
static inline pmd_t * pmd_alloc_one ( struct mm_struct * mm , unsigned long addr )
{
2007-05-11 09:42:53 +04:00
return quicklist_alloc ( 0 , GFP_KERNEL , NULL ) ;
2005-04-17 02:20:36 +04:00
}
2008-02-05 09:29:14 +03:00
static inline void pmd_free ( struct mm_struct * mm , pmd_t * pmd )
2005-04-17 02:20:36 +04:00
{
2007-05-11 09:42:53 +04:00
quicklist_free ( 0 , NULL , pmd ) ;
2005-04-17 02:20:36 +04:00
}
2008-02-05 09:29:14 +03:00
# define __pmd_free_tlb(tlb, pmd) pmd_free((tlb)->mm, pmd)
2005-04-17 02:20:36 +04:00
static inline void
2008-02-08 15:22:04 +03:00
pmd_populate ( struct mm_struct * mm , pmd_t * pmd_entry , pgtable_t pte )
2005-04-17 02:20:36 +04:00
{
pmd_val ( * pmd_entry ) = page_to_phys ( pte ) ;
}
2008-02-08 15:22:04 +03:00
# define pmd_pgtable(pmd) pmd_page(pmd)
2005-04-17 02:20:36 +04:00
static inline void
2005-04-26 00:13:16 +04:00
pmd_populate_kernel ( struct mm_struct * mm , pmd_t * pmd_entry , pte_t * pte )
2005-04-17 02:20:36 +04:00
{
pmd_val ( * pmd_entry ) = __pa ( pte ) ;
}
2008-02-08 15:22:04 +03:00
static inline pgtable_t pte_alloc_one ( struct mm_struct * mm , unsigned long addr )
2005-04-17 02:20:36 +04:00
{
2008-02-08 15:22:04 +03:00
struct page * page ;
void * pg ;
pg = quicklist_alloc ( 0 , GFP_KERNEL , NULL ) ;
if ( ! pg )
return NULL ;
page = virt_to_page ( pg ) ;
pgtable_page_ctor ( page ) ;
return page ;
2005-04-17 02:20:36 +04:00
}
2005-04-26 00:13:16 +04:00
static inline pte_t * pte_alloc_one_kernel ( struct mm_struct * mm ,
unsigned long addr )
2005-04-17 02:20:36 +04:00
{
2007-05-11 09:42:53 +04:00
return quicklist_alloc ( 0 , GFP_KERNEL , NULL ) ;
2005-04-17 02:20:36 +04:00
}
2008-02-08 15:22:04 +03:00
static inline void pte_free ( struct mm_struct * mm , pgtable_t pte )
2005-04-17 02:20:36 +04:00
{
2008-02-08 15:22:04 +03:00
pgtable_page_dtor ( pte ) ;
2007-05-11 09:42:53 +04:00
quicklist_free_page ( 0 , NULL , pte ) ;
2005-04-17 02:20:36 +04:00
}
2008-02-05 09:29:14 +03:00
static inline void pte_free_kernel ( struct mm_struct * mm , pte_t * pte )
2005-04-17 02:20:36 +04:00
{
2007-05-11 09:42:53 +04:00
quicklist_free ( 0 , NULL , pte ) ;
2005-04-17 02:20:36 +04:00
}
2007-05-11 09:42:53 +04:00
static inline void check_pgt_cache ( void )
{
quicklist_trim ( 0 , NULL , 25 , 16 ) ;
}
2005-04-17 02:20:36 +04:00
2008-02-05 09:29:14 +03:00
# define __pte_free_tlb(tlb, pte) pte_free((tlb)->mm, pte)
2005-04-17 02:20:36 +04:00
2005-04-26 00:13:16 +04:00
# endif /* _ASM_IA64_PGALLOC_H */