LINUX.ORG.RU

Выгрузить видеодрайвер ядра на лету

 , , , ,


1

3

Для того, чтобы проверять результат вносимых изменений в код видеодрайвера (radeon, amdgpu), хотелось бы его загружать и выгружать на лету. Загрузка через insmod работает, а выгрузка rmmod нет. lsmod пишет что он кем то одним используется и не указано кем. Слишком муторно перезагружать после каждого теста.

Видеодрайвер не используется для десктопа, для десктопа используется встроенная графика Intel с другим драйвером.

★★

Что за карта? В тех же Southern Island нужный драйвер загружается, ЕМНИП, только через параметр ядра в /etc/default/grub (radeon.si_support, amdgpu.si_support), если поддержка в ядре есть. Насчёт других поколений карт с двумя драйверами – не уверен.

Korchevatel ★★★★★ ()
Ответ на: комментарий от Korchevatel

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

X512 ★★ ()
Последнее исправление: X512 (всего исправлений: 1)
Ответ на: комментарий от X512

Как вариант (но это уже совсем из пушки по воробьям) – менять ядра "на лету", чтоб одно с radeon загружалось, а второе – с amdgpu. ЕМНИП, это можно с помощью kexec сделать, или как то так.

Korchevatel ★★★★★ ()
Ответ на: комментарий от X512

в автозагрузку всё накидай, чё как маленький. с норм ssd даже дриснятка ребутается что в биос зайти не успеваешь

у меня как-то был косяк, что нужно было полностью систему выключать, при простой перезагрузке глюки железа сохранялись

anonymous ()
Ответ на: комментарий от X512

fd

Ээээ. Да, это вполне возможно.

как освободить не завершая полностью X.Org

Вот по идее, при close устройства должен произойти декремент. И вот тут уже вопрос, когда Хорг делает close. В качестве костыля можно сделать что-то, что вызывает close без его явного открытия просто чтобы счётчик искусственно ушёл в ноль, но тут уже на правах догадок.

apt_install_lrzsz ()
Ответ на: комментарий от X512

Вопросы по иксам резко вырываются за рамки моей компетенции. Могу только посоветовать изучить драйвер на счётчики, им объявляемые и callback’и, которые их меняют. Там можно добавить отладочные сообщения.

Насчёт иксов рекомендую кастануть кого-то более опытного. @EXL?

apt_install_lrzsz ()
Ответ на: комментарий от X512

Значит Xorg (или что-то в нём) забыл «положить на место» то, что взял при открытии устройства.

Чтобы не гадать, можно так:

  • загрузил систему без иксов
  • попробовал выгрузить модуль с драйвером
  • если успешно, то загрузил иксы
  • остановил иксы
  • попробовал выгрузить драйвер

Если последнее провалилось по счетчику ресурсов, так как иксы багуют (выгруженный штатно юзерспейс обязан освобождать ресурсы ядра), то повод поискать сообщения об известных багах/зарепортить.

В этом случае на время оладки можно в драйвере отключить счётчик/проверку счетчика/искусственно сделать декремент.

apt_install_lrzsz ()
Ответ на: комментарий от apt_install_lrzsz

Насчёт иксов рекомендую кастануть кого-то более опытного. @EXL?

Ошибаешься, я в иксах некомпетентен и не считаю себя опытным в их настройке и хакинге.

Кастовать нужно тут @Zubok, например.

EXL ★★★★★ ()
Ответ на: комментарий от apt_install_lrzsz

Без X.Org (insmod запущен из ядерной консоли) счётчик тоже 1. Хотя вру, мимо посмотрел. Для amdgpu счётчик становиться 0, но при попытке выгрузки что-то падает.

X512 ★★ ()
Последнее исправление: X512 (всего исправлений: 1)
Ответ на: комментарий от X512

Ну, ты сам понимаешь, что такое поведение счётчика ресурсов, это не нормально. Захватывать ресурс может что-то как а ядре (не обязательно это конкретный модуль), так и юзерспейс.

Могу посоветовать только по коду драйвера понять, что за счётчик меняется. Это может быть в init модуля, probe устройства или создании какого-либо атрибута в sysfs. Тут ты понимаешь, что уже вилами по воде.

Счётчик может быть -1, и это уже явно баг.

apt_install_lrzsz ()
Ответ на: комментарий от X512

modprobe -r выгружает. И вроде как со всеми зависимостями (могу ошибаться).

-r --remove

This option causes modprobe to remove rather than insert a module. If the modules it depends on are also unused, modprobe will try to remove them too. Unlike insertion, more than one module can be specified on the command line (it does not make sense to specify module parameters when removing modules).

EXL ★★★★★ ()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от EXL

например

Но ты можешь знать, кого позвать тут из потенциально знающих.

со всеми зависимостями

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

apt_install_lrzsz ()

Для того, чтобы проверять результат вносимых изменений в код видеодрайвера (radeon, amdgpu), хотелось бы его загружать и выгружать на лету

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

annulen ★★★★★ ()

возможно стоит покопать в сторону реинициализации самой видяшки..

поидее вот такой файлик нужно трогать в радеонах для перезапуска видеокарты

sudo cat /sys/kernel/debug/dri/{номер видяхи}/radeon_gpu_reset

Thero ★★★★★ ()

unbind уже советовали?


Нет, не советовали.

# cd /sys/module/nouveau/drivers/pci:nouveau

# ls
0000:09:00.0  bind  module  new_id  remove_id  uevent  unbind

# echo 0000:09:00.0 > unbind

У себя сделаешь по аналогии.

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 3)

у радеонов проблемы анбайндингом на видяхах до текущего 6ххх поколения лечится https://github.com/gnif/vendor-reset

но изначально у тебя иксы/fb занимают видяху, поэтому:

  1. убедиться, что видяха не юзается для fb: dmesg|rg -i efifb

если занимает, то надо после загрузки сделать echo efi-framebuffer.0 > /sys/bus/platform/devices/efi-framebuffer.0/driver/unbind

  1. отвязать от иксов
Section "Device"
    Identifier     "Device0"
    Driver         "amdgpu"
    VendorName     "AMD"
    BoardName      "Radeon"
    BusID          "PCI:9:0:0" // указать своё в десятичной сис-ме
    Option         "AllowEmptyInitialConfiguration"
    Option         "Ignore" "1"
EndSection

s-o ()

Выгрузка kms-драйверов не поддерживается, равно как и горячее отключение видеокарт. Что-то там должно быть в ядре 5.16, но не полноценное.
Да, еще перед выгрузкой драйвера необходимо сперва «отцепить» устройство от drm-системы. Для этого, нужно чтобы программы отпустили соответствующие файлы устройств, и что-то записать куда-то в /sys, я точно не помню. После этого можно попытаться сделать rmmod, но гарантий, что это сработает корректно и без подводных камней никто не даст.

Khnazile ★★★★★ ()
  1. находишь все девайс ноды в /дев, принадлежащие драйверу
  2. находишь все процессы, которыми они открыты (которые имеют симлинки на них в /proc/$pid/fd
  3. прибиваешь их
  4. убеждаешься, что ноды больше не открыты никакими вновь запустившимися процессами (как вариант - удалить их перед прибитием процессов)

После этого rmmod должен сработать.

shatsky ★★ ()
Ответ на: комментарий от Khnazile

Ну в каком-то смысле поддерживается, если нет проблемы убить дисплейный сервер (правда, еще могут быть проблемы с тем, что менеджер его перезапускает, и даже удаленные вручную ноды устройств зачем-то пересоздаются)

shatsky ★★ ()