Linux kernelのbspとupstream

19
Porter ボボボボボボボボボ ボボボボボボボボボボボボボボ wata2ki

Transcript of Linux kernelのbspとupstream

Page 1: Linux kernelのbspとupstream

Porterボードのカーネルのベースバージョンを上げてみた

wata2ki

Page 2: Linux kernelのbspとupstream

自己紹介 名前 : wata2ki (watatuki) ◦元はハードウェアで画像処理をやっていましたが、現

在は組み込み屋をやっています 画像処理をやっていた当時は、ニューラルネットワークが画像処理

で実用化できるような形で使われるなんて予想していませんでした。。。

◦最近は Jetson-TK1/TX1 向けのアンオフィシャル Yocto BSP を作り、そのうえでディスクトップ環境や別ボード向けのディストロを動かして遊んでいます

◦GitHub https://github.com/watatuki

Page 3: Linux kernelのbspとupstream

発表概要

今日は、 Renesas 社の Porter ボードの BSP についてくるカーネルのバージョンアップに挑戦した時の内容について発表します

Porter Board :R-Car M2 SoC ・ ARM®Cortex-A15 Dual Core 1.5 GHz・ PowerVR SGX544MP2 (3D)・ 2 GB DDR3 memory (dual channel)

Debug Ethernet (100 Mbps)

Storage connection ・ one SATA rev. 3.1 port・ one SD card slot・ one microSD card slot

Etc…

Page 4: Linux kernelのbspとupstream

背景 背景

◦ ARM のボードコンピュータで Linux を動かす場合、 Linux のカーネルは、ベンダーの BSP と upstream カーネルのどちらかを使うことになる BSP カーネル

そのボード (SoC) のほぼ全ての機能を使うことができるが、特定のバージョンのカーネルにボード用の修正を加えたものなので、 Linux カーネルのバージョンアップに追従してくれない Renesas 社の Porter ボードの場合は 3.10.31LTSI Nvidia 社の Jetson TK1 ボードの場合は、 3.10.40

Upstream カーネル Linux のメインラインそのものなので、カーネルの修正・改良はすべて入っ

ているが、使える機能が制限される ほとんどの場合 GPU は使えない (Nvidia は頑張れば 3D 描画くらいはできる ) カーネルにドライバが入っていても、動くかどうかわからない / 動かし方が

わからない

◦ つまり、どちらも最良の選択肢にはなりえない

Page 5: Linux kernelのbspとupstream

目的 目的◦ 現状分析から、 ARM のボードコンピュータで Linux を動かす場

合の目指す姿は 2 種類 BSP カーネルのマイナーバージョンを最新まで上げて使う

最新機能は取り込めないが、バグフィクスは最新まで取り込める マイナバージョンアップなのでカーネルのソースが大きく変わることはな

く、バッチを当てやすい Upstream カーネルに BSP カーネルの修正を適用して使う

最新機能もバグフィックスも取り込める BSP カーネルとのバージョン差が増えれば増えるほど、カーネルのソース

が変わってしまい、パッチを当てるのが難しくなる

◦ Upstream カーネルを使う方法は、バージョン間の変更を理解してパッチを当てないといけないため、職人芸になってしまう

◦ 今回は、職人芸要素の低いマイナーバージョンアップに取り組む

Page 6: Linux kernelのbspとupstream

Porter ボードの BSP Kernel BSP の Kernel バージョンは 3.10.31-LTSI◦ 3.10.x は LTS に選ばれており、サポートが長いことで有名な

REL7 に採用されていることから、他のバージョンよりも長期間のメンテナンスが期待できる 次の LTS に選ばれた 3.14 は 2016/9/11 に EOL になってしまっ

たが、 3.10 は 2016/10/2 現在メンテナンスが続いている

◦ 3.10.x の最新バージョンは 3.10.103(2016/8/28 時点 ) BSP は 3.10.31-LTSI から分岐しており、それ以降のメンテナン

スパッチが当たっていない 当たっていないパッチの数は 3536 ある

ARM 固有のパッチは BSP に取り込まれているケースもあるが、共通部は手薄

ext4 の Fix と予想されるパッチだけでも 53 個ある

注 . REL: Red Hat Enterprise Linux

Page 7: Linux kernelのbspとupstream

余談ですが LTSI って何??◦ Linux Foundation のプロジェクト◦ LTS をベースにして、さらなる長期サポートと機能追加

パッチのバックポートを行う◦ 1 年につき 1 バージョンを LTSI に選定し 2 年間のサ

ポートを行う これまでに LTSI になったのは、 3.0-LTSI, 3.4-LTSI, 3.10-

LTSI, 3.14-LTSI, 4.1-LTSI

◦興味をもったらここを参照 http://ltsi.linuxfoundation.org/

Page 8: Linux kernelのbspとupstream

BSP カーネルの構成分析 BSP カーネルを構成するパッチは 3 種類に分類できる◦ LTS メンテナンスパッチ

Kernel.org で行われた 3.10.x のマイナーバージョンアップで当てられたパッチ

現在のカーネルは、 3.10 から 3.10.31 までが当たっている状態◦ LTSI パッチ

L.F. の LTSI 開発で当たったパッチ 現在のカーネルは、 3.10.31-LTSI のパッチが当たっている状態

◦ BSP パッチ Upstream や LTSI に含まれていない、そのボード用のパッチ 何が当たっているのかわからない

これらの整合をとって、 3.10.103 までのパッチを当てる必要がある

Page 9: Linux kernelのbspとupstream

パッチ当て方針 1 BSP カーネルに 3.10.32 から 3.10.103 までのパッチを単純

に当てていく◦ 手順

1. Kernel.org にある linux-stable の 3.10.y ブランチをチェックアウト2. git format-patch を使って 3.10.31 のバージョン付与以降のパッチを抽出3. git am で抽出したパッチを当てる

Upstream 3.10.31

3.10.32 patch

3.10.33 ~3.10.103   patch BSP patch

Upstream 3.10.31

linux-stable

LTSI(3.10.31) patch

BSP KernelUpdate kernel

BSP patch

Upstream 3.10.31

LTSI(3.10.31) patch

3.10.32 patch

3.10.33 ~3.10.103   patch

BSP から持ってくる

メンテナンスパッチを持ってくる

Page 10: Linux kernelのbspとupstream

パッチ当て方針 1 結果 パッチのコンフリクトが多発し、パッチ当てに失敗◦ LTSI パッチとメンテナンスパッチが衝突

LTSI パッチは 3.11 以降のカーネルからの新機能バックポートを含んでいる バックポートによる進化とメンテナンスによる BugFix が同じソースに対す

る異なる変更を引き起こしてしまう 実際には必要としない AMD K6 用のメンテナンスパッチが、 LTSI とバッティン

グ BeyTrail(Intel ATOM) のバックポート (LTSI) と、 UART のメンテナンス

パッチが同一ソースを別方向に変更しており、パッチのマージが困難

◦ BSP パッチに含まれる ARM 固有部の BugFix の衝突 BSP として必要と判断された、コアのワークアラウンドや ARM 固有部の

BugFix がバックポートされているため、メンテナンスパッチでバックポートされたパッチが当たらない このパターンは、 git am -3 を使うことである程度自動検出が可能 自動検出できない場合でも、修正対象ファイルの git log をパッチの subject で検索

すると、同じ内容のパッチが当たっていることを見つけることができる

Page 11: Linux kernelのbspとupstream

パッチ当て方針 2 BSP カーネルから、 BSP 変更部分を抽出し、最新の LTSI

にマージする◦ 手順

1. BSP カーネルから BSP の変更を抽出してパッチを作る2. 最新の LTSI カーネル (3.10.102-ltsi) を作成3. git am で抽出した BSP のパッチを当てる

Upstream 3.10.31

3.10.32 ~3.10.102   patch

BSP patch

Upstream 3.10.31

linux-stable+LTSI

LTSI(3.10.31) patch

BSP KernelUpdate kernel

Upstream 3.10.31

BSP から持ってくる

最新の LTSI から持ってくる

LTSI(3.10.102) patch

3.10.32 ~3.10.102   patch

LTSI(3.10.102) patch

BSP patch

Page 12: Linux kernelのbspとupstream

パッチ当て方針 2 結果 苦労はあったが、パッチ当てに成功◦ 方針 1 で多発したパッチの衝突はほとんど発生しなかった

3.10.102 LTSI を起点としているため、方針 1 で問題となったバックポートによる進化とメンテナンスによる BugFix の衝突は解決済み

BSP パッチと 3.10.102 LTSI との衝突は方針 1 と同様に発生したが、ごく少数で済んだ

◦ 方針 2 は BSP パッチの抽出が課題 コミットログからは BSP パッチとそれ以外の分別が困難

LTSI にも R-Car のパッチが含まれているため、パッチが当たるファイルでの分別ができない

コミットログの内容や、 Auther で判断できないか調査したが、結局できなかった

BSP パッチを抽出するために、ブランチの起点を軸としたパッチの総当たり検索で BSP の抽出を行った

Page 13: Linux kernelのbspとupstream

パッチあて方針 2   BSP パッチ抽出詳細 (1) BSP は LTSI から作られているため、 LTSI の分岐点以降のパッチをチェックの対象

にする◦ LTSI で一番最初に当たるのは Makefile にある EXTRAVERSION に -ltsi を設定するパッチな

ので、このパッチを探す 調査の結果 BSP は LTSI3.10.28 で fork し、 LTSI3.10.31相当になるようパッチがマージされていること

が判明 BSP パッチとマージしたパッチは順番に並んでいないため、分別の必要がある

Upstream3.10.28

Upstream3.10.31

BSP3.10.31

branch

LTSI3.10.28

LTSI3.10.31

branch

branch

Upstream3.10.29 ~ 31 のパッチと、 LTSI のパッチを BSPのブランチにマージ

LTSI 3.10.31相当のカーネルに BSP 固有のパッチが入っている状態

Page 14: Linux kernelのbspとupstream

パッチあて方針 2   BSP パッチ抽出詳細 (2) パッチを抽出するために、以下の仮説を立てた

◦ BSP パッチ抽出 (1) で抽出したパッチの集合は MP◦ 抽出したい BSP 固有のパッチの集合は BP◦ Upstream の 3.10.29 ~ 3.10.31 のパッチの集合は UP◦ Upstream3.10.31 に対して LTSI 3.10.31 で追加されたパッチの集合は LP◦ MP(n) に対して UP,LP との diff をとり、一致するものを除外した結果は BP に等しい、すな

わち UP LP BP=MP∪ ∪ である

Upstream3.10.28

Upstream3.10.31

BSP3.10.31

branch

LTSI3.10.28

LTSI3.10.31

branch

branch

MPUP

LP

BP

UP LP∪

Page 15: Linux kernelのbspとupstream

パッチあて方針 2   BSP パッチ抽出詳細 (3) パッチの比較をどのように行うか

◦ パッチの数は、 MP が 5201 パッチ、 UP が 210 パッチ、 LP が 2497 パッチあるため、目視比較は難しい◦ BSP カーネルから抽出したパッチ MP(1) と、 LTSI カーネルから抽出した同じパッチ LP(1) の内容に差分

が出る From に書かれているハッシュが変わってしまっている。 LTSI カーネルは、 linux-stable に LTSI パッチを git apply で当

てるため変わってしまうと考えられる。 Subject も抽出するパッチ数に連動して変わってしまう。 format-patch のオプションで消せなくはないが、今度は順番

がわからなくなってしまうため、消すに消せない。

◦ 先頭から 4 行を比較対象から除外することで、パッチ本体のみの比較を行う (python を使用 )

From 3b25797bc5edbf30e096aa45a8543c1f12128283 Mon Sep 17 00:00:00 2001From: Greg Kroah-Hartman <[email protected]>Date: Sun, 12 Feb 2012 23:09:28 -0800Subject: [PATCH 0001/5201] LTSI Makefile addition

Change the extra version to have -ltsi to have a chance to realize whatkernel version we are using.

Signed-off-by: Greg Kroah-Hartman <[email protected]>--- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Makefile b/Makefileindex addf1b0..5738a9b 100644--- a/Makefile

From 1f71f3bbdeb3a4ebdca89858ae35b6fded47fea9 Mon Sep 17 00:00:00 2001From: Greg Kroah-Hartman <[email protected]>Date: Sun, 12 Feb 2012 23:09:28 -0800Subject: [PATCH 0001/2497] LTSI Makefile addition

Change the extra version to have -ltsi to have a chance to realize whatkernel version we are using.

Signed-off-by: Greg Kroah-Hartman <[email protected]>--- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Makefile b/Makefileindex addf1b0..5738a9b 100644--- a/Makefile

BSP カーネルから抽出したパッチ

LTSI カーネルから抽出したパッチ

Page 16: Linux kernelのbspとupstream

パッチあて方針 2   BSP パッチ抽出詳細 (4) Python による機械比較による BP 抽出

◦ MP5201 パッチのうち 2637 パッチの除外に成功 目標値は 2497+210=2707 パッチなので、 97.4%

◦ 除外に失敗したパッチの分析 先頭 4 行を除くと、パッチ内の index 行に差が出てしまっており、同一のパッチと判断で

きなかった

UP が 210 パッチと少なかったため、 subject 行の改行が異なる位置で入ってしまい、 5行目が不一致になってしまった

残りの 70 パッチに関しては目視チェックにより除外できた

diff --git a/sound/soc/soc-jack.c b/sound/soc/soc-jack.cindex 0bb5ccc..7aa26b5 100644--- a/sound/soc/soc-jack.c

diff --git a/sound/soc/soc-jack.c b/sound/soc/soc-jack.cindex 0bb5cccd..7aa26b5 100644--- a/sound/soc/soc-jack.c

Date: Fri, 15 Nov 2013 14:53:14 -0800Subject: [PATCH 2531/5201] usb: xhci: Check for XHCI_PLAT in xhci_cleanup_msix()

Date: Fri, 15 Nov 2013 14:53:14 -0800Subject: [PATCH 018/210] usb: xhci: Check for XHCI_PLAT in xhci_cleanup_msix()

勉強会で Index 行の差は、そのパッチの前に当たっているパッチに依存しているとのコメントをいただきました。Index 行は diff から外してしまってよいようです。

Page 17: Linux kernelのbspとupstream

パッチあて方針 2   BSP パッチの適用詳細 最新の LTSI(3.10.102LTSI) に対して BSP パッチ BP を適用する

◦ Linux-stable3.10.102 に対して 3.10.102 用の LTSI パッチを適用し、 3.10.102LTSI を作成

◦ 3.10.102LTSI に対して、抽出した BP を当てることで、 3.10.31 から 3.10.102 までのメンテナンスを取り込んだ BSP カーネルを作成する

Upstream3.10.102

Upstream3.10.103

BSP3.10.102

branch

LTSI3.10.102

branch

BP

BSP3.10.31

この間の差は、カーネルのメンテナンスパッチのみになる

この差の取り込みに関しては、今後の課題

Page 18: Linux kernelのbspとupstream

パッチあて方針 2   BSP パッチの適用結果詳細 目標とした 3.10.102LTSI ベースの BSP カーネル作成は成功

失敗と課題◦ LTSI パッチの抽出を誤って 3.10.31 ではなく 3.10.28 で行ってしまった

ため、その間に追加された 10 パッチが最初にコンフリクトしてしまった 目視抽出で除外して対応

◦ 抽出した BSP カーネルに、 3.10.31 以降に追加された一部のパッチが取り込まれていたため、そのパッチがコンフリクト (49 パッチ ) これも数が少なかったため、 git のログと照合して 3.10.102LTSI 時点で当たっ

ているものを除外◦ Porter ボードは BSP カーネルに Yocto のレシピでパッチを当てて対応し

ていたため、これを当てないと動作しなかった 不足しているパッチを適用して対応

◦ どうしても当たらないパッチが一つだけ残ってしまった 変更行が衝突しており、有効な解決策がなく保留

Page 19: Linux kernelのbspとupstream

まとめ 今回のまとめ

◦ 今回は Renesas 社の Porter ボード用 BSP カーネルを題材として、 Upstreamカーネルのメンテナンスを取り込む簡単な方法を検討、試験した。

◦ ファイルサーチと diff ライブラリのある python 使うことで、 97% のパッチを機械的に分別でき、手作業による分別を 3%未満に抑えることができた。 今回の失敗をフィードバックすることで 99% のパッチを機械的に分別できる見込み

残課題◦ LTS のメンテナンスに対して遅れがちな LTSI カーネルの最新版へのアップ

デートには成功したが、 LTS の最新には到達できていない (3.10.102~3.10.103のパッチを取り込めていない)ため、これに対する方策が必要 単純にパッチを当てれば済む可能性もあるが、現時点では未実施

試しにやったらあっさり当たってしまいました。現状 3.10.104 までのパッチを当てることに成功しています。

◦ 変更前後のリグレッションテストの方法が確立できていない LTP等で同一コンフィグ設定でテストする等