LINUX.ORG.RU

Хочу уточнить смысл работы со scatter list и DMA

 


0

4

Читаю LDD 3. Scatter list используются, когда нет возможности выделить один непрерывный буфер для обмена через DMA. Значит создаем и заполняем данными несколько буферов. Инициализируем массив структур типа scatterlist соответствующими параметрами созданных ранее буферов (пусть массив будет называться sg, для определенности). Теперь выполняем dma_map_sg(..., sg, ...). Теперь в элементах sg должны быть прописаны шинные адреса, с которыми может работать контроллер DMA. А возвращается нам актуальное число (N) элементов sg, так как dma_map_sg мог некоторые сшить/объединить. Но теперь в соответствии с LDD нужно опять последовательно для каждого из этих N элементов sg получать шинный адрес и длину (sg_dma_address и sg_dma_len) и отдавать их контроллеру DMA. Т.е. в итоге получается, что все равно приходится отрабатывать с каждым буфером последовательно и по отдельности? Ради чего тогда все это городилось? Ну может быть IOMMU некоторые буфера «сшил». И это вся польза? Или все-таки есть некоторые DMA контроллеры, которые могут работать напрямую со scatterlist? Или я что-то не понимаю?

Ради чего тогда все это городилось?

Не факт, что изначальные буфера вообще доступны для DMA (в свопе лежат, например),

dma_map_sg
гарантирует это и выдает шинные адреса буферов.

Т.е. в итоге получается, что все равно приходится отрабатывать с каждым буфером последовательно и по отдельности?

Или все-таки есть некоторые DMA контроллеры, которые могут работать напрямую со scatterlist?

Ну, так-то это одна из основных функций DMA-контроллеров... Только может работать по-разному. У нас в конторе, например, свой PCIe-DMA работает с постраничным scatter-gather, т.е. ему вообще насрать насколько большие буфера, подавай набор страниц.

Kosyak ★★★★
()

Да, может IOMMU и сшивает на некоторых современных платформах эти буфера, однако Linux портабельная ОС и полагаться на частные случае не нужно. Если я не ошибаюсь.

А тебе зачем? Я сейчас работаю в своем драйвере чем один dma_map_single, но хотел бы перейти на dma_map_sg чтобы сразу кучу буферов выделять. У тебя практическая задача или так, чисто теоретически тыкаешься?

P.S. Моя тема: сцыль.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Задача то самая что ни на есть практическая. Хотя вопрос скорее чисто утчоняющий получился. Просто возник в процессе более внимательного изучения проблемы. Драйвер то есть. Но он не слишком подходит для решаемой задачи. Приходится переделывать. Но практика показывает, что и модифицированный и исходный работают не стабильно. Единичные операции проходят, а на сериях он падает. То ли в драйвере косяк, то ли в железке. Железка не умеет scatter gather. Поэтому как раз думаю уйти в сторону dma_map_single от dma_map_sg по пути упрощения. Может упрощение поможет. А может даже попробую вообще dma_declare_coherent_memory, чтобы туда сюда не мапить память.

zloy_starper ★★★
() автор топика
Ответ на: комментарий от zloy_starper

Можно твой код глянуть, по части как ты этот sg_list объявляешь и инициализируешь? А то я пытался с наскока это осилить, но не нашел хороших примеров, что там куда сначала выделять и тому подобное.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Завтра может что-нибудь покажу. Только тут есть проблемка. Оригинальный драйвер устроен так, что он получает scatter list уже готовый, а сам делает несколько замысловатый ремапинг. А в драйвере, который я «выстрогал» под собственные нужды, не факт, что там делается все праильно.

zloy_starper ★★★
() автор топика

Или все-таки есть некоторые DMA контроллеры, которые могут работать напрямую со scatterlist?

Да. Например, в мосте pci-vme на чипе tsi148. Формат списка у них свой, естественно.

anonymous
()
Ответ на: комментарий от anonymous

Да. Например, в мосте pci-vme на чипе tsi148. Формат списка у них свой, естественно.

Ну понятно. Значит указанные механизмы из LDD используем для формирования правильного для DMA списка адресов буферов. А затем уже из этого списка формируем scatter/gather список в том виде, который переваривает конкретная железка. Ну какой же я тупой, что сразу не допетрил.

zloy_starper ★★★
() автор топика

Здесь кусок кода драйвера http://paste.org.ru/?3jdine

Он немного кривоватенький, хотя бы потому, что по большому счету в scatter листах нет необходимости, так как все равно используется один буфер. Так что надо будет переделать в варианте с dma_map_single, или даже лучше использовать dma_alloc_coherent, чтобы не мапить буфера при каждом новом обращении. Но это работает, хотя вряд ли сильно поможет разобраться, как формировать scatter листы.

zloy_starper ★★★
() автор топика
Ответ на: комментарий от zloy_starper

А затем уже из этого списка формируем scatter/gather список в том виде, который переваривает конкретная железка

Мне это показалось очевидным сразу :) Ведь sg_list в ядре содержит кучу полей и данных, а железка допустим знает что все буферы 4К посему каждый DMA-дескриптор будет тупо 32-битный адрес и всё.

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.