*参照元 [#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]


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS