2005-06-24 09:01:26 +04:00
/*
2007-08-22 21:14:51 +04:00
* include / asm - xtensa / pgalloc . h
2005-06-24 09:01:26 +04:00
*
* 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 .
*
2007-08-22 21:14:51 +04:00
* Copyright ( C ) 2001 - 2007 Tensilica Inc .
2005-06-24 09:01:26 +04:00
*/
# ifndef _XTENSA_PGALLOC_H
# define _XTENSA_PGALLOC_H
# ifdef __KERNEL__
# include <linux/highmem.h>
/*
* Allocating and freeing a pmd is trivial : the 1 - entry pmd is
* inside the pgd , so has no extra memory associated with it .
*/
2007-08-22 21:14:51 +04:00
# define pmd_populate_kernel(mm, pmdp, ptep) \
( pmd_val ( * ( pmdp ) ) = ( ( unsigned long ) ptep ) )
# define pmd_populate(mm, pmdp, page) \
( pmd_val ( * ( pmdp ) ) = ( ( unsigned long ) page_to_virt ( page ) ) )
2008-02-08 15:22:04 +03:00
# define pmd_pgtable(pmd) pmd_page(pmd)
2005-06-24 09:01:26 +04:00
2007-08-22 21:14:51 +04:00
static inline pgd_t *
pgd_alloc ( struct mm_struct * mm )
2005-06-24 09:01:26 +04:00
{
2007-08-22 21:14:51 +04:00
return ( pgd_t * ) __get_free_pages ( GFP_KERNEL | __GFP_ZERO , PGD_ORDER ) ;
2005-06-24 09:01:26 +04:00
}
2008-02-05 09:29:14 +03:00
static inline void pgd_free ( struct mm_struct * mm , pgd_t * pgd )
2005-06-24 09:01:26 +04:00
{
2007-08-22 21:14:51 +04:00
free_page ( ( unsigned long ) pgd ) ;
2005-06-24 09:01:26 +04:00
}
2007-08-22 21:14:51 +04:00
/* Use a slab cache for the pte pages (see also sparc64 implementation) */
2005-06-24 09:01:26 +04:00
2007-08-22 21:14:51 +04:00
extern struct kmem_cache * pgtable_cache ;
2005-06-24 09:01:26 +04:00
2007-08-22 21:14:51 +04:00
static inline pte_t * pte_alloc_one_kernel ( struct mm_struct * mm ,
unsigned long address )
2005-06-24 09:01:26 +04:00
{
2007-08-22 21:14:51 +04:00
return kmem_cache_alloc ( pgtable_cache , GFP_KERNEL | __GFP_REPEAT ) ;
}
2005-06-24 09:01:26 +04:00
2008-02-14 03:25:09 +03:00
static inline pgtable_t pte_alloc_one ( struct mm_struct * mm ,
2008-02-08 15:22:04 +03:00
unsigned long addr )
2007-08-22 21:14:51 +04:00
{
2008-02-08 15:22:04 +03:00
struct page * page ;
page = virt_to_page ( pte_alloc_one_kernel ( mm , addr ) ) ;
pgtable_page_ctor ( page ) ;
return page ;
2005-06-24 09:01:26 +04:00
}
2008-02-05 09:29:14 +03:00
static inline void pte_free_kernel ( struct mm_struct * mm , pte_t * pte )
2007-08-22 21:14:51 +04:00
{
kmem_cache_free ( pgtable_cache , pte ) ;
}
2005-06-24 09:01:26 +04:00
2008-02-08 15:22:04 +03:00
static inline void pte_free ( struct mm_struct * mm , pgtable_t pte )
2007-08-22 21:14:51 +04:00
{
2008-02-08 15:22:04 +03:00
pgtable_page_dtor ( pte ) ;
kmem_cache_free ( pgtable_cache , page_address ( pte ) ) ;
2007-08-22 21:14:51 +04:00
}
2008-02-08 15:22:04 +03:00
# define pmd_pgtable(pmd) pmd_page(pmd)
2005-06-24 09:01:26 +04:00
# endif /* __KERNEL__ */
# endif /* _XTENSA_PGALLOC_H */