Linux デスクトップKDE+Nvidiaでサスペンド後にChromeとかがおかしくなる問題

# 症状
今回説明するものは次の2つです。

* サスペンド後にChromeの描画が崩れる問題 ← Chrome再起動で症状は治まる
* サスペンド後にsystemsettings5 の描画が崩れる問題 ← systemsettings5は再起動しても治らない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206426/31744bd4-f34e-2d88-c08d-8b00a151ffac.png)
↑ Chromeの描画が崩れる問題


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206426/ed48a783-2d6f-d66f-e725-8ab46c9f1596.png)
↑systemsettings5 (崩れている画面のスクショはないですがこんなやつ)

# 環境 (関係しそうなもののみ)
* OS: Arch Linux (これは恐らく関係なくて、Ubuntuとかでも一緒と思われます)
* GPU: Nvidia RTX GeForce 2070 Mobile
* GPU Driver: 450系
* デスクトップ: KDE Plasma 5.19系

# TL;DR
次の2つの方法を両方実行すれば治りました(再発したら記事更新します)。

* systemsettings5: **Nvidia Driverを450系から440系にダウングレード**
* Chrome: **GUIの「設定→詳細設定→ハードウェアアクセラレータを有効化」を無効にする**

# 調査記録
## 事前の準備と警告
グラフィックドライバの問題が絡むので、調査や自身の環境への適用の際に**試行錯誤している中でカーネルパニックを起こしてブートできない場合があります**。
作業前にはインストーラとかでchrootできる環境を整えておきましょう

## systemsettings5の方
こちらは次のコマンドで起動できるので調査は容易です。

* 正常なときに`systemsettings5 &> logOk`
* おかしいときに`systemsettings5 &> logNg`

```text:logOk
Cyclic dependency detected between "file:///usr/lib/qt/qml/org/kde/kirigami.2/styles/org.kde.desktop.plasma/Units.qml" and "file:///usr/lib/qt/qml/org/kde/kirigami.2/styles/org.kde.desktop.plasma/Units.qml"
file:///usr/share/kpackage/genericqml/org.kde.systemsettings.sidebar/contents/ui/SubCategoryPage.qml:141:9: QML Connections: Implicitly defined onFoo properties in Connections are deprecated. Use this syntax instead: function onFoo(<arguments>) { ... }
file:///usr/share/kpackage/genericqml/org.kde.systemsettings.sidebar/contents/ui/SubCategoryPage.qml:131:9: QML Connections: Implicitly defined onFoo properties in Connections are deprecated. Use this syntax instead: function onFoo(<arguments>) { ... }
file:///usr/lib/qt/qml/org/kde/kirigami.2/private/RefreshableScrollView.qml:143:13: QML Connections: Implicitly defined onFoo properties in Connections are deprecated. Use this syntax instead: function onFoo(<arguments>) { ... }
file:///usr/lib/qt/qml/org/kde/kirigami.2/private/RefreshableScrollView.qml:143:13: QML Connections: Implicitly defined onFoo properties in Connections are deprecated. Use this syntax instead: function onFoo(<arguments>) { ... }
Cyclic dependency detected between "file:///usr/lib/qt/qml/org/kde/kirigami.2/styles/org.kde.desktop.plasma/Units.qml" and "file:///usr/lib/qt/qml/org/kde/kirigami.2/styles/org.kde.desktop.plasma/Units.qml"
QQmlEngine::setContextForObject(): Object already has a QQmlContext
file:///usr/share/kpackage/genericqml/org.kde.systemsettings.sidebar/contents/ui/introPage.qml:109:27: QML IntroIcon (parent or ancestor of QQuickLayoutAttached): Binding loop detected for property "minimumHeight"
file:///usr/share/kpackage/genericqml/org.kde.systemsettings.sidebar/contents/ui/introPage.qml:109:27: QML IntroIcon (parent or ancestor of QQuickLayoutAttached): Binding loop detected for property "minimumHeight"
```

```diff:logNg
Cyclic dependency detected between "file:///usr/lib/qt/qml/org/kde/kirigami.2/styles/org.kde.desktop.plasma/Units.qml" and "file:///usr/lib/qt/qml/org/kde/kirigami.2/styles/org.kde.desktop.plasma/Units.qml"
file:///usr/share/kpackage/genericqml/org.kde.systemsettings.sidebar/contents/ui/SubCategoryPage.qml:141:9: QML Connections: Implicitly defined onFoo properties in Connections are deprecated. Use this syntax instead: function onFoo(<arguments>) { ... }
file:///usr/share/kpackage/genericqml/org.kde.systemsettings.sidebar/contents/ui/SubCategoryPage.qml:131:9: QML Connections: Implicitly defined onFoo properties in Connections are deprecated. Use this syntax instead: function onFoo(<arguments>) { ... }
file:///usr/lib/qt/qml/org/kde/kirigami.2/private/RefreshableScrollView.qml:143:13: QML Connections: Implicitly defined onFoo properties in Connections are deprecated. Use this syntax instead: function onFoo(<arguments>) { ... }
file:///usr/lib/qt/qml/org/kde/kirigami.2/private/RefreshableScrollView.qml:143:13: QML Connections: Implicitly defined onFoo properties in Connections are deprecated. Use this syntax instead: function onFoo(<arguments>) { ... }
Cyclic dependency detected between "file:///usr/lib/qt/qml/org/kde/kirigami.2/styles/org.kde.desktop.plasma/Units.qml" and "file:///usr/lib/qt/qml/org/kde/kirigami.2/styles/org.kde.desktop.plasma/Units.qml"
QQmlEngine::setContextForObject(): Object already has a QQmlContext
+ QQuickWidget: Failed to make context current
+ QQuickWidget::resizeEvent() no OpenGL context
+ QQuickWidget: Failed to make context current
file:///usr/share/kpackage/genericqml/org.kde.systemsettings.sidebar/contents/ui/introPage.qml:109:27: QML IntroIcon (parent or ancestor of QQuickLayoutAttached): Binding loop detected for property "minimumHeight"
file:///usr/share/kpackage/genericqml/org.kde.systemsettings.sidebar/contents/ui/introPage.qml:109:27: QML IntroIcon (parent or ancestor of QQuickLayoutAttached): Binding loop detected for property "minimumHeight"
+ QQuickWidget: Attempted to render scene with no context
+ QQuickWidget::invalidateRenderControl could not make context current
```

エラーメッセージが特定できればググるだけですね。
https://bbs.archlinux.org/viewtopic.php?id=258149
こういうフォーラムがヒットして「ダウングレードしたら行けたよ！」
とのことです。関連スレッドを見ると、Nvidia450系とKDE Plasma 5.19系の問題のようですね。
ちな、nvidiaのドライバはカーネルに深く関わっているのでnvidia-dkms的な方をインストールする必要がありそうです。

LinuxにおけるダウングレードはそれぞれのOSで作法があると思うので、手元の環境で行った記録を書いておきます [archのref](https://wiki.archlinux.jp/index.php/%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89)。

```bash:archLinuxの場合
yay -S nvidia-dkms downgrader # nvidia-dkms と nvidia-utils がインストールされる
yay -R nvidia-dkms
downgrader nvidia-utils # 選択肢でバージョン`440.100-1`を選ぶ
yay -S nvidia-440xx-dkms
sudo reboot
```

## chromeの方
こちらは明確なエラーメッセージを探すことができなかったのでちょっと困りました。
**最も確実な解決法は GUIの「設定→詳細設定→ハードウェアアクセラレータを有効化」を無効にする**ことです。
これを行うとChromeはGPU資源を使わなくなるので問題は解決しますが、描画が遅くなり、CPUリソースをより消費します。

他にも
* `chrome://flags` で
    * `#ignore-gpu-blacklist`または`#ignore-gpu-blocklist`を有効化
    * ~~`#enable-vulkan`を有効化~~

> 2020-09-19 追記
> Chromeの描画が崩れる問題は別の問題が発生したため解決していません。
> `enable-vulkan`を有効化すると時折kwinを巻き込んでクラッシュします。

# 組合せ
||systemsettings5|chrome|
|:--|:--|:--|
|nvidia-450|NG|restartで治る|
|nvidia-vulkan-450|NG|crashが続く|
|nvidia-440xx-dkms|OK|restartで治る|
|nvidia-vulkan-dkms-450|NG|crashが続く|

Chomeは以下**どちらの場合でも**時折kwinを巻き込んでクラッシュします(3回に1度程度ログインセッションも巻き込んでクラッシュ)。

* ドライバにvulkan系のものを使う
* enable-vulkanを有効化する

_ログインセッションがクラッシュした場合でも該当のセッション内で起動していたプロセスは生きていました(!)。他のttyからも確認できず、`ps`で生存が確認できてかつ正常に動作することが確認できる状態でした。これらを消すのは`kill`するしかないのでは。。_

```bash:ログインセッションを巻き込まない場合のログ(一部)
# journalctl -b -p3
Sep 19 10:19:52 archlinux systemd-coredump[13418]: Process 12306 (chrome) of user 1000 dumped core.
                                                   Stack trace of thread 12306:
                                                   #0  0x00007f95b5915c7b n/a (libnvidia-glcore.so.440.100 + 0xee4c7b)
                                                   #1  0x00007f95b59184bd n/a (libnvidia-glcore.so.440.100 + 0xee74bd)
                                                   #2  0x00007f95b5918bfe n/a (libnvidia-glcore.so.440.100 + 0xee7bfe)
                                                   #3  0x00007f95b58b56da n/a (libnvidia-glcore.so.440.100 + 0xe846da)
                                                   #4  0x00007f95b586ac9e n/a (libnvidia-glcore.so.440.100 + 0xe39c9e)
                                                   #5  0x00007f95b5873fdf n/a (libnvidia-glcore.so.440.100 + 0xe42fdf)
                                                   #6  0x00007f95b54d4178 n/a (libnvidia-glcore.so.440.100 + 0xaa3178)
                                                   #7  0x00007f95b54d9068 n/a (libnvidia-glcore.so.440.100 + 0xaa8068)
                                                   #8  0x00007f95b54db97c n/a (libnvidia-glcore.so.440.100 + 0xaaa97c)
                                                   #9  0x00007f95b727cf81 n/a (libGLESv2.so + 0x410f81)
                                                   #10 0x00007f95b726f5a9 n/a (libGLESv2.so + 0x4035a9)
                                                   #11 0x00007f95b713f682 n/a (libGLESv2.so + 0x2d3682)
                                                   #12 0x00007f95b70af266 _ZN2gl22CheckFramebufferStatusEj (libGLESv2.so + 0x243266)
                                                   #13 0x00005567c65a8dad n/a (chrome + 0x633bdad)
(以降略)
```