I am working on pcie based network driver. Different examples use one of pci_alloc_consistent or dma_alloc_coherent to get memory for transmission and reception descriptors. Which one is better if any and what is the difference between the two?
Asked
Active
Viewed 8,217 times
1 Answers
18
The difference is subtle but quite important.
pci_alloc_consistent()
is the older function of the two and legacy drivers still use it.
Nowadays, pci_alloc_consistent()
just calls dma_alloc_coherent()
.
The difference? The type of the allocated memory.
pci_alloc_consistent()
- Allocates memory of typeGFP_ATOMIC
. Allocation does not sleep, for use in e.g. interrupt handlers, bottom halves.dma_alloc_coherent()
- You specify yourself what type of memory to allocate. You should not use the high priorityGFP_ATOMIC
memory unless you need it and in most cases, you will be fine withGFP_KERNEL
allocations.
Kernel 3.18 definition of pci_alloc_consistent()
is very simple, namely:
static inline void *
pci_alloc_consistent(struct pci_dev *hwdev, size_t size,
dma_addr_t *dma_handle)
{
return dma_alloc_coherent(hwdev == NULL ? NULL : &hwdev->dev, size, dma_handle, GFP_ATOMIC);
}
In short, use dma_alloc_coherent()
.