Skip to contentSkip to conversation

high-order allocation + highmem + streaming DMA - possible?

DISCUSSION Nikita V. Youshchenko 2 participants 3 messages Oct 19, 2011

lore
Share & tools
lore
#0 lore raw

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

#1 lore raw

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 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

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 .
#2 lore raw
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 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

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