*参照元 [#t7ec07b6] #backlinks *説明 [#p9a36d38] -パス: [[linux-4.4.1/drivers/media/v4l2-core/videobuf2-dma-sg.c]] -FIXME: これは何? --説明 **引数 [#p5922ce9] -struct vb2_dma_sg_buf *buf -- --[[linux-4.4.1/vb2_dma_sg_buf]] -gfp_t gfp_flag -- --[[linux-4.4.1/gfp_t]] **返り値 [#tf31d97d] -int -- **参考 [#r508527f] *実装 [#x478554b] static int vb2_dma_sg_alloc_compacted(struct vb2_dma_sg_buf *buf, gfp_t gfp_flags) { unsigned int last_page = 0; int size = buf->size; while (size > 0) { struct page *pages; int order; int i; - --[[linux-4.4.1/page]] order = get_order(size); /* Dont over allocate*/ if ((PAGE_SIZE << order) > size) order--; - --[[linux-4.4.1/get_order()]] pages = NULL; while (!pages) { pages = alloc_pages(GFP_KERNEL | __GFP_ZERO | __GFP_NOWARN | gfp_flags, order); if (pages) break; - --[[linux-4.4.1/alloc_pages()]] if (order == 0) { while (last_page--) __free_page(buf->pages[last_page]); return -ENOMEM; } order--; - --[[linux-4.4.1/__free_page()]] } split_page(pages, order); for (i = 0; i < (1 << order); i++) buf->pages[last_page++] = &pages[i]; - --[[linux-4.4.1/split_page()]] size -= PAGE_SIZE << order; } return 0; } *コメント [#bd3e02c4]