Re: can device drivers return non-ram via vm_ops->nopage?

From: Russell King
Date: Sun Mar 21 2004 - 18:47:41 EST


On Sun, Mar 21, 2004 at 03:11:58PM -0800, Linus Torvalds wrote:
> On Sun, 21 Mar 2004, Russell King wrote:
> > Remember that we're fond of telling driver writers to use scatter gather
> > lists rather than grabbing one large contiguous memory chunk... So
> > they did exactly as we told them. Using pci_alloc_consistent and/or
> > dma_alloc_coherent and built their own scatter lists.
>
> I do think that we should introduce a "map_dma_coherent()" thing, which
> basically takes a list of pages that have been allocated by
> dma_alloc_coherent(), and remaps them into user space. How hard can that
> be?
>
> In fact, on a lot of architectures (well, at least x86, and likely
> anything else that doesn't use any IOTLB and just allocates a chunk of
> physical memory), I think the "map_dma_coherent()" thing should basically
> just become a "remap_page_range()". Ie something like
>
> #define map_dma_coherent(vma, vaddr, len) \
> remap_page_range(vma, vma->vm_start, __pa(vaddr), len, vma->vm_page_prot)
>
> for the simple case.

Ok, splitting hairs, for the coherent contiguous case, what about:

int dma_coherent_map(struct vm_area_struct *vma, void *cpu_addr,
dma_addr_t dma_addr, size_t size);

and x86 would be:

#define dma_coherent_map(vma,cpu_addr,dma_addr,size) \
remap_page_range(vma, vma->vm_start, __pa(cpu_addr), \
size, vma->vm_page_prot)

This then leaves the PCI BAR case and the DMA coherent SG buffer case,
though neither of those fall within my personal problem space at present.

--
Russell King
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of: 2.6 PCMCIA - http://pcmcia.arm.linux.org.uk/
2.6 Serial core
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/