high-order allocation + highmem + streaming DMA - possible?
Hello.
We are writing a driver for a custom PCI device that receives large amount of data.
Device is capable of DMAing received data in 64k chunks.
We have been going to:
- use physically-continuous 64k-sized memory areas using alloc_pages() with order=4,
- allocate large number of such areas on driver init,
- implement mmap() to map those all to userspace for zero-copy processing,
- use streaming DMA to actually receive data
However I can't find a way to use streaming DMA for large highmem areas.
- pci_map_single() is for linear mapping and can't work with highmem
- pci_map_page() can work with highmem but is limited to one page
- pci_map_sg() is for s/g lists, not for single 64k blocks.
Is there a way to use streaming DMA with large memory areas located in highmem?
Or in this situation buffers in highmem can't be used?
Nikita
Hi Nikita
Quoted 5 lines · Nikita V. Youshchenko
Hello.
We are writing a driver for a custom PCI device that receives large amount of data.
Quoted 8 lines
Device is capable of DMAing received data in 64k chunks.
We have been going to:
- use physically-continuous 64k-sized memory areas usingalloc_pages()with order=4,
- allocate large number of such areas on driver init,
- implementmmap()to map those all to userspace for zero-copy processing,
- use streaming DMA to actually receive data
May i know why u want to mmap to userspace instead of using a
device? performance is affected by a large amount if u use mmap
Quoted 7 lines
However I can't find a way to use streaming DMA for large highmem areas.
-pci_map_single()is for linear mapping and can't work with highmem
-pci_map_page()can work with highmem but is limited to one page
-pci_map_sg()is for s/g lists, not for single 64k blocks.Is there a way to use streaming DMA with large memory areas located in highmem?
I dont think DMA is available for highmem? Not sure though . never saw a usecase for it.
Quoted 2 lines
Or in this situation buffers in highmem can't be used?
Signature · 2 lines
Warm Regards, Ravi .
Quoted 14 lines
Quoted 5 lines
Hello.
We are writing a driver for a custom PCI device that receives large amount of data.
Quoted 8 lines
Device is capable of DMAing received data in 64k chunks.
We have been going to:
- use physically-continuous 64k-sized memory areas usingalloc_pages()with order=4,
- allocate large number of such areas on driver init,
- implementmmap()to map those all to userspace for zero-copy processing, - use streaming DMA to actually receive data
Quoted 2 lines
May i know why u want to mmap to userspace instead of using a
device? performance is affected by a large amount if u use mmap
mmap() is done once, at initialization time, for entire data buffer. Later data is processed in zero-copy pattern.
I believe it is fastest possible solution.
Quoted 5 lines
Quoted 2 lines
Is there a way to use streaming DMA with large memory areas located in highmem?
I dont think DMA is available for highmem? Not sure though . never saw a usecase for it.
DMA is definitly available for highmem on per-page basis. I'm interested in DMA of larger blocks.
Nikita