GFP_KERNEL против GFP_DMA и kmalloc () против dma_alloc_coherent () - PullRequest
0 голосов
/ 05 октября 2018

Я всегда использую dma_alloc_coherent () для выделения буфера DMA с флагом GFP_KERNEL и до сих пор не обнаружил проблем, мое понимание состоит в том, что оба флага позволяют вызывающему абоненту спать также ..

Так что мне просто любопытноесли опция GFP_DMA действительно полезна в этом случае?Также флаг доступен для kmalloc (), однако разве мы не должны использовать kmalloc () для выделения буфера DMA, а только dma apis?

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

dma_alloc_coherent () возвращает диапазон адресов, для которых уже установлены надлежащие атрибуты памяти, поэтому эффект кэширования обрабатывается естественным образом.Нам не нужно выполнять какие-либо операции с кешем для этих адресов.

Если мы используем адрес, выделенный kmalloc () для операции DMA, нам нужно выполнить дополнительную операцию кеширования, такую ​​как очистка кеша и аннулирование кеша в зависимости от направления передачи.

Флаг GFP_DMA просто выделяет память из зоны DMA на 32-битной машине.

0 голосов
/ 06 октября 2018

После некоторых исследований я нашел следующее утверждение из LLD 3-го издания, глава 8:

Всякий раз, когда для выполнения запроса на выделение памяти выделяется новая страница, ядро ​​создает список зон, которые можно использовать при поиске.,Если указано _ _GFP_DMA, выполняется поиск только зоны DMA: если по низким адресам нет доступной памяти, происходит сбой выделения.Если специального флага нет, выполняется поиск как в обычной памяти, так и в памяти DMA.

, поэтому флаг GFP_DMA является подмножеством GFP_KERNEL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...