ioremap()4M リージョンの呼び出しに失敗するコードがあります。理由をデバッグしようとすると、それを呼び出すioremapと、(割り当てたい領域のサイズに応じて) 非常に大きなアライメントで連続したアドレスを割り当てようとすることがわかりました。この配置を計算するコードは__get_vm_area_node()関数 ( mm/vmalloc.c) にあり、次のようになります。
if (flags & VM_IOREMAP) {
int bit = fls(size);
if (bit > IOREMAP_MAX_ORDER)
bit = IOREMAP_MAX_ORDER;
else if (bit < PAGE_SHIFT)
bit = PAGE_SHIFT;
align = 1ul << bit;
}
ARM では、IOREMAP_MAX_ORDERとして定義されてい23ます。これは、私の場合、ioremap4M の継続的なアドレス指定がvmallocエリア内で必要になるだけでなく、4M に揃える必要があることを意味します。
この配置が必要な理由に関する情報を見つけることができませんでした。この変更を導入するコミットを確認するために git Blame を使用してみましたが、コードが git history よりも古いようで、何も見つかりませんでした。