Я работаю над сетевым драйвером pcie. В разных примерах используется один из pci_alloc_consistent или dma_alloc_coherent, чтобы получить память для дескрипторов передачи и приема. Какой из них лучше, если он есть, и в чем разница между ними?разница между pci_alloc_consistent и dma_alloc_coherent
6
A
ответ
10
Разница тонкая, но весьма важная. pci_alloc_consistent()
- это более старая функция двух и старых драйверов, которые все еще используют его. В настоящее время, pci_alloc_consistent()
просто звонит dma_alloc_coherent()
.
Разница? Тип выделенной памяти.
pci_alloc_consistent()
- Выделяет память типаGFP_ATOMIC
. Выделение не сном для использования, например. обработчики прерываний, нижние половины.dma_alloc_coherent()
- Вы указываете себе, какой тип памяти выделить. Вам не следует использовать высокоприоритетную памятьGFP_ATOMIC
, если вам это не нужно, и в большинстве случаев с вами будет штрафGFP_KERNEL
ассигнований.
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()
.