DMA копия в соединении () - PullRequest
       35

DMA копия в соединении ()

3 голосов
/ 28 сентября 2011

Я новичок в ядре 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?

Ответы [ 2 ]

4 голосов
/ 29 сентября 2011

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

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

Splice не выполняет DMA - он не позволяет копировать между первым DMA и последним.

1 голос
/ 29 сентября 2011

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

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

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