Компания NVIDIA столкнулась с труднопреодолимым препятствием в процессе обеспечения в проприетарном драйвере для Linux поддержки технологии Optimus, дающей возможность на лету переключаться между встроенной энергоэффективной видеокартой на базе GPU Intel и дискретной картой NVIDIA. Для обеспечения поддержки горячего переключения между видеокартами требуется использование интерфейса DMA-BUF, интегрированного в ядро Linux, начиная с версии 3.5 и позволяющего организовать совместное использование буферов между несколькими драйверами (использование DMA-BUF требуется для организации записи во фреймбуфер драйвера Intel).

Проблема состоит в том, что DMA-BUF отнесён к категории внутренних интерфейсов ядра, который экспортируется в группе EXPORT_SYMBOL_GPL, ограничивающей возможность использования только для модулей ядра, распространяемых под лицензией GPL. Так как драйвер NVIDIA является проприетарным, он не имеет доступа к интерфейсам группы EXPORT_SYMBOL_GPL и технологии DMA-BUF в частности. DMA-BUF также не могут использовать проприентарные драйверы для видеоподсистем многочисленных одночиповых систем, используемых в мобильной технике. Кроме того, так как технология DMA-BUF положена в основу будущей спецификации DRI3, то данный интерфейс не сможет быть реализован проприетарными драйверами.

Для выхода из сложившегося тупика, представители NVIDIA предложили перевести DMA-BUF в категорию внешних интерфейсов ядра, экспортируемых в группе EXPORT_SYMBOL. Алан Кокс, известный разработчик ядра, указал на то, что смена статуса API возможна, но требует получения согласия от всех разработчиков, код которых использован в реализации DMA-BUF.

Подключившиеся к дискуссии представители компании Red Hat показали, что не всё так просто и для предоставления возможности использования DMA-BUF в проприетарных драйверах требуется изменение лицензии на реализацию DMA-BUF, что может быть сделано только при получении согласия от разработчиков как минимум всей графической подсистемы ядра. Получить согласия только от автора кода DMA-BUF недостаточно, так как данная технология тесно переплетается с другими подсистемами ядра.

Для обхода ограничения доступа к GPL-компонентам ядра некоторые производители проприетарных драйверов используют поставляемый под GPL модуль-обвязку, транслирующий вызовы к бинарному драйверу, работающему в пространстве пользователя. В случае с NVIDIA такой метод не подходит, так как код драйвера, содержащего бинарные компоненты, работает на уровне ядра.

Источник: http://www.opennet.ru/opennews/art.shtml?num=35067