PCI DMA to user mem on mpc83xx
David Laight
David.Laight at ACULAB.COM
Tue May 24 18:15:03 EST 2011
> we have a pretty old PCI device driver here that needs some
> basic rework running on 2.6.27 on several MPC83xx.
> It's a simple char-device with "give me some data" implemented
> using read() resulting in zero-copy DMA to user mem.
>
> There's get_user_pages() working under the hood along with
> SetPageDirty() and page_cache_release().
Does that dma use the userspace virtual address, or the
physical address - or are you remapping the user memory into
kernel address space.
If the memory is remapped into the kernel address space, the
cost of the mmu and tlb operations (especially on MP systems)
is such that a dma to kernel memory followed by copyout/copytouser
may well be faster!
That may even be the case even if the dma is writing to the
user virtual (or physical) addresses when it is only
necessary to ensure the memory page is resident and that
the caches are coherent.
In any case the second copy is probably far faster than the
PCI one!
I've recently written driver that supports a pread/pwrite interface
to the memory windows on a PCIe card. It was important to use
dma for the PCIe transfers (to get a sensible transfer size).
I overlapped the copyin/copyout with the next dma transfer.
The dma's are fast enough that it is worth spinning waiting
for completion - but slow enough to make the overlapped
operation worthwhile (same speed as a single word pio transfer).
David
More information about the Linuxppc-dev
mailing list