*参照元 [#w44ab9ea]
#backlinks

*説明 [#rd397b74]
-パス: [[linux-4.4.1/drivers/staging/android/ion/ion_heap.c]]

-FIXME: これは何?
--説明


**引数 [#y2540aac]
-struct ion_heap *heap
--
--[[linux-4.4.1/ion_heap]]
-struct ion_buffer *buffer
--
--[[linux-4.4.1/ion_buffer]]
-struct vm_area_struct *vma
--
--[[linux-4.4.1/vm_area_struct]]


**返り値 [#sadd0e28]
-int
--


**参考 [#f3e2ad5b]


*実装 [#o9c9da8f]
 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;
 
-
--[[linux-4.4.1/sg_table]]
--[[linux-4.4.1/PAGE_SIZE]]
--[[linux-4.4.1/scatterlist]]

         for_each_sg(table->sgl, sg, table->nents, i) {
-
--[[linux-4.4.1/for_each_sg()]]

                 struct page *page = sg_page(sg);
                 unsigned long remainder = vma->vm_end - addr;
                 unsigned long len = sg->length;
 
-
--[[linux-4.4.1/page]]
--[[linux-4.4.1/sg_page()]]

                 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;
-
--[[linux-4.4.1/min()]]
--[[linux-4.4.1/remap_pfn_range()]]
--[[linux-4.4.1/page_to_pfn()]]

                 addr += len;
                 if (addr >= vma->vm_end)
                         return 0;
         }
         return 0;
 }


*コメント [#wee315d6]


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