Ich arbeite an pcie-basierten Netzwerktreibern. Verschiedene Beispiele verwenden eines von pci_alloc_consistent oder dma_alloc_coherent, um Speicher für Sende- und Empfangsdeskriptoren zu erhalten. Welches ist besser, wenn überhaupt und was ist der Unterschied zwischen den beiden?Unterschied zwischen pci_alloc_consistent und dma_alloc_coherent
Antwort
Der Unterschied ist subtil, aber ziemlich wichtig. pci_alloc_consistent()
ist die ältere Funktion der beiden und Legacy-Treiber verwenden es immer noch. Nowaways, pci_alloc_consistent()
ruft nur dma_alloc_coherent()
.
Der Unterschied? Der Typ des zugewiesenen Speichers.
pci_alloc_consistent()
- Ordnet Speicher vom TypGFP_ATOMIC
. Zuteilung nicht schlafen, zur Verwendung in z.B. Interrupt-Handler, unten Hälften.dma_alloc_coherent()
- Sie legen fest, welche Art von Speicher zu zuweisen. Sie sollten die hohe PrioritätGFP_ATOMIC
Speicher nicht verwenden, es sei denn, Sie benötigen es und in den meisten Fällen werden Sie mitGFP_KERNEL
Allokationen in Ordnung sein.
Kernel 3.18 Definition von pci_alloc_consistent()
ist sehr einfach, nämlich:
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);
}
Kurz gesagt, verwenden dma_alloc_coherent()
.