static void *ion_page_pool_alloc_pages(struct ion_page_pool *pool) { struct page *page; struct scatterlist sg; page = alloc_pages(pool->gfp_mask & ~__GFP_ZERO, pool->order); if (!page) return NULL; if (pool->gfp_mask & __GFP_ZERO) if (ion_heap_high_order_page_zero( page, pool->order, pool->should_invalidate)) goto error_free_pages; sg_init_table(&sg, 1); sg_set_page(&sg, page, PAGE_SIZE << pool->order, 0); sg_dma_address(&sg) = sg_phys(&sg); dma_sync_sg_for_device(NULL, &sg, 1, DMA_BIDIRECTIONAL); return page; error_free_pages: __free_pages(page, pool->order); return NULL; }
static void *ion_page_pool_alloc_pages(struct ion_page_pool *pool) { struct page *page; page = alloc_pages(pool->gfp_mask & ~__GFP_ZERO, pool->order); if (!page) return NULL; if (pool->gfp_mask & __GFP_ZERO) if (ion_heap_high_order_page_zero(page, pool->order)) goto error_free_pages; return page; error_free_pages: __free_pages(page, pool->order); return NULL; }