*参照元 [#m81896d3] #backlinks *説明 [#v6a0a75b] -パス: [[linux-4.4.1/drivers/staging/android/ion/ion_carveout_heap.c]] -FIXME: これは何? --説明 **引数 [#y317538a] - -struct ion_heap *heap -- --[[linux-4.4.1/ion_heap]] -struct ion_buffer *buffer -- --[[linux-4.4.1/ion_buffer]] -unsigned long size -- -unsigned long align -- -unsigned long flags -- **返り値 [#jdd4a0d7] - -int -- **参考 [#vbb68662] *実装 [#oa77e234] static int ion_carveout_heap_allocate(struct ion_heap *heap, struct ion_buffer *buffer, unsigned long size, unsigned long align, unsigned long flags) { struct sg_table *table; ion_phys_addr_t paddr; int ret; - --[[linux-4.4.1/sg_table]] --[[linux-4.4.1/ion_phys_addr_t]] if (align > PAGE_SIZE) return -EINVAL; - --[[linux-4.4.1/PAGE_SIZE]] table = kmalloc(sizeof(struct sg_table), GFP_KERNEL); if (!table) return -ENOMEM; ret = sg_alloc_table(table, 1, GFP_KERNEL); if (ret) goto err_free; - --[[linux-4.4.1/kmalloc()]] --[[linux-4.4.1/sg_alloc_table()]] paddr = ion_carveout_allocate(heap, size, align); if (paddr == ION_CARVEOUT_ALLOCATE_FAIL) { ret = -ENOMEM; goto err_free_table; } - --[[linux-4.4.1/ion_carveout_allocate()]] sg_set_page(table->sgl, pfn_to_page(PFN_DOWN(paddr)), size, 0); buffer->priv_virt = table; - --[[linux-4.4.1/sg_set_page()]] --[[linux-4.4.1/pfn_to_page()]] --[[linux-4.4.1/PFN_DOWN()]] return 0; err_free_table: sg_free_table(table); err_free: kfree(table); return ret; - --[[linux-4.4.1/sg_free_table()]] --[[linux-4.4.1/kfree()]] } *コメント [#zfe73ed9]