Fedora 44 的 RXE 无法注册 1 GiB MR
环境是 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 注册失败。
