Копия DMA в splice()

Я новичок в ядре Linux. И недавно я прошел через системный вызов sendfile в ядре 2.6.33. Вот последовательность моего путешествия:

   do_sendfile()
=> do_splice_direct()
=> splice_direct_to_actor()
=> do_splice_to()
=> do_splice_from()
=> splice_read,splice_write

В этой последовательности я не нашел места, где вставка использует копию DMA. Так где же происходит копирование DMA?


person sliter    schedule 28.09.2011    source источник


Ответы (2)


Splice не копирует DMA. На самом деле основное использование splice заключается в том, чтобы вообще избежать копирования - он пытается передать ссылки на страницы памяти вместо копирования буферов.

DMA, упомянутый в отношении сращивания, произойдет на «листе» — источник этих страниц, на которые сплайсинг передает ссылки, будет создан, например, DMA контроллера диска в буфер и будет отправлен DMA контроллера Ethernet. содержимого страницы как части пакета - по крайней мере, в "идеальном" сценарии нулевого копирования, что труднодостижимо и редко.

Splice не выполняет прямой доступ к памяти — он не допускает копирования между первым прямым доступом к памяти и последним.

person gby    schedule 29.09.2011
comment
Привет gby, спасибо за ваш ответ, это действительно полезно. Итак, если я правильно понимаю, что вы сказали, последовательность сращивания будет такой: копирование DMA с диска в буфер fd_in; Буфер fd_in передает ссылку на страницу в буфер fd_out по каналу; Карта Ethernet обращалась непосредственно к буферу fd_in для фактических данных, просматривая ссылки в буфере fd_out. - person sliter; 30.09.2011
comment
@sliter да, это идея. - person gby; 01.10.2011

Насколько я понимаю, инфраструктура splice_* делает все возможное, чтобы свести к минимуму объем фактического копирования. В лучшем случае читатель читает с того же набора страниц, что и писатель.

На LWN есть отличные статьи, описывающие различные элементы splice(), включая новый системный вызов.

person stsquad    schedule 29.09.2011
comment
Привет, stsquad, спасибо за ответ. Я посмотрю там. - person sliter; 30.09.2011