Linux Kernel 5.12ではpreemption modelの動的変更が実装されています。
この機能を試してみます。
■ 前準備
以下のconfigを有効にします。
ここでは省略しますが、どちらも他の設定に依存した設定値になっているので、間接的に設定が必要です。
Ubuntu 20.04(x86_64)の場合は、PREEMPTを有効にすることで上記が有効になりました。
■ 動的にpreemption modelを変更する
方法としては2つあります。
今回は後者の方法を試してみます。
まずcatで現在の設定の確認。
これをCONFIG_PREEMPTと同じpreemption modelに変更します。
とりあえず変わることはわかりました。
■ 何かがおかしい?
本来はここで動作検証をするところなのですが、
試してみても挙動がまったく変わらず、何かがおかしい?
一つ気になるのがDEFINESTATICCALLでpreemptscheduleは登録しているものの、
staticcallで呼び出しているところが見つからない。
https://elixir.bootlin.com/linux/v5.12/source/kernel/sched/core.c#L5264
PREEMPTDYNAMICがstaticcallの機能の上で成り立っているため、
static_callで呼び出さないとダメだと思うんだけどな。もう少し調べてみよう。
以下の環境で試していきます。
ビルド環境とターゲット環境を兼用しても大丈夫です。
今回は、VMに割り当てられるリソースが少ないので別途ビルド環境を用意しています。
ターゲットとするカーネルは5.12とします。
ビルド環境にて、メインラインのカーネルをチェックアウトします。
configはUbuntu 20.04のものを使用します。
ターゲット環境からビルド環境へ転送します。
1target$ scp /boot/config-5.4.0-72-generic 192.168.10.44:~/linux/.config
configはdefconfigから生成する方法もありますが、
ドライバの有無や機能の有無にも関連してくるため、
ひとまずはディストリビューションのものを試すのが無難だと思います。
カーネルのバージョンが5.4から5.12へ変わるため、
oldconfigで不足しているconfigを設定します。
1build$ make oldconfig
数十〜百単位で項目が聞かれますが、とりあえず試すだけであれば
全部デフォルト値(つまりEnter押しっぱなし)で十分だと思います。
一点だけ、CONFIGSYSTEMTRUSTED_KEYS はデフォルト値を削除して空欄にする必要があります。
署名済みカーネルモジュールを生成するためのキーみたいですが、
この点はどういう仕組になっているのかよくわかってないです。
make menuconfig でメニューを表示し / で検索します。
1build$ make menuconfig
次にビルドします。
細かくはカーネルビルドして、モジュールビルドして…とか手順はありますが、
今回そこが目的ではないので以下でまとめてビルドしてしまいます。
1build$ make -j4 bindeb-pkg
ビルドが完了すると以下のファイルが出力されます。
これをターゲットに転送して、インストールします。
1target$ sudo dpkg -i linux-*.deb
完了したらrebootします。
立ち上がったらunameでカーネルのバージョンが上がっていることを確認します。