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