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)

При module_init что-то инкрементнуло счётчик ресурсов, а при module_exit забыло его декрементнуть. Глянь код init и выясни, что за счётчики там объявляются.

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

А какой-нибудь fd у X.Org не увеличивает счётчик? Если да, то как освободить не завершая полностью X.Org?

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

глюков не оберёшься. на такой юзкейс разработчики не рассчитывают

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

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

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

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

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

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

Тогда это не сильно от перезагрузки отличается. Что-то вроде быстрой перезагрузки Windows 9x.

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

fd

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

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

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

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

Ещё можно ли настроить X.Org чтобы он полностью игнорировал вторую видеокарту не отключая драйвер ядра?

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

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

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

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

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

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

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

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

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

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

С amdgpu тоже самое. А не может ядерная консоль или фреймбуфер ссылаться на видеодрайвер?

X512 ★★★★★
() автор топика
Ответ на: комментарий от 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 ★★★
()
Ответ на: комментарий от EXL

Мне выгружать надо, а не загружать. Чтобы протестировать несколько изменений в коде драйвера.

X512 ★★★★★
() автор топика
Ответ на: комментарий от 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

Это действие технически приводит к тем же device_remove и ,module_exit внутри модуля, что и rmmod. Не будет разницы.

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

например

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

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

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

apt_install_lrzsz ★★★
()

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

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

annulen ★★★★★
()

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

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

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

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

использовать для тестирования виртуалку

Пробрасывать видеокарту в виртуальную машину?

X512 ★★★★★
() автор топика

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)
Ответ на: комментарий от X512

Пробрасывать видеокарту в виртуальную машину?

Ну да

annulen ★★★★★
()

В конфиге ядра надо включить forced module unloading: CONFIG_MODULE_FORCE_UNLOAD=y

anonymous
()

у радеонов проблемы анбайндингом на видяхах до текущего 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 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.