このブログは、株式会社フィックスターズのエンジニアが、あらゆるテーマについて自由に書いているブログです。
私の関わっている業務では Linux kernel をいじることがあるのですが、その中で Linux kernel のドライバのバグを報告して修正してもらった経験があったので、その内容や経緯を紹介したいと思います。
「NVMe HMB機能を使ってみた」が参考になると思います。
2017 年 9 月にリリースされた Linux kernel 4.13 において (4.x リリースは 2, 3 ヶ月ごとにリリースされ 2018 年 8 月の時点では 4.18 が最新リリースとなっている) NVMe ドライバに HMB 機能のサポートが追加されました。東芝メモリ製の HMB をサポートした NVMe デバイスを動作検証できる機会があり、早速試したところ NVMe ドライバが HMB 初期化処理に失敗して、システムが続行不能な状態に陥ってしまいました。
HMB 初期化処理とは NVMe デバイスがアクセス可能なホストのメモリ領域を割り当てて、その領域を NVMe デバイスに活用してもらうよう通知する処理のことで、メモリ割り当ての部分は次のように行われます。
上述した HMB のためのメモリ割り当てを試行する際の一番最初に試すチャンクサイズは Linux kernel 4.13 がリリースされた段階では、ページアロケータが割り当て可能な最大の連続メモリサイズの二倍になっていました。 そのため初回の HMB メモリ割り当ての試みは一つのチャンクも割り当てられずに失敗し (DMA Contiguous Memory Allocator を有効にしていれば成功するかもしれませんが) チャンクサイズを半分のページアロケータの割り当て可能な最大連続サイズにして再挑戦することになります。ところが、この再挑戦する部分に不具合があったため、システムが続行不能な状態に陥っていることが分かりました。
Linux の NVMe ドライバの開発者のための linux-nvme メーリングリストに、上述の再挑戦する部分のコードの不具合の修正するパッチと、一番最初に試すチャンクサイズをページアロケータが割り当て可能な最大の連続メモリサイズの二倍ではなく、最大サイズそのものに変更する提案を送りました。
[PATCH 0/2] nvme-pci: fix rety handling of host memory buffer allocation
これに対して、すぐに NVMe ドライバに HMB サポートを追加した開発者の Christoph Hellwig 氏から、返事とともに不具合のあった原因のコード周辺の見通しを良くしつつ問題も修正するという、より良いパッチが提案されたので、私の環境でも正常動作することを確認し、そのことを伝えました。もうひとつの提案である最初に試すチャンクサイズの変更については同意が得られました。そして、まもなく Linux kernel にマージされました。
影響を受けるデバイスを使用している人にとっては 4.13 リリース以前に動作していたものが 4.13 で動作しなくなったわけですから深刻な問題ですが、開発途中で安定化の途中である “rc” リリースを使うか、次のメジャーリリース (この場合は 4.14) を待たなければならないかというと、そういうことはありません。人々に影響を及ぼしそうなバグフィックスは stable アップデートという形で、バックポートされることがあり、この修正も 4.13 のリリースに対する stable アップデートである 4.13.5 に取り込まれました。
NVMe ドライバに HMB 機能がサポートされた直後にあった不具合について紹介しました。その不具合を修正パッチとともに linux-nvme メーリングリストに報告したところ HMB 機能を追加した開発者によって、私の提案したものよりも良い形で不具合が修正されました。 Linux kernel のバージョンや開発プロセスについて少し触れましたが詳細はカーネルソースに含まれる文書 Documentation/process/2.Process.rst に記述されています。
keisuke.kimura in Livox Mid-360をROS1/ROS2で動かしてみた
Sorry for the delay in replying. I have done SLAM (FAST_LIO) with Livox MID360, but for various reasons I have not be...
Miya in ウエハースケールエンジン向けSimulated Annealingを複数タイルによる並列化で実装しました
作成されたプロファイラがとても良さそうです :) ぜひ詳細を書いていただきたいです!...
Deivaprakash in Livox Mid-360をROS1/ROS2で動かしてみた
Hey guys myself deiva from India currently i am working in this Livox MID360 and eager to knwo whether you have done the...
岩崎システム設計 岩崎 満 in Alveo U50で10G Ethernetを試してみる
仕事の都合で、検索を行い、御社サイトにたどりつきました。 内容は大変参考になりま...
Prabuddhi Wariyapperuma in Livox Mid-360をROS1/ROS2で動かしてみた
This issue was sorted....