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?
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()
.
© 2022 - 2024 — McMap. All rights reserved.