参照元

説明

引数

返り値

参考

実装

int ion_heap_map_user(struct ion_heap *heap, struct ion_buffer *buffer,
                      struct vm_area_struct *vma)
{
        struct sg_table *table = buffer->sg_table;
        unsigned long addr = vma->vm_start;
        unsigned long offset = vma->vm_pgoff * PAGE_SIZE;
        struct scatterlist *sg;
        int i;
        int ret;
        for_each_sg(table->sgl, sg, table->nents, i) {
                struct page *page = sg_page(sg);
                unsigned long remainder = vma->vm_end - addr;
                unsigned long len = sg->length;
                if (offset >= sg->length) {
                        offset -= sg->length;
                        continue;
                } else if (offset) {
                        page += offset / PAGE_SIZE;
                        len = sg->length - offset;
                        offset = 0;
                }
                len = min(len, remainder);
                ret = remap_pfn_range(vma, addr, page_to_pfn(page), len,
                                vma->vm_page_prot);
                if (ret)
                        return ret;
                addr += len;
                if (addr >= vma->vm_end)
                        return 0;
        }
        return 0;
}

コメント


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-03-16 (水) 10:16:24