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

Проект FreeBSD SMP

Содержание

Цель проекта

Проект FreeBSD Symmetric MultiProcessing (SMP), часто именуемый как SMPng (SMP следующего поколения), направлен на реализацию поддержки SMP до уровня мелких структур в ядре FreeBSD. Впервые эта поддержка появилась в январе 2003 года в 5.0-RELEASE. По историческим причинам развития FreeBSD, это было похоже на попытку протиснуть квадратный ящик через круглую дыру, и поэтому промежуточные результаты не были столь хороши по многим параметрам. Мы целенаправленно не пытаемся ни переписать ядро с нуля, ни изменить все архитектурные особенности, имеющиеся в ядре. Этот проект направлен на практическую реализацию, а не теоретические исследования.

План работы проекта

На этой Web-странице содержится информация, относящаяся к попыткам улучшить поддержку SMP во FreeBSD. В целом проект использует всё возможное из разрабатываемого ядра BSD/OS 5.0, и повторно реализует то, что нельзя использовать напрямую, из-за различий в основном коде.

Как и для любого некоммерческого проекта, разработка детального плана работ невозможна. Мы ожидаем получить значительного улучшения производительности и стабильности, проблемы с которыми должны быть решены в течение первых нескольких месяцев работы над проектом, хотя все возможные усилия будут прилагаться и к сохранению работоспособности -current.

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

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

Процесс приведения к механизму блокировки отдельных драйверов устройств отслеживается на Web-странице преобразования драйверов busdma и SMPng.

Информация о блокировке стека сетевых протоколов размещена на Web-странице netperf Роберта Уотсона и Web-странице Netperf Web-сайта FreeBSD.org.

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

Ресурсы и ссылки

Подсистемы и их разработчики

Это неполный перечень высокоуровневых подсистем ядра и тех, кто активно работает над архитектурой SMP и её стабильностью.

Подсистема Состояние Последнее обновление Разработчики
Newbus Выполняется 5 октября 2003 Warner Losh
VM Выполняется 4 октября 2003 Alan L. Cox
Кэш-буфер Выполняется 4 октября 2003 Jeff Roberson, Poul-Henning Kamp
VFS Выполняется 4 октября 2003 Jeff Roberson
Процессы и операции с потоками Выполняется 5 мая 2003 John Baldwin
Планировщик Выполняется 23 апреля 2004 John Baldwin, Jeff Roberson
GEOM Выполнено 5 февраля 2003 Poul-Henning Kamp
Файловые дескрипторы Выполнено 5 февраля 2003 Alfred Perlstein, Seigo Tanimura Robert Watson
Подсистема TTY Выполняется 24 июля 2004 Poul-Henning Kamp
Конвейерные IPC Выполнено 4 октября 2003 Alfred Perlstein
Структуры сокетов и системные вызовы Выполнено 25 ноября 2004 Sam Leffler, Robert Watson
KQueue Выполнено 24 ноября 2004 John-Mark Gurney, Brian Feldman
IPv4, IPv6 Выполняется 23 апреля 2004 Jennifer Yang, Jeffrey Hsu, Sam Leffler, Robert Watson, George V. Neville-Neil
IPX/SPX Выполняется 23 апреля 2004 Roman Kurakin, Robert Watson
netatalk Выполняется 24 ноября 2004 Robert Watson
Инфраструктура сетевого стека Выполняется 4 октября 2003 Jeffrey Hsu, Sam Leffler, Robert Watson, Max Laier, Luigi Rizzo, Maurycy Pawlowski-Wieronski <maurycy@fouk.org>, Brooks Davis, Roman Kurakin
Клиент NFS Не начиналось 23 апреля 2004  
Сервер NFS Выполняется 24 ноября 2004 Robert Watson

Работы

Далее следует неполный перечень работ общего характера.

Задача Ответственный Последнее обновление Состояние
Преобразовать giant-блокировки от типа spinning к blocking, добавить блокировку планировщика и простаивающие процессы для каждого процессора. Matt Dillon 25 июня 2000 Выполнено
Перенос примитивов блокировки из BSD/OS (i386). Jake Burkholder 3 июля 2000 Выполнено
Реализовать тяжёлые потоки выполнения для прерываний (i386). Greg Lehey 3 августа 2000 Выполнено
Переписать низкоуровневый код прерываний (i386 UP). Greg Lehey 3 августа 2000 Выполнено
Добиться достаточной стабильности (построение полной системы на самом хосте) (i386 UP). разработчики -smp 12 августа 2000 Выполнено
Перенос примитивов блокировки из BSD/OS (alpha). Doug Rabson 24 августа 2000 Выполнено
Заменить заглушками (отключить) вызовы spl(). Greg Lehey 30 августа 2000 Выполнено
Перенос кода ktr из BSD/OS. Greg Lehey, John Baldwin 30 августа 2000 Выполнено
Переписать низкоуровневый код обработки прерываний (i386 SMP). John Baldwin 1 сентября 2000 Выполнено
Добиться достаточной стабильности (построение полной системы на самом хосте) (i386 SMP). -smp developers 6 сентября 2000 Выполнено
Добиться достаточной стабильности (построение полной системы на самом хосте) (alpha). -smp developers 6 сентября 2000 Выполнено
Сделать malloc и сопутствующие функции работающими с потоками выполнения. Jason Evans 10 сентября 2000 Выполнено
Реализовать обработчик msleep(), сделать tsleep() обработчиком msleep(). Jake Burkholder 11 сентября 2000 Выполнено
Сделать драйвер fxp работающим с потоками выполнения. Chuck Paterson 17 сентября 2000 Выполнено
Сделать mbuf работающими с потоками выполнения. Bosko Milekic 29 сентября 2000 Выполнено
Переработать менеджер блокировок. Jason Evans 3 октября 2000 Выполнено
Реализовать тяжёлые потоки прерываний (alpha). John Baldwin, Doug Rabson 5 октября 2000 Выполнено
Переписать низкоуровневый код обработки прерываний (alpha). Doug Rabson, John Baldwin 5 октября 2000 Выполнено
Сбор статистику по процессу. Tor Egge, John Baldwin 5 октября 2000 Выполнено
Сделать драйверы ethernet работающими с потоками. Bill Paul 15 октября 2000 Выполнено
Сделать заголовочные файлы для семафоров в основном машинно-независимыми. John Baldwin 20 октября 2000 Выполнено
Переименовать SMP_DEBUG в MUTEX_DEBUG. John Baldwin 20 октября 2000 Выполнено
Выделить каждому программному прерыванию собственный поток выполнения. Chuck Paterson 25 октября 2000 Выполнено
Сделать sf_bufs (sendfile(2)) работающим с потоками. Bosko Milekic 5 ноября 2000 Выполнено
Заставить фиксирующий код работать корректно. John Baldwin 18 ноября 2000 Выполнено
Отделить специфичный для ktr код от db_interface.c. John Baldwin 15 декабря 2000 Выполнено
Преобразовать драйвер sio к использованию spin-семафора. John Baldwin 18 декабря 2000 Выполнено
Реализовать условные переменные. Jake Burkholder, Jason Evans 15 января 2001 Выполнено
Добавить флаг к mtx_init() (MTX_RECURSE), который отмечает, можно ли использовать семафор рекурсивно. Bosko Milekic 19 января 2001 Выполнено
Сделать зонный распределитель работающим с потоками. Dag-Erling Smorgrav 21 января 2001 Выполнено
Преобразовать простые блокировки к семафорам. Jason Evans 24 января 2001 Выполнено
Сделать ядро вытесняющим в отношении прерываний. Jake Burkholder 31 января 2001 Выполнено
Вычистка API для семафоров. Bosko Milekic 8 февраля 2001 Выполнено
Удалить COM_LOCK. Mark Murray 11 февраля 2001 Выполнено
Объединить различные классы планирования в одну очередь выполнения. Модифицировать планировщик для поддержки вытесняющего ядра. Jake Burkholder 11 февраля 2001 Выполнено
Заставить распространение приоритетов работать корректно. Jake Burkholder 11 февраля 2001 Выполнено
Сделать код треда обработки прерываний машинно-независимым и совместно используемым между программными и аппаратными прерываниями. John Baldwin 18 февраля 2001 Выполнено
Добавить защиту к структуре jail и функциональности, связанной с jail. Robert Watson 20 февраля 2001 Выполнено
Реализация блокировок sx (совместные/эксклюзивные). Jason Evans 5 марта 2001 Выполнено
Обобществление/улучшение фиксации для обработки более сложных примитивов блокировки (mtx, sx). John Baldwin 28 марта 2001 Выполнено
Преобразование блокировок allproc и proctree от блокировок lockmgr к блокировкам sx. John Baldwin 28 марта 2001 Выполнено
В системе mbuf использовать условные переменные вместо msleep()/wakeup(). Bosko Milekic 2 апреля 2001 Выполнено
Удалить включаемые файлы <sys/mutex.h> из других включаемых файлов ядра, таких, как <vm/vm_zone.h>, <sys/resourcevar.h>, <sys/ucred.h> и <sys/mbuf.h>. Mark Murray 15 мая 2001 Выполнено
Зачистка различных файлов mp_machdep.c, унификация различных API для SMP, например, доставка IPI и так далее. John Baldwin 15 мая 2001 Выполнено
Сделать большинство функций forward_* и forwarded_* машинно независимыми. John Baldwin 15 мая 2001 Выполнено
Закончить машинно-зависимую часть поддержки SMP на платформе Alpha. Andrew Gallatin, Doug Rabson, John Baldwin 15 мая 2001 Выполнено
Преобразовать select() к использованию условных переменных. Seigo Tanimura 15 мая 2001 Выполнено
Добавить блокировку "giant" вокруг подсистемы VM. Alfred Perlstein 13 июня 2001 Выполнено
Создать изменённый slab-распределитель для подсистемы mbuf. Bosko Milekic 21 июня 2001 Выполнено
Добавить функцию witness_assert() для обработки добавлений блокировок. John Baldwin 27 июня 2001 Выполнено
Расширить блокировки sx для поддержки операций по попытке блокирования. John Baldwin 27 июня 2001 Выполнено
Задокументировать KTR. John Baldwin 28 июня 2001 Выполнено
Сделать fork_return, fork_exit, ast и userret машинно-независимыми. John Baldwin 29 июня 2001 Выполнено
Сделать свойство savecrit из sched_lock процесса сохраняемым и восстанавливаемым в mi_switch и инициализируемым в fork_exit. John Baldwin 30 июня 2001 Выполнено
Создать цикл ast(). John Baldwin 10 августа 2001 Выполнено
Добавить операции upgrade/downgrade блокировки sx. Alexander Kabaev, Jason Evans 13 августа 2001 Выполнено
Реализовать семафоры. Jason Evans 14 августа 2001 Выполнено
Добавить поддержку upgrade/downgrade в witness. John Baldwin 23 августа 2001 Выполнено
Сделать основной объём cpu_wait() и cpu_exit() машинно-независимым. Peter Wemm 9 сентября 2001 Выполнено
Разделить NFS на клиентскую и серверную части. Peter Wemm 18 октября 2001 Выполнено
Отделить taskqueues. Andrew Reiter, John Baldwin 25 октября 2001 Выполнено
Добавить ссылку на ucred в каждый тред. John Baldwin 25 октября 2001 Выполнено
Сделать большинство связанного с процессорами машинно-независимым. John Baldwin 11 декабря 2001 Выполнено
Сделать в критическом разделе сохраняемым состояние для каждого треда, вместо для каждой блокировки, чтобы межблокировочный цикл блокировки работал корректно. John Baldwin 17 декабря 2001 Выполнено
Заменить специфичный для APIC imen_mtx на машинно-независимый icu_lock для защиты контроллеров прерываний и связанных данных в ядре для i386 и alpha. John Baldwin 20 декабря 2001 Выполнено
Использовать в критическом разделе для каждого треда вложенный уровень в мьютексе и код треда прерывания для автоматического определения, когда не нужно вытеснять задачу. Это делает флаги MTX_NOSWITCH, SWI_SWITCH и SWI_NOSWITCH ненужными, так как ядро сможет само определить своё правильное поведение. John Baldwin 5 января 2002 Выполнено
Отделить структуры filedesc и file. Seigo Tanimura, Alfred Perlstein 12 января 2002 Выполнено
Блокировка структур pgrp, session и sigio. Seigo Tanimura 23 февраля 2002 Выполнено
Блокировка реализации конвейера, но не sigio/fown и взаимодействия с VM Alfred Perlstein 27 февраля 2002 Выполнено
Перейти к явному подсчёту ссылок на программные vnode. Poul-Henning Kamp 8 марта 2002 Выполнено
Инициализация пула мьютексов заранее, чтобы блокировки sx можно было использовать для VM. Brian Feldman 14 марта 2002 Выполнено
Поместить глобальную блокировку (sellock) вокруг структур selinfo, чтобы исправить различные обратные последовательности блокировок, и сделать select() работающим с MP. Alfred Perlstein, Chad David 14 марта 2002 Выполнено
Избавиться от Giant в системных вызовах read, write, pread, pwrite, выделяя Giant на уровне файловых операций на каждую подсистему для сокетов, VFS и так далее. Alfred Perlstein 15 марта 2002 Выполнено
Отделить структуры модулей ядра. Andrew Reiter 18 марта 2002 Выполнено
Отделить глобальные данные компоновщика ядра. Andrew Reiter 18 марта 2002 Выполнено
Переписать распределитель памяти ядра, чтобы он стал slab-распределителем, использующим кэши каждого процессора. Jeff Roberson 21 марта 2002 Выполнено
Заменить неправильное использование машинно-зависимый критический раздел API на отключение прерываний при помощи специального API по их выключению. Warner Losh, Doug Rabson, Benno Rice, John Baldwin 21 марта 2002 Выполнено
Отделить доступ к совместно используемой структуре "параметров процесса" через соответствующую защиту этой структуры и ссылок на неё. Jonathan Mini 31 марта 2002 Выполнено
Перейти от блокировок flags/tsleep на блокировки sx для защиты дерева sysctl от обновлений во время выполнения sysctl-операций. Jonathan Mini 1 апреля 2002 Выполнено
Создать/перенести пользовательский инструмент для управления дампами по KTR-событиям. Jake Burkholder 1 апреля 2002 Выполнено
Создать макросы MTX_SYSINIT и SX_SYSINIT, которые разрешены для инициализации блокировок, независящих от подсистемы. Andrew Reiter 2 апреля 2002 Выполнено
Отделить глобальную переменную уровня безопасности. Andrew Reiter 2 апреля 2002 Выполнено
Сделать grow_stack() машинно-независимой. Возможно, даже макросом или встраиваемой функцией. Alan L. Cox 6 апреля 2002 Выполнено
Блокировка использования p_fd, что в противном случае приводит к разрушению p_fd и аварийному завершению при большой нагрузке. Начать с глобальной и перейти к блокировке на уровне процесса. Alfred Perlstein, Seigo Tanimura 8 апреля 2002 Выполнено
Блокировка структуры pargs. Jonathan Mini 9 апреля 2002 Выполнено
Сделать {o,}sigreturn() MPSAFE. Alan L. Cox 11 апреля 2002 Выполнено
Переписать распределитель памяти ядра, чтобы Giant не требовался для операций malloc() или free(). Jeff Roberson 2 мая 2002 Выполнено
Заменить комплексную схему блокировки shared/exclusive в VM-системе на полностью эксклюзивную схему lockmgr, упрощая блокировку и удаление потенциальные случаи livelock/deadlock. Brian Feldman, Alan L. Cox 3 мая 2002 Выполнено
Отказаться от Giant в системных вызовах readv/writev в стиле read/write/pread/pwrite, как только malloc больше не потребуется Giant при обработке структур iovec для uio. Alan L. Cox 9 мая 2002 Выполнено
Отказаться от Giant в mprotect(), minherit() и madvise(), чтобы он больше не выделялся и не освобождался напрямую. Alan L. Cox 18 мая 2002 Выполнено
Обновить API для suser() и p_can*() API, чтобы принимать треды вместо процессов. John Baldwin 18 мая 2002 Выполнено
Широкий переход к td_ucred от p_ucred, как только появятся все зависимости от KSE. John Baldwin 18 мая 2002 Выполнено
Добавить проверку witness_sleep() к uma_zalloc() для отслеживания кода, вызывающего malloc() или uma_zalloc() при удержании неоткладываемых блокировок. John Baldwin 20 мая 2002 Выполнено
Оптимизировать поддержку UP, заменив циклы блокировки на одну, выполняющую только вход в критичный раздел и выходы. John Baldwin 21 мая 2002 Выполнено
Заставить спящие мьютексы повернуться, если текущий держатель блокировки выполняется на другом процессоре. John Baldwin 21 мая 2002 Выполнено
Добавить поддержку для pause-инструкции IA32 для передвижения циклов в блокировках. John Baldwin 21 мая 2002 Выполнено
Сделать KTRACE пишущим в трассировочные файлы асинхронно. John Baldwin 7 июня 2002 Выполнено
Избавиться от Giant в modnext(2), modfnext(2), modstat(2) и modfind(2). Andrew Reiter 25 июня 2002 Выполнено
Исправить синхронизацию очистки TLB и invlpg() на x86 SMP. Peter Wemm 12 июля 2002 Выполнено
Сделать cpu_coredump машинно-независимым. Peter Wemm 7 сентября 2002 Выполнено
Добавить блокировку подсистемы в коду сбора статистики. Andrew Reiter 11 сентября 2002 Выполнено
Исправить SIGXPU и другие вещи типа #if 0 в mi_switch(). John Baldwin 30 сентября 2002 Выполнено
Отделение реализации MAC из TrustedBSD. Robert Watson 11 ноября 2002 Выполнено
Блокировка обработчиков событий. Mike Smith, Jonathan Mini, John Baldwin 11 марта 2003 Выполнено
Исправить PHOLD(), чтобы она блокировалась для гарантированного PS_INMEM. John Baldwin 22 апреля 2003 Выполнено
Исправить различные procfs_machdep.c, которые не должны использовать sched_lock. John Baldwin 22 апреля 2003 Выполнено
Блокировка всех ссылок на полномочия процессов и удалить Giant из системных вызовов, связанных с полномочиями процессов. John Baldwin 1 мая 2003 Выполнено
Объединить структуры procsig и sigacts, перенести новую структуру sigacts из U-области о добавить соответствующую блокировку. John Baldwin 13 мая 2003 Выполнено
Удалить Giant из системных вызовов kill() и killpg(). John Baldwin 13 мая 2003 Выполнено
Улучшить реализацию пула мьютексов, разрешив создание и использование нескольких динамически распределяемых пулов с настраиваемыми размерами пулов и параметрами мьютексов. Don Lewis 16 июля 2003 Выполнено
Создать инструмент профилирования мьютексов для ядра, чтобы замерять использование и поведение мьютексов ядра. Eivind Eklund, Dag-Erling Smorgrav 31 марта 2002 Выполнено
Отделить реализацию конвейеров: оптимизации VM.   4 октября 2003 Выполнено
Повторно реализовать код прерываний i386 и SMP, чтобы SMP-ядра работали на UP-машинах и SMP можно было включить в GENERIC. John Baldwin 3 ноября 2003 Выполнено
Реализовать общие подходы для использования при блокировках без ожиданий. John Baldwin 11 ноября 2003 Выполнено
Разделение witness_lock() на witness_checkorder() и witness_lock(). witness_checkorder() должна вызываться до получения блокировки, чтобы увеличить вероятность обнаружения неправильного порядка следования блокировок и выдачи предупреждения об этом до возникновения ситуации взаимной блокировки. witness_lock() будет просто обновлять внутреннее состояние witness, отражающее факт получения блокировки. John Baldwin 24 января 2004 Выполнено
Блокировка ограничений ресурсов по каждому процессу. Mike Makonnen, John Baldwin 4 февраля 2004 Выполнено
Реализовать абстракцию очереди пауз для использования как в msleep(), так и условных переменных. Эта новая абстракция должна использовать хэш-таблицу очередей пауз с перемещаемой блокировкой в каждой цепочке очереди пауз, похожей на проходные цепочные блокировки, чтобы сделать sched_lock проще. John Baldwin 27 февраля 2004 Выполнено
Удаление Giant из jail(2). Andrew Reiter, Robert Watson 23 апреля 2004 Выполнено
Добавить блокировки для подсистем NFSv2, сервера NFSv3, позволяющие выполнять обращения к вышестоящему уровню и другим элементам, связанным с сетью, без Giant. Robert Watson 24 июля 2004 Выполнено
Реализовать ядро полностью с вытесняемой многозадачностью. John Baldwin 24 ноября 2004 Выполнено
Блокировка реализации конвейера: проблемы связаны с sigio/fown Alfred Perlstein 24 ноября 2004 Выполнено
Блокировка кода SysV IPC. Alfred Perlstein 24 ноября 2004 Выполнено
Блокировать инструмент замера конфликтов для замера влияния различных блокировок, в том числе Giant, и разрешить более управляемую оптимизацию стратегий производительности и блокировки. Robert Watson 24 ноября 2004 Выполнено
Блокировка структуры proc. John Baldwin 20 февраля 2001 Выполняется
Отделение подсистемы tty. Dick Garner, Jeremy Scofield, Thomas Moestl, Poul-Henning Kamp 24 июля 2004 Выполняется
Исправить блокировку часов, которая должна быть одинаковой на всех платформах. John Baldwin 16 ноября 2001 Выполняется
Использовать блокировку процесса и счётчики ссылок на процесс для защиты интерфейсов отладки (и procfs). John Baldwin 27 февраля 2002 Выполняется
Использовать блокировку процессов для защиты sysctl-вызовов мониторинга процесса, включая те, что используются 'ps' и сопутствующими инструментами. John Baldwin 27 февраля 2002 Выполняется
Отделить инфраструктуру newbus для поддержки точного управления драйверами. Warner Losh 28 февраля 2002 Выполняется
Удалить флаг совместимости системного вызова с MP из таблицы системных вызовов, и добавить исключительные mtx_lock/unlock для Giant ко всем системным вызовам. Matt Dillon, Maxime Henrion, Robert Watson 24 июля 2004 Выполняется
Документирование архитектуры SMPng. John Baldwin, Robert Watson 28 февраля 2002 Выполняется
Переход к совместной блокировке VOP_GETATTR() для уменьшения блокировки во время выполнения частых простых операций с VFS. Модификация namei() в целях предоставления флага LOOKUP_SHARED, который показывает, что требуемая блокировка может быть совместной, а не исключительной. Jeff Roberson 11 марта 2002 Выполняется
Отделение иерархии sysctl и методов доступа. Jonathan Mini 9 апреля 2002 Выполняется
Документирование существующей блокировки vm_map и проверка её корректности. Alan L. Cox 18 мая 2002 Выполняется
Документирование существующей блокировки vm_object и проверка её корректности. Alan L. Cox 4 мая 2002 Выполняется
Отделение структур linker_file_t в компоновщике ядра. Andrew Reiter 19 июня 2002 Выполняется
Пересмотр стратегии блокировки и корректности операций VFS, исправление различных режимов сбоев, связанных с включением добавлений VFS-вызовов. Jeff Roberson 10 декабря 2002 Выполняется
Документирование стратегии блокировки внутри vnode, её вычистка, удаление внутренних блокировок, переключение на sx-блокировки. Jeff Roberson 10 декабря 2002 Выполняется
Реализовать упрощённое переключение треда прерываний (обмен контекстами) на i386. Bosko Milekic, Alexander Kabaev 10 декабря 2002 Выполняется
Реализовать упрощённое переключение треда прерываний (обмен контекстами) на sparc64. Jake Burkholder 10 декабря 2002 Выполняется
Переход от использования lockmgr в VM к использованию мьютекса или исключительного sxlock. Избавиться от Giant во всех VM, кроме для компонентов vm_object/VFS и vm_page/pmap. Alan L. Cox 10 декабря 2002 Выполняется
Модификация API драйверов устройств, чтобы разрешить драйверам более просто делить код на "в контексте прерывания" и "в треде прерывания" для более быстрого подтверждения прерываний. Это уменьшит латентность обработки прерываний. Peter Wemm 4 октября 2003 Выполняется
Создать механизм в структуре cdevsw для защиты драйверов, не принимающих во внимание треды. John Baldwin 15 мая 2001 Заброшено
Сделать printf() безопасной для вызова практически в любом месте во избежание патовых блокировок. Chuck Paterson 15 мая 2001 Заброшено
Удалить параметр приоритетности из tsleep(), msleep() и cv_*wait*().   12 января 2001 Не начиналось
Повторно реализовать kqueue при помощи условных переменных.   15 марта 2001 Не начиналось
Сделать атомарные операции в SMP-коде условными, что используется для статистики в целях отладки. Peter Wemm 15 марта 2001 Не начиналось
Добавить новую регулярную проверку для существующих процессов на предмет отсутствия блокировок. John Baldwin 13 июня 2001 Не начиналось
Задание приоритетов для условных переменных, семафоров и sx-блокировок.   7 сентября 2001 Не начиналось
Убрать максимум schedcpu(), предпочтя обновления по событиям.   7 сентября 2001 Не начиналось
Исправить *hold (например, crhold) на возврат ссылки на объект.   7 сентября 2001 Не начиналось
Добавить регулярную проверку на блокировки lockmgr.   7 сентября 2001 Не начиналось
Добавить сдвигаемые блокировки ICU на ia64.   4 января 2002 Не начиналось
Быстрое избавление от Giant для VOP_READ() и VOP_WRITE().   25 февраля 2002 Не начиналось
Перенос забора Giant в системные вызовы Linux i386 ABI.   25 февраля 2002 Не начиналось
Перенос захвата Giant в системные вызовы Linux AXP ABI.   25 февраля 2002 Не начиналось
Перенос захвата Giant в системные вызовы SVR4 i386 ABI.   25 февраля 2002 Не начиналось
Перенос захвата Giant в системные вызовы OSF/1 AXP ABI.   25 февраля 2002 Не начиналось
Перенос захвата Giant в системные вызовы IBCS i386 ABI.   25 февраля 2002 Не начиналось
Расширение инструмента профилирования мьютексов на профилирование также и sx-блокировок. Eivind Eklund, Dag-Erling Smorgrav 1 апреля 2002 Не начиналось
Реализовать atomic_fetchadd() для данных int и long с версиями acq и rel.   23 мая 2002 Не начиналось
Реализовать простой API счётчика ссылок, использующий атомарные операции, для замены блокировок, которые всего лишь защищают счётчики ссылок.   23 мая 2002 Не начиналось
Добавить проверку witness_sleep() для copyin/out() и s/fuword(). John Baldwin 7 июня 2002 Не начиналось

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

Задача Ответственный Последнее обновление Состояние
Защитить очереди сетевых интерфейсов. Jonathan Lemon 24 ноября 2000 Выполнено
Отделение IP. Jennifer Yang, Jeffrey Hsu 10 июня 2002 Выполнено
Отделение TCP. Jennifer Yang, Jeffrey Hsu, Sam Leffler, Robert Watson 24 ноября 2004 Выполнено
Отделение UDP. Jennifer Yang, Jeffrey Hsu, Robert Watson 24 ноября 2004 Выполнено
Отделение счётчиков ссылок ifaddr. Jeffrey Hsu 18 декабря 2002 Выполнено
Отделение списка ifnet. Jeffrey Hsu 21 декабря 2002 Выполнено
Отделение деревьев radix. Jeffrey Hsu 23 декабря 2002 Выполнено
Отделение ARP. Jeffrey Hsu 16 января 2003 Выполнено
Блокировка raw IP. Sam Leffler, Robert Watson 24 июля 2004 Выполнено
Отделение сокетов divert. Sam Leffler 4 октября 2003 Выполнено
Отделение ipfw2. Sam Leffler 4 октября 2003 Выполнено
Отделение DUMMYNET. Sam Leffler 4 октября 2003 Выполнено
Отделение моста ethernet. Sam Leffler 4 October 2003 Выполнено
Отделение очередей фрагментирования IP. Robert Watson 4 октября 2003 Выполнено
Отделение таблиц маршрутизации. Sam Leffler 4 октября 2003 Выполнено
Отделение FAST_IPSEC. Sam Leffler 4 октября 2003 Выполнено
Разрешить параллельные записи в обработке isr. Robert Watson, Sam Leffler 11 октября 2003 Выполнено
Блокировка "интерфейса сброса" if_disc. Robert Watson 9 марта 2004 Выполнено
Блокировка "интерфейса передачи IPv6-to-IPv4 TCP" if_faith. Sam Leffler, Robert Watson 9 марта 2004 Выполнено
Блокировка "общего интерфейса туннелирования" if_gif. Robert Watson 9 марта 2004 Выполнено
Пересмотр поддержки туннеля ECN (ip_ecn.c). Robert Watson 9 марта 2004 Выполнено
Блокировка if_tap глобально и на уровне softc. Robert Watson 23 апреля 2004 Выполнено
Блокировка if_tun глобально и на уровне softc. Robert Watson 23 апреля 2004 Выполнено
Блокировка netatalk/aarp.c. Robert Watson 23 апреля 2004 Выполнено
Кэширование MAC-метки сокета в метке inpcb сокетов IPv4, чтобы эта метка могла безопасно использоваться на уровне inet без блокировок самого сокета. Robert Watson 23 апреля 2004 Выполнено
Подпрограммы инкапсуляции IP (ip_encap.c). Robert Watson 23 апреля 2004 Выполнено
Блокировка globals в loopback-интерфейсе (if_loop.c). Robert Watson 23 апреля 2004 Выполнено
Использование m_tags в if_gif для ограничения замкнутых конфигураций, вместо статического счётчика, не совместимого с MPSAFE. Ruslan Ermilov 23 апреля 2004 Выполнено
Блокировка netatalk DDP PCB. Robert Watson 23 апреля 2004 Выполняется
Разрешить выполнение маршрута передачи IP без Giant. Sam Leffler 1 декабря 2003 Выполнено
Блокировка протоколов домена UNIX® и fifofs. Sam Leffler, Robert Watson 24 июля 2004 Выполнено
Giant-блокировка NFS-сервера для исключения so_upcall() без Giant Robert Watson 24 июля 2004 Выполнено
Блокировка мета-данных клонирования интерфейсов. Brooks Davis 24 июля 2004 Выполнено
Применение комбинации блокировок сокета и его буфера, кэширования меток для меток MAC в сокетах, так чтобы их можно было безболезненно использовать без Giant. Robert Watson 24 июля 2004 Выполнено
При диспетчеризации сообщений сокета маршрутизации использовать netisr для избежания повторного входа в код сокета из кода маршрутизации, решив вопросы последовательности блокировок. Robert Watson 24 июля 2004 Выполнено
Введение блокировки accept для защиты от подтверждения неполных и полных очередей на сокетах, ждущих соединения. Robert Watson 24 июля 2004 Выполнено
Разбиение операций wakeup, append с буфером сокета, изменения состояния сокета, резервирования буфера сокета, его очистки и так далее на _locked() и неблокированные версии, устранить условную блокировку. Robert Watson 24 июля 2004 Выполнено
Блокировка AARP, AppleTalk Address Resoluton Protocol. Robert Watson 24 июля 2004 Выполнено
Исправление проблем с синхронизацией данных кэша pull/push в sosend(), soreceive(), позволив им работать без Giant. Robert Watson 24 июля 2004 Выполнено
Защитить глобальные счетчики/лимиты сокета и номера генерации мьютексом. Robert Watson 24 июля 2004 Выполнено
Блокировка выделения отдельных мета-данных в модулях netgraph, связанных с интерфейсом. Robert Watson 24 июля 2004 Выполнено
Блокировка полей OOB буфера сокета в TCP/IP и IPX. Robert Watson 24 июля 2004 Выполнено
Добавить MSG_NBIO, чтобы fifofs могла избежать манипуляций с SO_NBIO, связанных с риском. Don Lewis 24 июля 2004 Выполнено
Защитить все использования so_count блокировкой сокета. Robert Watson 24 июля 2004 Выполнено
Перенести состояние, связанное с буфером сокета, из so_state в sb_state, чтобы оно могло быть блокировано мьютексом буфера сокета. Robert Watson 24 июля 2004 Выполнено
Ввести временную глобальную блокировку для блокирования поля if_label, используемого в технологии MAC. Robert Watson 24 июля 2004 Выполнено
Выделить поведение, специфичное для VFS, из fdrop_locked(), и получать Giant в пообъектных методах fo_close, а не в fdrop_locked(), чтобы конвейеры и сокеты могли работать с fo_close() без Giant. Robert Watson 24 июля 2004 Выполнено
Перенос захвата Giant в операцию статистики дескриптора файла fo_stat(), а не забирать его в fstat(), чтобы вызовы fstat() с сокетами и конвейерами работали без Giant. Robert Watson 24 июля 2004 Выполнено
Не удерживать блокировки сокета в течение входа в методы переключения протокола, позволяя методам протокола вызывать блокировки сокета после блокировок протоколов в порядке блокировки. Robert Watson 24 июля 2004 Выполнено
Портирование блокировки inpcb мьютексом и его установок из IPv4 в IPv6 Robert Watson 8 августа 2004 Выполнено
Добавление IFF_NEEDSGIANT, чтобы позволить if_start использовать Giant при работе с определёнными интерфейсами. Отложить if_start в очередь задач. Robert Watson 8 августа 2004 Выполнено
Отказаться от Giant в функциях stat(), fo_stat() для обеспечения работы stat для конвейеров и сокетов без Giant. Robert Watson 8 августа 2004 Выполнено
Добавить захваты блокировок TCP. Robert Watson 24 ноября 2004 Выполнено
Блокировка уровня сокетов. Sam Leffler, Robert Watson 24 ноября 2004 Выполнено
Пересмотр кода таймера TCP. Robert Watson 24 ноября 2004 Выполнено
Анализ и снижение накладных расходов на сбор случайной информации в критических сетевых вызовах. Robert Watson, Mark Murray 24 ноября 2004 Выполнено
Позволить коду декларировать NET_NEEDS_GIANT(), принудительно устанавливающий Giant в сетевом стеке, если этот код вкомпилирован в ядро. Robert Watson 28 августа 2004 Выполнено
Отключить Giant в сетевом стеке в конфигурации по умолчанию. Robert Watson 28 августа 2004 Выполнено
Переход к использованию счётчика ссылок на дескриптор файла вместо счётчика ссылок на сокет для системных вызовов для работы с сокетами, во избежание излишних операций со счётчиком ссылок. Robert Watson 24 октября 2004 Выполнено
Блокировка syncache. Jeffrey Hsu, Sam Leffler 10 ноября 2003 Выполняется
Блокировка IPv6. Sam Leffler, Robert Watson, Hajimu UMEMOTO, Max Laier 8 августа 2004 Выполняется
Глобальная блокировка if_ppp для каждого softc Robert Watson, Maurycy Pawlowski-Wieronski <maurycy@fouk.org> 23 апреля 2004 Выполняется
Блокировка структуры ifnet. Max Laier, Luigi Rizzo, Maurycy Pawlowski-Wieronski <maurycy@fouk.org> 23 апреля 2004 Выполняется
Блокировка списка адресов IPv4, IPv6 и atalk сетевых интерфейсов. Max Laier, Robert Watson 8 августа 2004 Выполняется
Блокировка пользователей кода сжатия BSD compress (bsd_comp.c) для защиты состояния процесса сжатия. Robert Watson 23 апреля 2004 Выполняется
Блокировка глобальных состояний и состояний softc для преобразователя 6-в-4 (if_stf.c). Robert Watson 23 апреля 2004 Выполняется
Разблокировка состояния global и softc для SLIP (if_sl.c). Robert Watson 23 апреля 2004 Выполняется
Блокировка состояний global и softc для SPPP (if_sppsubr.c). Roman Kurakin, Robert Watson 23 апреля 2004 Выполняется
Блокировка IGMP. Robert Watson 23 апреля 2004 Выполняется
Дополнительная трассировка KTR для UMA, вызовов, прерываний и событий сети. Robert Watson 8 августа 2004 Выполняется
Уменьшение действий перед блокировкой буфера сокета за счёт замены функций tsleep() и wakeup() на условную переменную. Seigo Tanimura 21 апреля 2002 Не начиналось
Блокировка драйвера "кадров ethernet" if_ef.   9 марта 2004 Не начиналось
Блокировка IP ID. Robert Watson 23 апреля 2004 Не начиналось

Известные проблемы

Проблема Последнее обновление Состояние
Время холостой работы процессора не передаётся процессам холостой работы. 20 сентября 2000 Решено
microuptime нарушает обратную совместимость. 4 октября 2000 Решено
microuptime() требует обратной совместимости 4 October 2000 Решено
Учёт процессов неточен (чем больше процессоров, тем ближе точность). 5 октября 2000 Решено
M_DEVBUF, вероятно, неправильный пул памяти для прерываний, и мы должны подумать о создании нового пула выделения памяти для этого. 9 февраля 2001 Решено
Отключение ПК-адаптера вызывает аварийное завершение из-за условных ошибок в коде треда обработки прерываний. 15 марта 2001 Решено
Машины SMP x86 видят прерывания NCPU * 100 clk и прерывания NCPU * 128 rtc. 15 мая 2001 Решено
Проверка будет бесконечно рекурсивной при получении Giant после паузы с блокировкой с возможностью установки паузы. 27 июня 2001 Решено
Последовательный gdb не работает, если заданы параметры boot_ddb и boot_gdb. 14 июля 2002 Решено
Последовательный gdb не работает на скорости 115200. 14 июля 2002 Решено
Последовательный gdb никогда не получает управление обратно, если был введён 'cont'. 14 июля 2002 Решено
Профилирование не работает. 20 февраля 2001 Не решено

Новости

Оставшаяся часть страницы структурирована в виде журнала с обратной хронологией записи.

28 августа 2004
  • Robert Watson изменил поведение сетевого стека, который теперь по умолчанию работает без блокировки Giant, что позволяет стеку сетевых протоколов работать на нескольких процессорах одновременно, а также работать в вытесняющем режиме, в том числе и с вытеснением другими процессами.
30 октября 2003
  • Greg Lehey послал на сингапурскую конференцию Asian Enterprise Open Source Conference свою работу FreeBSD SMPng. В докладе представлен исторический обзор разработки SMPng, начиная с 2001 года, хотя опущено обсуждение последних достижений проекта SMPng, таких, как постоянное улучшение производительности в результате значительного отказа от блокировок в подсистемах хранения, VM и основных подсистем IPC.

13 января 2002 15 мая 2001
  • Greg Lehey опубликовал свой доклад для USENIX, который будет представлен в Бостоне в конце июня.

22 марта 2001 5 марта 2001 24 января 2001 12 января 2001 11 октября 2000
  • John Baldwin и Chuck Paterson выступили с предварительным перечнем правил, которым нужно следовать при работе над синхронизацией в ядре.

6 сентября 2000
  • Выполнен коммит SMP-кода. Вся дальнейшая работа будет выполняться в cvs, а не при помощи патчей.

  • Доступен для загрузки обновлённый патч. Он, вероятнее всего, содержит то, что будет перенесено в дерево исходных текстов.

5 сентября 2000
  • Доступен для загрузки обновлённый патч. Этот патч делает rtc быстрым прерыванием, использует инструкции блокировки для мьютексов в MP-ядрах и корректирует связку с mtx_*() внутри модулей.

1 сентября 2000
  • Большей частью ведётся работа над кодом для i386 (UP и MP). Для alpha всё ещё необходимо дополнительное кодирование, которые теперь сделано.

30 августа 2000
  • Для i386 и alpha доступны обновлённые патчи, которые находятся здесь.

12 августа 2000
  • Здесь находятся обновлённые патчи для i386. Учёт процессов всё ещё работает неправильно, однако сделано множество других улучшений.

3 августа 2000
  • Патчи с функционирующими тяжёлыми тредами для платформы i386 доступны здесь. Имеется несколько небольших проблем с этим набором патчей. А именно неправильная работа учёта процессов.

6 июля 2000
  • Sheldon Hearn подготовил справочную страницу по mutex(9) на основе BSD/OS, которая доступна здесь.

5 июля 2000
  • Jake Burkholder поместил обновлённый патч здесь.

3 июля 2000
  • У Jake Burkholder имеется рабочий код блокировки BSD/OS, и он объединён с соответствующими частями патчей Matt Dillon (простаивающие процессы, некоторые изменения в блокировках планировщика и так далее). Его набор патчей доступен здесь.

26 июня 2000
  • Chuck Paterson предоставил PostScript-версии своих слайдов презентации для первого и второго дня обсуждения SMP.

25 июня 2000 19 июня 2000