Я работаю над сетевым драйвером на основе pcie. В разных примерах используется один из pci_alloc_consistent или dma_alloc_coherent, чтобы получить память для дескрипторов передачи и приема. Какой из них лучше, если есть, и в чем разница между ними?
разница между pci_alloc_consistent и dma_alloc_coherent
Ответы (1)
Разница тонкая, но очень важная. pci_alloc_consistent()
— это более старая функция из двух, и устаревшие драйверы все еще используют ее. Теперь pci_alloc_consistent()
просто звонит dma_alloc_coherent()
.
Разница? Тип выделенной памяти.
pci_alloc_consistent()
— выделяет память типаGFP_ATOMIC
. Распределение не спит, для использования, например. обработчики прерываний, нижние половинки.dma_alloc_coherent()
- Вы сами указываете, какой тип памяти выделять. Вы не должны использовать высокоприоритетную памятьGFP_ATOMIC
, если она вам не нужна, и в большинстве случаев вы будете в порядке сGFP_KERNEL
выделениями.
В ядре 3.18 определение pci_alloc_consistent()
очень простое, а именно:
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);
}
Короче говоря, используйте dma_alloc_coherent()
.
person
Milan
schedule
02.01.2015