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
ます。これは、私の場合、ioremap
4M の継続的なアドレス指定がvmalloc
エリア内で必要になるだけでなく、4M に揃える必要があることを意味します。
この配置が必要な理由に関する情報を見つけることができませんでした。この変更を導入するコミットを確認するために git Blame を使用してみましたが、コードが git history よりも古いようで、何も見つかりませんでした。