Memo/fedora-rxe-large-mr-enomem

2 分钟阅读

Fedora 44 的 RXE 无法注册 1 GiB MR

限制来自 RXE 连续分配页面元数据,不是 ASan 或 memlock。

环境是 Fedora 44,内核 7.1.10-200.fc44.x86_64,RDMA 设备为 Soft-RoCE rxe0。注册 1 GiB memory region 时,ibv_reg_mr() 返回:

ibv_reg_mr(): Cannot allocate memory [12]

这不是 RLIMIT_MEMLOCK 或 ASan 导致的。测试进程的 memlock 为 unlimited,主机还有约 59 GB 可用内存;1 GiB MR 在 ASan 和非 ASan 下都失败。逐页写入和 MADV_POPULATE_WRITE 也不能解决。实测 512 MiB 位于临界点,640 MiB 以上稳定失败,但 rxe0 仍宣称:

max_mr_size: 0xffffffffffffffff

原因指向 RXE 的页面元数据分配。Linux 7.0 附近的 RDMA/rxe 修改把 xarray 换成预分配的 rxe_mr_page 数组:

mr->page_info = kzalloc_objs(struct rxe_mr_page, num_pages);

4 KiB page 下,1 GiB MR 有 262,144 个页面。struct rxe_mr_page 在 x86-64 上占 16 字节,数组约 4 MiB,并且要求物理连续的内核内存。512 MiB 对应约 2 MiB 元数据,正好落在临界区;640 MiB 对应约 2.5 MiB。这个边界与实测一致。

临时把测试 DMA pool 降到 256 MiB 后,ASan + rxe0 的 39 个启用 RDMA* 用例全部通过。这只能验证 RDMA 功能,不能覆盖生产规模的 1 GiB MR。正式处理应使用硬件 RNIC,或者把 RXE 的 kzalloc_objs() / kfree() 改为可回退到非连续内存的 kvcalloc() / kvfree()。应用层拆分 MR 也能绕开限制,但调用方需要管理多个 MR 和 lkey。

截至 2026-08-29,没有搜到相同的 Fedora kernel 报告。已有的 Bug 2014767 是缺少 RDMA_RXE 模块,Bug 2034556 是 RXE soft lockup,都不是大 MR 注册失败。

相关阅读

Memo通过 SSH 迁移 btrfs volumesMemo把 ArchLinux 当成无线路由器用Memo网络与 DNS 资料

讨论

邮箱用于身份识别和回复通知,并由 Waline 存储。