Архив метки: nvidia

Nvidia-drivers-430.14 segmentation fault

Прилетело обновление nvidia-drivers-430.14, поставил, перезагрузился, и вот она, консоль.

В Xorg.log такие записи:

[ 9.094] (EE) Backtrace:
[ 9.097] (EE) 0: /usr/bin/X (xorg_backtrace+0x4d) [0x557f6e1c6eed]
[ 9.097] (EE) 1: /usr/bin/X (0x557f6e014000+0x1b6de9) [0x557f6e1cade9]
[ 9.097] (EE) 2: /lib64/libpthread.so.0 (0x7efe2631c000+0x14e90) [0x7efe26330e90]
[ 9.097] (EE) 3: /lib64/libc.so.6 (memcpy+0x1f) [0x7efe261ee78f]
[ 9.097] (EE) 4: /usr/lib64/libnvidia-glcore.so.430.14 (0x7efe23972000+0x118a299) [0x7efe24afc299]
[ 9.097] (EE) 5: /usr/lib64/libnvidia-glcore.so.430.14 (0x7efe23972000+0x118a3fd) [0x7efe24afc3fd]
[ 9.097] (EE) 6: /usr/lib64/libnvidia-glcore.so.430.14 (0x7efe23972000+0xe73a48) [0x7efe247e5a48]
[ 9.097] (EE) 7: /usr/lib64/xorg/modules/extensions/libglxserver_nvidia.so (0x7efe21cb5000+0x8c2d32) [0x7efe22577d32]
[ 9.097] (EE)
[ 9.097] (EE) Segmentation fault at address 0x7efe22671008

Ребята на форуме нашли решение - выпилить флаг compat у nvidia-drivers.

 

Linux 5.1 и Nvidia Drivers 418.56

Обновился на днях до ядра 5.1, но драйвера Nvidia 418.56 не собираются с ядром 5.1, а версия 430.09 не работает, выбрасывает при загрузке граф. режима обратно в консоль, что в 5.0.12, что в 5.1.

Поэтому решил допилить 418.56 для работы с новым ядром. На просторах интернета нашёл такую статью, чел расписывает, как заставить 418.43 работать на 5.1-rc1, практически мой случай.

Перевод на русский 🙂

В файлы nvidia-drm-connector.c nvidia-drm-drv.c nvidia-drm-encoder.c nvidia-drm-gem-nvkms-memory.c в самый верх добавляем строчку #include <linux/version.h>

В файл /kernel/nvidia-drm/nvidia-drm-connector.c, примерно в 203 строчку добавляем:

#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0)
/* Add header constants missing after 5.1-rc1 */
int drm_helper_probe_single_connector_modes(struct drm_connector
*connector, uint32_t maxX,
uint32_t maxY);
#endif

В файл kernel/nvidia-drm/nvidia-drm-drv.c, примерно в 37 строчку добавляем:

#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0)
/* Add header constants missing after 5.1-rc1 */
void drm_kms_helper_poll_init(struct drm_device *dev);
void drm_kms_helper_poll_fini(struct drm_device *dev);
bool drm_helper_hpd_irq_event(struct drm_device *dev);
void drm_kms_helper_poll_disable(struct drm_device *dev);
#endif

В файл kernel/nvidia-drm/nvidia-drm-encoder.c, примерно в 33 строчку добавляем:

#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0)
/* Add header constants missing after 5.1-rc1 */
void drm_kms_helper_hotplug_event(struct drm_device *dev);
#endif

и в строчку 161:

#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0)
/* Add header constants missing after 5.1-rc1 */
int drm_helper_probe_single_connector_modes(struct drm_connector
*connector, uint32_t maxX,
uint32_t maxY);
#endif

В файле kernel/nvidia-drm/nvidia-drm-gem-nvkms-memory.c (примерно 77 строчка) заменяем

static int nv_drm_vma_fault(struct vm_fault *vmf)

на

#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 1, 0)
static int nv_drm_vma_fault(struct vm_fault *vmf)
#else
static vm_fault_t nv_drm_vma_fault(struct vm_fault *vmf)
#endif

В файле kernel/nvidia-uvm/uvm8.c (примерно 176 строка) заменяем

static int uvm_vm_fault_sigbus_wrapper(struct vm_fault *vmf)

на

#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 1, 0)
static int uvm_vm_fault_sigbus_wrapper(struct vm_fault *vmf)
#else
static vm_fault_t uvm_vm_fault_sigbus_wrapper(struct vm_fault *vmf)
#endif

и (примерно 515 строчка)

static int uvm_vm_fault_wrapper(struct vm_fault *vmf)

на

#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 1, 0)
static int uvm_vm_fault_wrapper(struct vm_fault *vmf)
#else
static vm_fault_t uvm_vm_fault_wrapper(struct vm_fault *vmf)
#endif

Вот и всё, модуль должен собраться. И да, по ссылке еще 2 файла были изменены - в kernel/common/inc/nv-list-helpers.h нужно поменять строку

static inline int list_is_first(const struct list_head *list,

на

static inline int nv_list_is_first(const struct list_head *list,

и файл kernel/nvidia-uvm/uvm8_range_tree.c, нужно поменять строку

if (list_is_first(&node->list, &tree->head))

на

if (nv_list_is_first(&node->list, &tree->head))

Но, это всё нужно делать для драйвера версии 418.43. Я лично это всё поменял, как было написано, компилятор начал ругаться на файл kernel/nvidia-uvm/uvm8_range_tree.c

error: implicit declaration of function ‘nv_list_is_first’; did you mean ‘list_is_first’? [-Werror=implicit-function-declaration]
if (nv_list_is_first(&node->list, &tree->head))
^~~~~~~~~~~~~~~~
list_is_first

Ну я и добавил в самый верх этого файла

#include "../common/inc/nv-list-helpers.h"

и всё прекрасно собралось. Но! После всего этого, я опять полез на сайт того чела и дальше вижу в Recent Post такое - фикс для драйвера версии 418.56. И там английским по белому написано, что для данной версии трогать файлы uvm8_range_tree.c и nv-list-helpers.h на предмет замен строк вообще не нужно. Такие дела 🙂

 

Размытие (блюр) экрана Kwin и Firefox при включённых эффектах

Тут давеча решил подключить эффекты Kwin (они же свистелки и перделки), а то чё как не пацан, с деревянными окнами без анимации.

Включил, всё прекрасно, окна красиво сворачиваются-разворачиваются-свертываются и все такое, вот только в Firefox поплыл шрифт, стал очень сильно размытым. Отключал сглаживание, хитинг-хуитинг и прочее - как криво было так и осталось. Плюс если перед уходом в suspend был открыт Youtube c видео, при выходе из suspend'a Firefox  просто очень криво отображал страницу, вплоть до чёрного экрана с какими-то элементами страницы. Решение было такое - пересобрать Лису без флага hwaccel. Теперь всё нормально работает. Но тут мигнул свет.

Свет мигнул, а компьютер не перезагружался уже больше полумесяца. И вот, кеды загрузились и я вижу на экране вот такое. Путём поиска нашёл (каламбур, да) тему на KDE'шном форуме (картинку я взял оттуда же, ага) - нужно в Nvidia-settings отключить FXAA.

Патч (patch) для nvidia-drivers-340.106

В портежах появилась новая версия драйвера nvidia-drivers-340.106, который также успешно не собирается на ядрах 4.15.х, как и nvidia-drivers-340.104. Но патч для nvidia-drivers-340.104 не подойдет, нужен другой.

Ругань при компиляции такая:

/var/lib/dkms/nvidia/340.106/build/uvm/nvidia_uvm_lite.c:857:14: error: initialization from incompatible pointer type [-Werror=incompatible-pointer-types]
.fault = _fault,
^~~~~~
/var/lib/dkms/nvidia/340.106/build/uvm/nvidia_uvm_lite.c:857:14: note: (near initialization for 'uvmlite_vma_ops.fault')
/var/lib/dkms/nvidia/340.106/build/uvm/nvidia_uvm_lite.c:887:14: error: initialization from incompatible pointer type [-Werror=incompatible-pointer-types]
.fault = _sigbus_fault,
^~~~~~~~~~~~~
/var/lib/dkms/nvidia/340.106/build/uvm/nvidia_uvm_lite.c:887:14: note: (near initialization for 'counters_vma_ops.fault')

Патч доступен по ссылке, действия аналогичны.

Убираем тиринг (tearing) на Nvidia в Linux

Как начал пользовать драйвер от Nvidia за номером 340.106, заметил, что появился тиринг в Firefox и просмотре фильмов через mplayer. Решение такое - добавить в файл xorg.conf такую строчку в секцию Screen (а можно и в Device, так же будет работать):

Option "metamodes" "nvidia-auto-select +0+0 { ForceCompositionPipeline = On }"

Если строка Option "metamodes" уже есть, то нужно просто добавить "nvidia-auto-select +0+0 { ForceCompositionPipeline = On }" в конец этой строки.

Можно и через nvidia-settings:

nvidia-settings --assign CurrentMetaMode="nvidia-auto-select +0+0 { ForceCompositionPipeline = On }"

Но это на только на текущую сессию, без добавления в xorg.conf при перезагрузке всё вернется взад, зато после ввода команды действие наступит сразу же, можно будет проверить, пропадёт тиринг или нет, а после этого уже вносить изменения в xorg.conf.

Ядро Linux 4.15 и Nvidia драйвера версий 384.98 и 340.104

В общем обновился я на ядро ветки 4.15. Но с этим ядром не собираются nvidia-drivers 340.104.

Для решения этой проблемы идём по этой ссылке и скачиваем патч для драйвера Nvidia и распаковываем его из архива.

А вот что нужно сделать, чтобы наложить патч. Запускаем пересборку nvidia-drivers, причём делать это нужно на новом ядре или чтобы символическая ссылка /usr/src/linux указывала на директорию с ядром 4.15. Т.е. обновили ядро и следом нужно запустить пересборку nvidia-drivers (хотя после каждого обновления ядра это и так нужно делать). Ждём, когда вылетит ошибка, примерно такая:

/var/calculate/tmp/portage/x11-drivers/nvidia-drivers-340.104/work/kernel/nv.c: In function ‘nv_start_rc_timer’:
/var/calculate/tmp/portage/x11-drivers/nvidia-drivers-340.104/work/kernel/nv.c:2407:5: error: implicit declaration of function ‘init_timer’ [-Werror=implicit-function-declaration]
     init_timer(&nvl-;>rc_timer);
     ^~~~~~~~~~
/var/calculate/tmp/portage/x11-drivers/nvidia-drivers-340.104/work/kernel/nv.c:2408:28: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
     nvl->rc_timer.function = nvidia_rc_timer;
                            ^
/var/calculate/tmp/portage/x11-drivers/nvidia-drivers-340.104/work/kernel/nv.c:2409:18: error: ‘struct timer_list’ has no member named ‘data’
     nvl->rc_timer.data = (unsigned long) nvl;
                  ^
cc1: some warnings being treated as errors

Переходим в каталог  /var/calculate/tmp/portage/x11-drivers/nvidia-drivers-340.104/work/ (у меня установлены nvidia-drivers-340.104) и копируем туда же патч.

Накладываем его такой командой (от рута, естественно):

patch -p0 <nv_patch_340.104_linux_kernel_4.15

Дальше просто продолжаем сборку, с помощью команды ebuild, про неё подробней можно прочитать здесь.

ebuild /usr/portage/x11-drivers/nvidia-drivers/nvidia-drivers-340.104.ebuild compile install qmerge clean

 

 

 

Nvidia Driver

В продолжении темы компа и обновления. Не стартовал графический режим с nvidia драйверами, выдавал вот это:

Fatal server error:
no screens found
Please consult the The X.Org Foundation support
at http://wiki.x.org

Обновил драйвера – не помогло. Полез в логи Х сервера. Сначала ничего такого не заметил. Но потом приметил такую строчечку:

(II) Primary Device is: PCI 05@00:00:0

И как раз в xorg.conf есть такое определение:

BusID       “PCI:1:0:0″

решил закамментить эту строчку, мало ли. Как оказало – не зря решил, Иксы запустились, все нормально.