On Tue, Oct 16, 2012 at 12:27:55PM +0200, Hiroshi Doyu wrote:
Hi Russell,
Russell King - ARM Linux linux@arm.linux.org.uk wrote @ Tue, 16 Oct 2012 10:59:28 +0200:
On Tue, Oct 16, 2012 at 09:04:34AM +0300, Hiroshi Doyu wrote:
In addition to those contiguous/discontiguous page allocation, is there any way to _import_ anonymous pages allocated by a process to be used in dma-mapping API later?
I'm considering the following scenario, an user process allocates a buffer by malloc() in advance, and then it asks some driver to convert that buffer into IOMMU'able/DMA'able ones later. In this case, pages are discouguous and even they may not be yet allocated at malloc()/mmap().
That situation is covered. It's the streaming API you're wanting for that. dma_map_sg() - but you may need additional cache handling via flush_dcache_page() to ensure that your code is safe for all CPU cache architectures.
Remember that pages allocated into userspace will be cacheable, so a cache flush is required before they can be DMA'd. Hence the streaming API.
Is the syscall "cacheflush()" supposed to be the knob for that?
Or is there any other ones to have more precise control, "clean", "invalidate" and "flush", from userland in generic way?
No other syscalls are required - this sequence will do everything you need to perform DMA on pages mapped into userspace:
get_user_pages() convert array of struct page * to scatterlist dma_map_sg() perform DMA dma_unmap_sg() for each page in sg() page_cache_release(page);
If you get the list of pages some other way (eg, via shmem_read_mapping_page_gfp) then additional maintanence may be required (though that may be a bug in shmem - remember this stuff hasn't been well tested on ARM before.)