X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=include%2Fasm-ia64%2Fpage.h;h=67bcaa66032c1c4ea59786811c57cd85e34e0bac;hb=97bf2856c6014879bd04983a3e9dfcdac1e7fe85;hp=5e6362a786b72b2b5b9ce98a51db94d1b74f27d2;hpb=76828883507a47dae78837ab5dec5a5b4513c667;p=linux-2.6.git diff --git a/include/asm-ia64/page.h b/include/asm-ia64/page.h index 5e6362a78..67bcaa660 100644 --- a/include/asm-ia64/page.h +++ b/include/asm-ia64/page.h @@ -7,7 +7,7 @@ * David Mosberger-Tang */ -#include +# ifdef __KERNEL__ #include #include @@ -57,13 +57,14 @@ # define HAVE_ARCH_HUGETLB_UNMAPPED_AREA # define ARCH_HAS_HUGEPAGE_ONLY_RANGE +# define ARCH_HAS_PREPARE_HUGEPAGE_RANGE +# define ARCH_HAS_HUGETLB_FREE_PGD_RANGE #endif /* CONFIG_HUGETLB_PAGE */ #ifdef __ASSEMBLY__ # define __pa(x) ((x) - PAGE_OFFSET) # define __va(x) ((x) + PAGE_OFFSET) #else /* !__ASSEMBLY */ -# ifdef __KERNEL__ # define STRICT_MM_TYPECHECKS extern void clear_page (void *page); @@ -100,24 +101,33 @@ do { \ #ifdef CONFIG_VIRTUAL_MEM_MAP extern int ia64_pfn_valid (unsigned long pfn); -#elif defined(CONFIG_FLATMEM) +#else # define ia64_pfn_valid(pfn) 1 #endif +#ifdef CONFIG_VIRTUAL_MEM_MAP +extern struct page *vmem_map; +#ifdef CONFIG_DISCONTIGMEM +# define page_to_pfn(page) ((unsigned long) (page - vmem_map)) +# define pfn_to_page(pfn) (vmem_map + (pfn)) +#else +# include +#endif +#else +# include +#endif + #ifdef CONFIG_FLATMEM # define pfn_valid(pfn) (((pfn) < max_mapnr) && ia64_pfn_valid(pfn)) -# define page_to_pfn(page) ((unsigned long) (page - mem_map)) -# define pfn_to_page(pfn) (mem_map + (pfn)) #elif defined(CONFIG_DISCONTIGMEM) -extern struct page *vmem_map; extern unsigned long min_low_pfn; extern unsigned long max_low_pfn; # define pfn_valid(pfn) (((pfn) >= min_low_pfn) && ((pfn) < max_low_pfn) && ia64_pfn_valid(pfn)) -# define page_to_pfn(page) ((unsigned long) (page - vmem_map)) -# define pfn_to_page(pfn) (vmem_map + (pfn)) #endif +#ifndef CONFIG_XEN #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) +#endif #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) @@ -147,7 +157,7 @@ typedef union ia64_va { | (REGION_OFFSET(x) >> (HPAGE_SHIFT-PAGE_SHIFT))) # define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) # define is_hugepage_only_range(mm, addr, len) \ - (REGION_NUMBER(addr) == RGN_HPAGE && \ + (REGION_NUMBER(addr) == RGN_HPAGE || \ REGION_NUMBER((addr)+(len)-1) == RGN_HPAGE) extern unsigned int hpage_shift; #endif @@ -165,7 +175,6 @@ get_order (unsigned long size) return order; } -# endif /* __KERNEL__ */ #endif /* !__ASSEMBLY__ */ #ifdef STRICT_MM_TYPECHECKS @@ -219,4 +228,54 @@ get_order (unsigned long size) (((current->personality & READ_IMPLIES_EXEC) != 0) \ ? VM_EXEC : 0)) +#define devmem_is_allowed(x) 1 +#ifndef __ASSEMBLY__ +#ifdef CONFIG_XEN + +#include +#include +#include // to compile netback, netfront + +/* + * XXX hack! + * Linux/IA64 uses PG_arch_1. + * This hack will be removed once PG_foreign bit is taken. + * #include + */ +#ifdef __ASM_XEN_FOREIGN_PAGE_H__ +# error "don't include include/xen/foreign_page.h!" +#endif + +extern struct address_space xen_ia64_foreign_dummy_mapping; +#define PageForeign(page) \ + ((page)->mapping == &xen_ia64_foreign_dummy_mapping) + +#define SetPageForeign(page, dtor) do { \ + set_page_private((page), (unsigned long)(dtor)); \ + (page)->mapping = &xen_ia64_foreign_dummy_mapping; \ + smp_rmb(); \ +} while (0) + +#define ClearPageForeign(page) do { \ + (page)->mapping = NULL; \ + smp_rmb(); \ + set_page_private((page), 0); \ +} while (0) + +#define PageForeignDestructor(page) \ + ( (void (*) (struct page *)) page_private(page) ) + +#define arch_free_page(_page,_order) \ +({ int foreign = PageForeign(_page); \ + if (foreign) \ + (PageForeignDestructor(_page))(_page); \ + foreign; \ +}) +#define HAVE_ARCH_FREE_PAGE + +#include + +#endif /* CONFIG_XEN */ +#endif /* __ASSEMBLY__ */ +#endif /* __KERNEL__ */ #endif /* _ASM_IA64_PAGE_H */