参照元

説明

引数

返り値

参考

実装

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;
                order = get_order(size);
                /* Dont over allocate*/
                if ((PAGE_SIZE << order) > size)
                        order--;
                pages = NULL;
                while (!pages) {
                        pages = alloc_pages(GFP_KERNEL | __GFP_ZERO |
                                        __GFP_NOWARN | gfp_flags, order);
                        if (pages)
                                break;
                        if (order == 0) {
                                while (last_page--)
                                        __free_page(buf->pages[last_page]);
                                return -ENOMEM;
                        }
                        order--;
                }

                split_page(pages, order);
                for (i = 0; i < (1 << order); i++)
                        buf->pages[last_page++] = &pages[i];
                size -= PAGE_SIZE << order;
        }

        return 0;
}

コメント


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-02-08 (月) 18:51:36