fix(ax-fs-ng): repoll IRQ-driven block waits#1313
Conversation
There was a problem hiding this comment.
Review 总结
PR 内容: 在 ax-fs-ng 的 IRQ-driven block wait 路径中加入 task-side repoll 兜底机制,修复 OrangePi-5-Plus board CI 在 ext4 mount 期间因 IRQ wake 丢失导致系统永久挂起的问题。
实现逻辑: 将原先依赖 task_wait_until(被动等待 IRQ 唤醒)的 IRQ-driven 完成等待替换为主动 repoll 循环。新增 wait_with_repoll_for_any_key 和 wait_with_repoll_for_queue_empty 两个方法,在等待期间主动调用 poll_batch 驱动 I/O 完成,未完成时 yield(普通任务)或 spin_loop(中断上下文)。这样即使单次 IRQ hint/wake 丢失,任务也能通过自轮询推进。原有 IRQ/drain 快路径保持不变。
额外 bug fix: 旧代码在 wait_for_queue_progress 的 IRQ 路径中从未调用 remove_queue_progress_waiter,会遗留 waiter。新代码在 wait_with_repoll_for_queue_empty 返回后正确移除 waiter。
本地验证结果:
cargo fmt --check -p ax-fs-ng✅ 通过cargo clippy -p ax-fs-ng --all-features -- -D warnings✅ 通过cargo test -p ax-fs-ng --features ext4 block_runtime -- --nocapture✅ 37 个测试全部通过
CI 状态: 所有 CI check run 为 skipped(base 分支 codex/rebase-serial-irq-model 为特性分支,CI 工作流可能仅在 dev 等主分支触发)。PR 作者已在 body 中记录了 board 级验证(cargo xtask starry test board 和 cargo xtask board connect)。
重复/重叠分析: PR #1313 以 PR #1265(codex/rebase-serial-irq-model)为 base,是其 CI 失败的定向修复。其他 open PR(#1315、#1316、#1317)均以 dev 为 base,涉及 vPLIC backend 和 VmPeak/VmHWM,与本 PR 无重叠。
测试覆盖: 修改后的测试 irq_driven_wait_repolls_without_external_drain_hint 验证了 IRQ-driven 模式下无需外部 drain hint 即可通过 repoll 完成请求,直接覆盖了修复场景。
结论: 代码修改清晰、范围小且聚焦,修复了真实的挂起 bug,同时额外修复了 waiter 泄漏问题。无 blocking issue。
Powered by mimo-v2.5-pro
问题
PR #1265 的 OrangePi-5-Plus self-hosted board CI 在
npu-yolov8/orangepi-5-plus用例中超时。日志显示系统已经注册rockchip-sdhciIRQ-driven block device,但随后停在 ext4 mount 阶段的Syncing filesystem...,没有进入 shell 和 NPU demo。这说明失败点不是 YOLO demo 本身,而是 IRQ-driven block completion 等待路径在 ext4 sync/mount 期间可能丢失进展唤醒,导致等待任务一直睡住。
修改
ax-fs-ng的 IRQ-driven block wait 路径中加入 task-side repoll 兜底:等待请求或队列进展时,会继续主动 poll pending requests,并在未完成时 yield。验证
cargo fmtcargo test -p ax-fs-ng --features ext4 block_runtime -- --nocapturecargo xtask clippy --package ax-fs-ngcargo xtask starry test board -c npu-yolov8 --board orangepi-5-pluscargo xtask board connect -b OrangePi-5-Plus,Linux 启动时fsck.ext4报 rootfs cleangit diff --check