Skip site navigation (1) Skip section navigation (2)

Проект адаптации драйверов FreeBSD к busdma и SMPng

Содержание

Цель проекта

busdma

Интерфейсы busdma позволяют драйверам аппаратных устройств работать на различных платформах без необходимости кодирования специфичных для аппаратных платформ методов доступа непосредственно в драйверах. Это снижает затраты на поддержку драйверов для разных платформ, и увеличивает вероятность того, что драйвер будет "просто работать" на новой платформе. Модификация драйвера для использования busdma является достаточно определённым процессом, и не требует глубоких знаний ни драйвера устройства, ни функций busdma. Для busdma, используемого во FreeBSD, как правило, требуется внесение изменений двух типов: адаптация реализации busdma к работе на всех платформах, и преобразование драйверов к использованию этой технологии. Таким же образом информация о состоянии этого проекта разбита на поддержку платформ и поддержку драйверов (отсортированных по категориям). Для завершения этой работы необходим тщательный аудит системных драйверов устройств, а затем приложение усилий к преобразованию драйверов.

INTR_MPSAFE

Драйверы оборудования регистрируют свои обработчики прерываний при помощи функции bus_setup_intr(). Установка флага INTR_MPSAFE указывает коду обработки прерываний системы на вызов её процедуры без включения семафора Giant. Это даёт значительный прирост производительности в SMP-системах.

Драйверы могут устанавливать этот флаг, даже если они не являются полностью изолированными, если только их обработчик прерываний не обращается к другим структурам данных в драйвере. Простым способом обеспечить это является проверка и сброс регистров состояния аппаратных прерываний, а затем планирование обработки прерывания в очереди задач (taskqueue) или потоке выполнения ядра (kernel thread).

Отделение SMPng

Драйверы должны использовать семафоры и sx-блокировки для защиты собственных структур данных и аппаратных регистров от параллельно выполняющихся потоков. Операции с семафорами несколько ресурсоёмки, так что хорошей стратегией является комбинирование максимально возможного количества атомарных операций в одну операцию захвата семафора.

поддержка p!=a

Поддержка Intel PAE требует, чтобы указатели и физические адреса имели разный размер. Это значит, что драйверы должны быть писаться с использованием vm_paddr_t или bus_addr_t, без предположений о том, что физические адреса могут быть представлены при помощи void *. Кроме того, строки форматов и операции приведения типов должны применяться с осторожностью.

Перечень задач ниже не является полным, но представляет собой набор имеющих отношение к делу и/или важных компонентов общей работы. Поле "Ответственный" определяет разработчика, который изъявил желание отвечать за выполнение конкретной задачи; это не исключает участия других, но предполагает координацию с ответственным для избежания ненужного дублирования работы и максимально быстрого продвижения вперёд. Если начата новая работа приличного объёма, или заявленная оказалась невостребованной, то стоит оповестить по электронной почте Maxime Henrion, чтобы выяснить, имелось ли движение вперёд.

Смысл поля даты меняется в зависимости от состояния работы. Для выполненных работ она означает дату окончания или сообщения об окончании. Для задач, находящихся в процессе выполнения, оно обозначает дату последнего обновления информации по задаче. Для остановившихся задач она означает дату, когда эта задача была объявлена заброшенной. Для новых задач это поле означает дату добавления задачи к списку.

Задачи отсортированы по состоянию, а затем по дате.

Информационные ресурсы и ссылки

Набор страниц справочной системы, связанных с этим проектом, можно найти здесь:

  • Расширения физических адресов - pae(4)
  • Интерфейс отображения DMA, независимый от архитектуры и шины - bus_dma(9)
  • Машинно-зависимая часть системы виртуальной памяти (VM) - pmap(9)
  • Функции управления ресурсами - rman(9)

Состояние по поддержке платформ

Задача Ответственный Последнее обновление Состояние Примечания
alpha Andrew Gallatin 10 декабря 2002 Выполнено В системах с большим объёмом оперативной памяти могут быть проблемы.
amd64 Peter Wemm 1 июля 2003 Выполнено Поддерживается полностью.
ia64 Marcel Moolenaar 10 декабря 2002 Выполнено В системах с большим объёмом оперативной памяти могут быть проблемы.
i386 Sam Leffler 9 декабря 2002 Выполнено Поддерживается полностью.
powerpc Hiten Pandya 15 января 2003 Выполнено Поддерживается полностью.
sparc64 Thomas Möstl 6 января 2003 Выполнено Поддерживается полностью.

Состояние по драйверам сетевых интерфейсов

Драйвер Ответственный Последнее обновление busdma INTR_MPSAFE Отделение SMPng a!=p Состояние 4.x Замечания
if_ar     Не сделано Не сделано Не сделано Не сделано Не сделано kvtop()
if_bge Bill Paul 13 апреля 2004 Выполнено Выполнено Выполнено Выполнено Не сделано  
if_cp Roman Kurakin 24 июня 2004 Выполнено Выполняется Выполняется Не сделано Не применимо  
if_cs     Не сделано Не сделано Не сделано Не сделано Не сделано  
if_ct Roman Kurakin 24 июня 2004 Выполнено Выполняется Выполняется Не сделано Не сделано  
if_cx Roman Kurakin 24 июня 2004 Выполнено Выполняется Выполняется Не сделано Не сделано  
if_dc Maxime Henrion 13 апреля 2004 Выполнено Выполнено Выполнено Требует тестирования Не сделано Под вопросом использование MTX_RECURSE в случае MPSAFE
if_de Maxime Henrion 13 апреля 2004 Выполнено Не сделано Не сделано Не сделано Выполнено  
if_ed     Не сделано Не сделано Не сделано Не сделано Не сделано kvtop()
if_em Prafulla S. Deuskar 13 апреля 2004 Выполнено Выполнено Выполнено Выполнено Не сделано  
if_en Hartmut Brandt 13 апреля 2004 Выполнено Не сделано Не сделано Требует тестирования Не сделано Блокировка реализована; ещё не помечена как INTR_MPSAFE?
if_ep Warner Losh 13 апреля 2004 Не применимо Выполнено Выполнено Выполнено Не применимо Мьютекс помечен как MTX_RECURSE.
if_ex Warner Losh 13 апреля 2004 Не применимо Не сделано Не сделано Не сделано Не применимо полностью не исследована.
if_fatm Hartmut Brandt 20 июля 2004 Выполнено Требует тестирования Требует тестирования Требует тестирования Не применимо  
if_fxp Maxime Henrion 13 апреля 2004 Выполнено Выполнено Выполнено Выполнено Не сделано  
if_fwe     Не сделано Не сделано Не сделано Не сделано Не сделано  
if_gem Thomas Möstl 6 января 2003 Выполнено Не сделано Не сделано Не сделано Не применимо  
if_hatm Hartmut Brandt 20 июля 2004 Выполнено Требует тестирования Требует тестирования Требует тестирования Не применимо  
if_hme Thomas Möstl 30 января 2005 Выполнено Выполнено Выполнено Выполнено Не применимо  
if_idt     Не сделано Не сделано Не сделано Не сделано Не сделано vtophys()
if_lge     Не сделано Не сделано Не сделано Не сделано Не сделано vtophys()
if_lnc David O'Brien   Не сделано Не сделано Не сделано Не сделано Не сделано vtophys(). Пожалуйста, для получения информации/оборудования обратитесь к Poul-Henning Kamp.
if_mn     Не сделано Не сделано Не сделано Не сделано Не сделано vtophys(). Пожалуйста, для получения информации/оборудования обратитесь к Poul-Henning Kamp.
if_my     Не сделано Не сделано Не сделано Не сделано Не сделано vtophys()
if_nge   16 сентября 2004 Не сделано Не сделано Выполнено Не сделано Не сделано Не сделано vtophys()
if_pcn David O'Brien 13 апреля 2004 Не сделано Не сделано Не сделано Не сделано Не сделано vtophys(); блокировка реализована; не помечено как INTR_MPSAFE? Mutex помечен как MTX_RECURSE.
if_pdq     Не сделано Не сделано Не сделано Не сделано Не сделано по большей части поддерживает busdma, кроме vtophys()
if_re     Выполнено Выполнено Выполнено Выполнено Не применимо  
if_rl Bill Paul 13 апреля 2004 Выполнено Выполнено Выполнено Не сделано Не сделано  
if_sf   13 апреля 2004 Не сделано Не сделано Не сделано Не сделано Не сделано vtophys(); блокировка реализована; не помечено как INTR_MPSAFE? Mutex помечен как MTX_RECURSE.
if_sis Bill Paul 13 апреля 2004 Выполнено Выполнено Выполнено Не сделано Не сделано Мьютекс помечен как MTX_RECURSE.
if_sk     Не сделано Выполнено Выполнено Не сделано Не сделано vtophys()
if_sr     Не сделано Не сделано Не сделано Не сделано Не сделано vtophys()
if_ste     Не сделано Не сделано Не сделано Не сделано Не сделано vtophys()
if_ti     Не сделано Не сделано Не сделано Не сделано Не сделано  
if_tl     Не сделано Не сделано Не сделано Не сделано Не сделано  
if_tx Maxime Henrion 19 апреля 2003 Выполнено Не сделано Не сделано Требует тестирования Не сделано vtophys()
if_txp Will Andrews 18 июля 2003 Выполняется Не сделано Не сделано Не сделано Не сделано  
if_vr   23 апреля 2004 Не сделано Не сделано Не сделано Не сделано Не сделано  
if_wb     Не сделано Не сделано Не сделано Не сделано Не сделано  
if_wi Sam Leffler, Warner Losh 4 ноября 2003 Неизвестно Выполнено Неизвестно Неизвестно Неизвестно  
if_xl Maxime Henrion 13 апреля 2004 Выполнено Выполнено Выполнено Выполнено Не сделано  

Состояние по драйверам устройств хранения

Драйвер Ответственный Последнее обновление busdma INTR_MPSAFE Отделение SMPng a!=p Состояние 4.x Примечания
aac Scott Long 31 января 2005 Выполнено Выполнено Выполнено Выполнено Выполнено Не полностью поддерживает порядок следования байтов endian
adv   9 декабря 2002 Выполнено Не сделано Не сделано Не сделано Не сделано  
aha   13 апреля 2004 Выполнено Выполняется Выполняется Не сделано Не сделано Использует BUSDMA, но может путать адрес шины с адресом хоста
ahb   9 декабря 2002 Выполнено Не сделано Не сделано Не сделано Не сделано  
ahc Justin T. Gibbs 31 января 2005 Выполнено Не сделано Не сделано Выполнено Выполнено  
ahd Justin T. Gibbs 31 января 2005 Выполнено Не сделано Не сделано Выполнено Выполнено  
amd   14 декабря 2002 Выполнено Не сделано Не сделано Не сделано Не сделано  
amr Scott Long 30 января 2005 Выполнено Выполнено Выполнено Выполнено Не сделано  
asr   4 января 2003 Не сделано Не сделано Не сделано Не сделано Не сделано vtophys(). Требует большой переделки. Желательна новая технология I2O.
ata Søren Schmidt 9 декабря 2002 Выполнено Выполнено Выполнено Выполнено Не сделано  
buslogic     Не сделано Не сделано Не сделано Не сделано Не сделано vtophys()
ciss   9 декабря 2002 Выполнено Не сделано Не сделано Не сделано Не сделано  
ct     Не сделано Не сделано Не сделано Не сделано Не сделано  
dpt     Не сделано Не сделано Не сделано Не сделано Не сделано vtophys()
ida   9 декабря 2002 Выполнено Не сделано Не сделано Не сделано Не сделано  
iir   30 января 2005 Выполнено Не сделано Не сделано Не сделано Не сделано Требует больших усилий для совместимости с API busdma.
isp   8 февраля 2003 Выполнено Выполнено Не сделано Не сделано Не сделано  
ips Scott Long 30 января 2005 Выполнено Выполнено Выполнено Выполнено Выполнено  
mlx Scott Long 8 февраля 2003 Выполнено Выполняется Выполняется Не сделано Не сделано  
mly Scott Long 8 февраля 2003 Выполнено Выполняется Выполняется Не сделано Не сделано  
mpt   9 декабря 2002 Выполнено Выполнено Не сделано Не сделано Не сделано  
ncr     Не сделано Не сделано Не сделано Не сделано Не сделано vtophys(). Пожалуйста, обратитесь к Poul-Henning Kamp для выяснения возможности получить оборудование.
pst     Не сделано Выполнено Не сделано Не сделано Не сделано vtophys()
stg   9 декабря 2002 Выполнено Не сделано Не сделано Не сделано Не сделано По крайней мере выглядит как хорошо работающий.
sym   19 декабря 2002 Выполнено Не сделано Не сделано Не сделано Не сделано  
trm Olivier Houchard 9 декабря 2002 Выполнено Не сделано Не сделано Не сделано Не сделано  
twe   9 декабря 2002 Выполнено Не сделано Не сделано Не сделано Не сделано  
wds   2 февраля 2005 Выполнено Не сделано Не сделано Не сделано Выполнено  

Состояние по драйверам разных устройств

Драйвер Ответственный Последнее обновление busdma INTR_MPSAFE отделение SMPng a!=p состояние 4.x Примечания
agp Olivier Houchard 23 января 2003 Выполняется Не сделано Не сделано Не сделано Не сделано vtophys()
bktr Olivier Houchard 15 января 2003 Выполняется Не сделано Не сделано Не сделано Не сделано vtophys()
digi     Не сделано Не сделано Не сделано Не сделано Не сделано vtophys()
drm Eric Anholt 27 октября 2003 Выполняется Выполнено Выполнено Выполняется Выполняется vtophys(). Блокировку нужно немного пересмотреть.
fb     Не сделано Не сделано Не сделано Не сделано Не сделано vtophys()
firewire Hidetoshi Shimokawa 17 апреля 2003 Выполнено Не сделано Не сделано Выполнено Не сделано vtophys()
hfa     Не сделано Не сделано Не сделано Не сделано Не сделано vtophys()
hifn Sam Leffler 13 апреля 2004 Выполнено Выполнено Выполнено Не сделано Не сделано  
musycc     Не сделано Не сделано Не сделано Не сделано Не сделано vtophys(). Пожалуйста, за информацией/оборудованием обратитесь к Poul-Henning Kamp.
pcm Olivier Houchard 20 февраля 2003 Выполнено Выполнено Не сделано Не сделано Не сделано  
ubsec Sam Leffler 13 апреля 2004 Выполнено Выполнено Выполнено Не сделано Не сделано vtophys() использует для отладки printf
usb John-Mark Gurney 24 июля 2003 Выполнено Не сделано Не сделано Требует тестирования Не сделано a!=p должно работать, однако требуется дополнительное тестирование

Состояние по документированию

Задача Ответственный Последнее обновление Состояние Примечания
справочные страницы по busdma API Hiten Pandya 15 января 2003 Выполнено