web-dev-qa-db-ja.com

ディスプレイマネージャを再起動せずにAMDGPUのバインドを解除します

背景:

Thunderbolt eGPUケース(Razer Core)を購入しましたが、Linux上のAMD GPU(Rx480)で使用したいと考えています。私はカーネル5.0を使用しています。 PCの実行中にeGPUを接続すると、機能するようです。

> DRI_PRIME=1 glxinfo | grep "OpenGL renderer"
OpenGL renderer string: AMD Radeon (TM) RX 480 Graphics (POLARIS10, DRM 3.27.0, 5.0.16-050016-generic, LLVM 7.0.0)

ただし、GPUを取り外すと、システムがフリーズします。次のコマンドでPCIデバイスを無効にすると、フリーズも発生します。

> Sudo sh -c 'echo 1 > /sys/bus/pci/devices/0000:06:04.0/remove'

どうやらこれの理由は、グラフィックスドライバー(amdgpu)がまだデバイスを使用しているためです。だから私はグラフィックスドライバーを終了しようとしました:

> Sudo modprobe -r amdgpu
modprobe: FATAL: Module amdgpu is in use

ドライバモジュールを使用するアプリケーションは、ディスプレイマネージャ(lightdm 1.26.0)です。

動作するのは、Ctrl-Alt-F1コンソールの1つに切り替えて、以下を実行することです。

> Sudo service lightdm stop
> Sudo modprobe -r amdgpu
> Sudo sh -c 'echo 1 > /sys/bus/pci/devices/0000:06:04.0/remove'

[Unpluging the eGPU]

> Sudo service lightdm start

その後、デスクトップに戻ります(Ctrl-Alt-F7)。ただし、すべてのデスクトップアプリケーションはこの方法で失われます。

質問:

Lightdmをシャットダウンせずにamdgpuドライバーを削除できますか?または、すべてのデスクトップアプリケーションを失うことなくlightdmを再起動できますか?

2
Jounathaen

技術的には可能です。ただし、AMDはLinux用に実装していません。

static void
amdgpu_pci_remove(struct pci_dev *pdev)
{
    struct drm_device *dev = pci_get_drvdata(pdev);

#ifdef MODULE
    if (THIS_MODULE->state != MODULE_STATE_GOING)
#endif
        DRM_ERROR("Hotplug removal is not supported\n");
    drm_dev_unplug(dev);
    amdgpu_driver_unload_kms(dev);
    pci_disable_device(pdev);
    pci_set_drvdata(pdev, NULL);
    drm_dev_put(dev);
}

ソース: https://cgit.freedesktop.org/~agd5f/linux/tree/drivers/gpu/drm/AMD/amdgpu/amdgpu_drv.c?h=drm-next-5.7

2
Dávid Bíró