GPL-incompatible module nvidia-uvm.ko uses GPL-only symbol 'radix_tree_preloads'

Всё что здесь написано вы делаете на свой страх и риск

Доброго времени суток. Имея бук с NVIDIA GT525M видеокартой на борту на ядре 5.10.3 столкнулся я с такой проблемой, в качестве видеодрайвера я использовал Nvidia Nouveau:
некорректное отображение экрана при просмотре Youtube в режиме “полный экран” через браузер Chromium. При разворачивании внизу или вверху экрана появлялась полоса с приложением развёрнутым на весь экран под окном браузера. После очередного обновления проблема усугубилась, экран стал мерцать.

Решил поставить проприетарные драйвера и установка мне не удалась, был warning: “CONFIG_I2C_NVIDIA_GPU: should not be set. But it is.”. Я решил что проблема в этом, нашёл статью Config_i2c_nvidia_gpu предупреждение при установке nvidia где люди отключали поддержку I2C_NVIDIA_GPU, но мою проблему это не решило.

Я стал обладателем ошибки: x11-drivers/nvidia-drivers-390.138-r1 with linux kernel 5.8.0 - FATAL: modpost: GPL-incompatible module nvidia-uvm.ko uses GPL-only symbol ‘radix_tree_preloads’ и вдруг понял что мне предстоит процедура “Сборка ядра со своей конфигурацией”.

Перед началом рекомендую установить ccache: sudo emerge -a dev-util/ccache может значительно ускорить сборку ядра. Дальше все действия делал от пользователя root.

  1. Скопировал исходный код ядра:
    USE=“-minimal -vmlinuz” emerge -a sys-kernel/calculate-sources
  2. Нашёл библиотеку radix-tree.c которая экспортирует символ radix_tree_preloads благодаря статье [PATCH 1/1] radix-tree: do not export radix_tree_preloads as GPL — Linux Filesystem Development
  3. Скопировал библиотеку из исходных кодов ядра в заранее подготовленную папку для формирования патча:
    cp /usr/src/linux/lib/radix-tree.c /make/radix-tree.c
  4. Сделал копию этого файла для внесения изменений:
    cp /make/radix-tree.c /make/radix-tree.c.copy
  5. Использовал редактор для изменение строк:
    sed -i ‘s_EXPORT_PER_CPU_SYMBOL_GPL(radix_tree_preloads);EXPORT_PER_CPU_SYMBOL(radix_tree_preloads);’ /make/radix-tree.c.copy
  6. Создал патч файл:
    diff -u /make/radix-tree.c /make/radix-tree.c.copy > patchfile
  7. Изменил строки связанные с путём на пути необходимые при компиляции ядра:
    sed -i ‘s_— /make_— a/lib_’ /make/patchfile && sed -i ‘s_+++ /make_+++ b/lib_’ /make/patchfile
  8. Скопировал файл patchfile согласно инструкции https://wiki.calculate-linux.org/ru/kernel в директорию с шаблонами и добавил строку :
    echo ‘# Calculate format=diff env=install ac_install_patch==on&&merge(sys-kernel/calculate-sources)>=5.8’ | cat - /make/patchfile > /var/calculate/templates/nvidia_patch
  9. Устанавливаем исходный код ядра, в логе можно будет увидеть успешное применение патча:
    USE=“-vmlinuz -minimal” emerge -a --jobs=1 sys-kernel/calculate-sources
  10. Запускаем сборку ядра, при этом если окно терминала будет маленьким окно изменения настроек ядра не выскочит:
    cl-kernel
    10.1 В конце сборки необходимо обновить модули:
    emerge @module-rebuild
    10.2 Чтобы использовать новые версии ядер с нашим патчем, нужно пересобирать ядро. Для этого добавляем строку:
    echo “sys-kernel/calculate-sources -minimal” >> /etc/portage/package.use/custom
  11. После нескольких минут ожидания в случае успешной сборки перегружаем машину и пробуем устанавливать драйвера:
    emerge -av nvidia-drivers
  12. Устанавливаем драйвер по умолчанию и перегружаемся:
    cl-setup-video --video nvidia

Спасибо большое пользователям телеграмм канала поддержки Calculate @RodionD и @etoyaslavochka.
Мне помогли следующие статьи:
https://bugs.gentoo.org/736513

https://wiki.calculate-linux.org/ru/kernel

В итоге всё проделанное мне не помогло. Выбор используемых драйверов слетал с nvidia на modesetting. Нужны ещё патчи ядра или ещё чего либо, возможно ещё попробую решить эту проблему. Сам откатился на ядро 4.19.145-calculate

В какой момент слетал выбор? После выполнения cl-setup-video --video nvidia /etc/X11/xorg.conf содержал nvidia или modesetting?

После команды cl-setup-video --video nvidia был запрос на перезагрузку, после которой cl-setup-video --video list выдавал modesetting

x11-drivers/nvidia-driveres собран для текущего ядра? Модули загружаются если выполнить modprobe nvidia? Что содержит строка загрузки системы /proc/cmdline?

Сейчас на ядре 4.19.145 у меня всё работает. Возможно через время попробую новое ядро и отпишусь