6.14 カーネルで、cgroup に久々に新しいコントローラーが追加されました。
追加されたのはデバイスメモリーコントローラー = "dmem" コントローラーです。
デバイスのメモリー領域を cgroup で管理するためのコントローラーです。現時点では(?)、GPU のメモリーと、GPU ドライバーが割り当てた CPU メモリーが cgroup に計上されて、制限がかかるようです。
将来的に GPU 以外でも使うかも? ってことで汎用的な名前になってるのでしょうか?(しらんけど)
6.14 カーネルで dmem コントローラーを有効にしてカーネルをビルドすると、次のように cgroup.controllers ファイルに dmem という文字列が現れます。そして、root cgroup には、dmem.capacity と dmem.current という 2 つのファイルが現れます。

$ cat /sys/fs/cgroup/cgroup.controllers cpuset cpu io memory hugetlb pids rdma misc dmem $ ( cd /sys/fs/cgroup && ls dmem.* ) dmem.capacity dmem.current
cgroup を作成し、子 cgroup で dmem コントローラーを使えるようにすると、子 cgroup にも dmem. で始まるファイルが出現します。
$ sudo mkdir /sys/fs/cgroup/test01 $ echo "+dmem" | sudo tee /sys/fs/cgroup/cgroup.subtree_control +dmem $ cat /sys/fs/cgroup/cgroup.subtree_control dmem $ cat /sys/fs/cgroup/test01/cgroup.controllers dmem $ ( cd /sys/fs/cgroup/test01/ && ls dmem.* ) dmem.current dmem.low dmem.max dmem.min
表. dmem コントローラーのインターフェースファイル
| ファイル名 | 機能 | 操作 |
|---|---|---|
dmem.capacity |
デバイスメモリーの最大容量が記載される。root cgroup のみに存在 | 読み取り専用 |
dmem.current |
現在のリソース利用状況が記載される | 読み取り専用 |
dmem.max |
memory.max と同じ |
読み書き |
dmem.min |
memory.min と同じ |
読み書き |
dmem.low |
memory.low と同じ |
読み書き |
dmem.current はカーネル付属文書では「root 以外のすべての cgroup」と書いてあるけど、root cgroup にもいますね。
パッチ
私の手元には dmem コントローラーを使える環境がない(出現したファイルすべての中身が空)ので、パッチを見てみましょう。ここからは素人の考察ですので、間違えてる可能性大です。
7 つのパッチから構成されており、"0/7" はこちらです。
こちらのパッチが、dmem コントローラーそのものでしょうか。これらの関数を使うと、dmem コントローラーの制限が効くようになるようですね。
dmm コントローラー用のヘルパーが、次のパッチで drm に追加されています。
リソース制御は TTM で処理するため、TTM に色々処理が追加されています。TTM は、専用メモリーを備えたアクセラレーターデバイス用のメモリーマネージャーらしいです。ここで実際のリソース制限とかがかかるんでしょうかね。
現時点では Intel の Xe ドライバーでのみ実装されているようです。そのパッチを見ると、ドライバーへの変更は少ししかありません。ここで実際のメモリーを登録する感じですかね。
drm と ttm でリソース制御の部分は吸収されて、各ドライバーは登録だけすれば良い感じでしょうか。今後、他のドライバーにも実装されていくのでしょうね。
また、手元で試せるようになったら試してみたいですね。どうやって試すのかしらんけどw