Linux Kernelのpreemption modelを動的に変更する

Linux Kernel 5.12ではpreemption modelの動的変更が実装されています。
この機能を試してみます。

■ 前準備

以下のconfigを有効にします。

  • PREEMPT_DYNAMIC
  • HAVEPREEMPTDYNAMIC

ここでは省略しますが、どちらも他の設定に依存した設定値になっているので、間接的に設定が必要です。
Ubuntu 20.04(x86_64)の場合は、PREEMPTを有効にすることで上記が有効になりました。

■ 動的にpreemption modelを変更する

方法としては2つあります。

  • Kernel引数のpreemptにnone/voluntary/fullのいずれかを指定する
  • /sys/kernel/debug/sched_preemptから変更する

今回は後者の方法を試してみます。
まずcatで現在の設定の確認。

1# cat /sys/kernel/debug/sched_preempt
2(none) voluntary full

これをCONFIG_PREEMPTと同じpreemption modelに変更します。

1# echo "full" > /sys/kernel/debug/sched_preempt
2# cat /sys/kernel/debug/sched_preempt
3none voluntary (full)

とりあえず変わることはわかりました。

■ 何かがおかしい?

本来はここで動作検証をするところなのですが、
試してみても挙動がまったく変わらず、何かがおかしい?

一つ気になるのがDEFINESTATICCALLでpreemptscheduleは登録しているものの、
static
callで呼び出しているところが見つからない。

https://elixir.bootlin.com/linux/v5.12/source/kernel/sched/core.c#L5264

PREEMPTDYNAMICがstaticcallの機能の上で成り立っているため、
static_callで呼び出さないとダメだと思うんだけどな。もう少し調べてみよう。

Posted at : 2021-05-07 16:35:39 / Category : none

Ubuntu 20.04で最新のメインラインのカーネルを試す

以下の環境で試していきます。

  • ビルド環境 (以下、プロンプトは build$ で示します)
    • Arch : x86_64 (実機)
    • Distribution : Ubuntu 20.04.1
  • ターゲット環境 (以下、プロンプトは target$ で示します)
    • Arch : x86_64 (VMware fusion) ** Distribution : Ubuntu 20.04.2

ビルド環境とターゲット環境を兼用しても大丈夫です。
今回は、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

ビルドが完了すると以下のファイルが出力されます。

  • linux-headers-5.12.05.12.0-1amd64.deb
  • linux-image-5.12.05.12.0-1amd64.deb
  • linux-image-5.12.0-dbg5.12.0-1amd64.deb
  • linux-libc-dev5.12.0-1amd64.deb

これをターゲットに転送して、インストールします。

1target$ sudo dpkg -i linux-*.deb

完了したらrebootします。
立ち上がったらunameでカーネルのバージョンが上がっていることを確認します。

1target$ uname -a
2Linux ubuntu05 5.12.0 #1 SMP Wed May 5 17:25:30 JST 2021 x86_64 x86_64 x86_64 GNU/Linux
Posted at : 2021-05-06 18:22:31 / Category : none