dma_map_single и dma_map_page

Я хочу сделать dma из нескольких кадров, чтобы отправить большой кадр (джамбо). Я могу отправить обычный кадр (размером 1500). Мне нужны некоторые сомнения по dma.

  1. В чем реальное преимущество dma_map_single() перед другими API. Мы могли бы делать все с dma_map_page, верно?

  2. Предположим, нам нужно передать большой кадр (джамбо) в драйвер, и я сохранил этот кадр в нескольких буферах. Эти буферы не являются смежными ни в физической, ни в виртуальной памяти. Но эти буферы находятся в пространстве ядра. Как мы можем отправить его как один кадр. Должны ли мы использовать разброс-собрать dma?. Возможно ли это с другим dma_api?


person user1776817    schedule 26.10.2012    source источник


Ответы (1)


  1. dma_map_single и dma_map_page в конечном итоге вызовут dam_ops->map_page — конечная функция определяется архитектурой и конфигурацией ядра. обычно это будет intel_map_page на машинах x86 с IOMMU.
  2. Во-первых, Jumbo-кадры с точки зрения ядра не имеют значения во время передачи, поскольку сетевой стек объединяет переданные буферы в пакеты размером до 64 КБ (LSO/TSO), и сетевой адаптер в конечном итоге разбивает один пакет 64 КБ на несколько MTU (9 КБ/1500 в ETH). ) пакетов, каждый со своими заголовками L3.

На ваш вопрос в SKB может быть разбросанный список - каждый буфер затем dma-mapped. Затем список dma-адресов и длин буферов записывается в дескрипторе отправки для сетевой карты, которая знает, как объединить их все вместе для отправки.

И, кстати, в ядре есть API dma_map_sg для списков разброса, и он вернет список разброса со списком адресов dma. Обычно это не имеет отношения к драйверам сетевой карты.

person user3396914    schedule 08.03.2014