2005-06-23 22:01:26 -07:00
/*
2007-08-22 10:14:51 -07:00
* include / asm - xtensa / pgalloc . h
2005-06-23 22:01:26 -07: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 10:14:51 -07:00
* Copyright ( C ) 2001 - 2007 Tensilica Inc .
2005-06-23 22:01:26 -07: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 10:14:51 -07: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 ) ) )
2005-06-23 22:01:26 -07:00
2007-08-22 10:14:51 -07:00
static inline pgd_t *
pgd_alloc ( struct mm_struct * mm )
2005-06-23 22:01:26 -07:00
{
2007-08-22 10:14:51 -07:00
return ( pgd_t * ) __get_free_pages ( GFP_KERNEL | __GFP_ZERO , PGD_ORDER ) ;
2005-06-23 22:01:26 -07:00
}
2007-08-22 10:14:51 -07:00
static inline void pgd_free ( pgd_t * pgd )
2005-06-23 22:01:26 -07:00
{
2007-08-22 10:14:51 -07:00
free_page ( ( unsigned long ) pgd ) ;
2005-06-23 22:01:26 -07:00
}
2007-08-22 10:14:51 -07:00
/* Use a slab cache for the pte pages (see also sparc64 implementation) */
2005-06-23 22:01:26 -07:00
2007-08-22 10:14:51 -07:00
extern struct kmem_cache * pgtable_cache ;
2005-06-23 22:01:26 -07:00
2007-08-22 10:14:51 -07:00
static inline pte_t * pte_alloc_one_kernel ( struct mm_struct * mm ,
unsigned long address )
2005-06-23 22:01:26 -07:00
{
2007-08-22 10:14:51 -07:00
return kmem_cache_alloc ( pgtable_cache , GFP_KERNEL | __GFP_REPEAT ) ;
}
2005-06-23 22:01:26 -07:00
2007-08-22 10:14:51 -07:00
static inline struct page * pte_alloc_one ( struct mm_struct * mm ,
unsigned long addr )
{
return virt_to_page ( pte_alloc_one_kernel ( mm , addr ) ) ;
2005-06-23 22:01:26 -07:00
}
2007-08-22 10:14:51 -07:00
static inline void pte_free_kernel ( pte_t * pte )
{
kmem_cache_free ( pgtable_cache , pte ) ;
}
2005-06-23 22:01:26 -07:00
2007-08-22 10:14:51 -07:00
static inline void pte_free ( struct page * page )
{
kmem_cache_free ( pgtable_cache , page_address ( page ) ) ;
}
2005-06-23 22:01:26 -07:00
# endif /* __KERNEL__ */
# endif /* _XTENSA_PGALLOC_H */