Проект адаптации драйверов 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 | Выполнено |