2005-06-23 22:01:24 -07:00
/*
2006-10-03 23:01:26 +02:00
* arch / xtensa / mm / pgtable . c
2005-06-23 22:01:24 -07:00
*
* This file is subject to the terms and conditions of the GNU General Public
* License . See the file " COPYING " in the main directory of this archive
* for more details .
*
* Copyright ( C ) 2001 - 2005 Tensilica Inc .
*
* Chris Zankel < chris @ zankel . net >
*/
# if (DCACHE_SIZE > PAGE_SIZE)
pte_t * pte_alloc_one_kernel ( struct mm_struct * mm , unsigned long address )
{
2006-03-22 00:08:04 -08:00
pte_t * pte = NULL , * p ;
2005-06-23 22:01:24 -07:00
int color = ADDR_COLOR ( address ) ;
int i ;
p = ( pte_t * ) __get_free_pages ( GFP_KERNEL | __GFP_REPEAT , COLOR_ORDER ) ;
if ( likely ( p ) ) {
2006-03-22 00:08:05 -08:00
split_page ( virt_to_page ( p ) , COLOR_ORDER ) ;
2005-06-23 22:01:24 -07:00
2006-03-22 00:08:04 -08:00
for ( i = 0 ; i < COLOR_SIZE ; i + + ) {
2005-06-23 22:01:24 -07:00
if ( ADDR_COLOR ( p ) = = color )
pte = p ;
else
free_page ( p ) ;
2006-03-22 00:08:04 -08:00
p + = PTRS_PER_PTE ;
2005-06-23 22:01:24 -07:00
}
clear_page ( pte ) ;
}
return pte ;
}
# ifdef PROFILING
int mask ;
int hit ;
int flush ;
# endif
struct page * pte_alloc_one ( struct mm_struct * mm , unsigned long address )
{
2006-03-22 00:08:04 -08:00
struct page * page = NULL , * p ;
2005-06-23 22:01:24 -07:00
int color = ADDR_COLOR ( address ) ;
p = alloc_pages ( GFP_KERNEL | __GFP_REPEAT , PTE_ORDER ) ;
if ( likely ( p ) ) {
2006-03-22 00:08:05 -08:00
split_page ( p , COLOR_ORDER ) ;
2005-06-23 22:01:24 -07:00
2006-03-22 00:08:05 -08:00
for ( i = 0 ; i < PAGE_ORDER ; i + + ) {
2006-03-22 00:08:04 -08:00
if ( PADDR_COLOR ( page_address ( p ) ) = = color )
2005-06-23 22:01:24 -07:00
page = p ;
else
2006-03-22 00:08:04 -08:00
__free_page ( p ) ;
p + + ;
2005-06-23 22:01:24 -07:00
}
clear_highpage ( page ) ;
}
return page ;
}
# endif