разница между pci_alloc_consistent и dma_alloc_coherent

Я работаю над сетевым драйвером на основе pcie. В разных примерах используется один из pci_alloc_consistent или dma_alloc_coherent, чтобы получить память для дескрипторов передачи и приема. Какой из них лучше, если есть, и в чем разница между ними?


person bdubey    schedule 28.12.2014    source источник


Ответы (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