Add the alloc/get_pages_mask calls [Merge note: this patch will be in a SCSI patchkit and in the core mask allocator patchkit. They are equivalent. If one of them is merged first simply drop it in the other] Add the compat version of the *_pages_* calls. These just check if the mask is inside the DMA range and if yes set __GFP_DMA. This is needed so that some code can start using the _mask calls early. Signed-off-by: Andi Kleen --- include/linux/gfp.h | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) Index: linux/include/linux/gfp.h =================================================================== --- linux.orig/include/linux/gfp.h +++ linux/include/linux/gfp.h @@ -4,6 +4,7 @@ #include #include #include +#include /* For TRAD_DMA_MASK/MAX_DMA_ADDRESS */ struct vm_area_struct; @@ -214,14 +215,29 @@ extern unsigned long get_zeroed_page(gfp #define __get_free_page(gfp_mask) \ __get_free_pages((gfp_mask),0) -#define __get_dma_pages(gfp_mask, order) \ - __get_free_pages((gfp_mask) | GFP_DMA,(order)) - extern void __free_pages(struct page *page, unsigned int order); extern void free_pages(unsigned long addr, unsigned int order); extern void free_hot_page(struct page *page); extern void free_cold_page(struct page *page); +#define gfp_mask(m) ((__pa(MAX_DMA_ADDRESS - 1) & (m)) ? 0 : __GFP_DMA) + +#define alloc_pages_mask(gfp, size, mask) \ + alloc_pages((gfp) | gfp_mask(mask), get_order(size)) +#define get_pages_mask(gfp, size, mask) \ + __get_free_pages((gfp) | gfp_mask(mask), get_order(size)) +#define __free_pages_mask(p, s) __free_pages((p), get_order(s)) +#define free_pages_mask(addr, s) free_pages((unsigned long)(addr), get_order(s)) + +#define __get_dma_pages(gfp_mask, order) \ + __get_free_pages((gfp_mask) | GFP_DMA, (order)) + +#define get_page_mask(gfp, mask) get_pages_mask((gfp), PAGE_SIZE, mask) +#define alloc_page_mask(gfp, mask) alloc_pages_mask((gfp), PAGE_SIZE, mask) + +#define __free_page_mask(page) __free_pages_mask(page, PAGE_SIZE) +#define free_page_mask(addr) free_pages_mask((addr), PAGE_SIZE) + #define __free_page(page) __free_pages((page), 0) #define free_page(addr) free_pages((addr),0) @@ -230,4 +246,8 @@ void drain_zone_pages(struct zone *zone, void drain_all_pages(void); void drain_local_pages(void *dummy); +void init_mask_zone(unsigned long trad); +void increase_mask_zone(unsigned long size); +void prepare_mask_zone(void); + #endif /* __LINUX_GFP_H */