Fix UVC asynchronous transfer lifecycle - #1924
Conversation
There was a problem hiding this comment.
本 PR 修复 UVC/usbfs 异步 URB 生命周期,并调整 xHCI endpoint interval、描述符短读/非对齐读取及 streaming DMA 直映射约束;影响 USB 设备端点配置、URB 取消/回收和 StarryOS usbfs 用户可见的 CLAIMINTERFACE/DISCARDURB/reap 行为,不是隔离的纯重构。
已完整按代码质量准则审查。feature-development.md 按纯 bug 修复不适用;但本 PR 改变的是硬件队列、DMA 所有权和接口生命周期,仍必须有能在修复前失败的确定性回归覆盖。当前阻塞项见行内评论:新增测试没有经过真实生命周期路径,不能证明关键回归已修复。
验证:git diff --check origin/dev...HEAD、cargo fmt --check --all 通过;当前头为 00f95cd076a184ae5e24295631469269224e42e7。组织 CI 的当前头检查无失败(可见汇总为 success 44、skipped 56;跳过项为 run_host/run_container 与路径/矩阵的预期分支),因此未重复运行完整 Starry QEMU/物理 UVC 流程。未增加或使用 [patch.crates-io]。
既有 review/PR discussion 均为空,没有待解决的历史审查线程。重复/重叠分析:base 中不存在同等的本 PR 修复,按 usbfs、xhci 和 usb-host 搜索的开放 PR 未发现独立的重叠实现(仅命中本 PR)。
最终清单:DMA/xHCI/typed endpoint/usbfs 的实现、格式和 CI 已检查;缺失真实生命周期回归测试为唯一阻塞项。补齐后建议在受控的 usbfs/xHCI 适配层运行该路径,并提供修复前失败、修复后通过的证据。
Powered by gpt-5.6-terra
| use super::*; | ||
|
|
||
| #[test] | ||
| fn uvc_claim_releases_live_endpoints_before_updating_alternate() { |
There was a problem hiding this comment.
阻塞:这里的测试只验证了 helper 调用 closure 的先后顺序,未进入 claim_interface 的真实 URB drain/retire、lease.claim_interface 或 xHCI endpoint context 切换。因而旧实现也会通过,无法覆盖本 PR 声称修复的“切换 alternate setting 后仍被控制器引用、残留 endpoint 或重复完成”回归。请补充一个通过 usbfs/xHCI 测试适配层提交异步 URB、执行真实接口切换并断言 retire/endpoint 回收及无重复 completion 的确定性测试(同时覆盖失败时保持 ResourceBusy),并给出该测试在修复前失败的证据。
There was a problem hiding this comment.
本 PR 修复 UVC/usbfs 异步 URB 生命周期,并调整 xHCI endpoint interval、设备描述符短读/非对齐读取及 streaming DMA 直映射约束;会影响 USB endpoint 配置、URB 取消/回收以及 StarryOS usbfs 的 CLAIMINTERFACE、DISCARDURB、reap 合约,并非隔离的纯重构。
feature-development.md 不适用:这是已有 USB/usbfs 路径的 bug 修复,没有新增用户可见特性或公共接口;但 DMA、硬件队列和生命周期仍按代码质量规范审查。实现中 endpoint quiesce 后退役 xHCI inflight request 的方向与既有分层一致,未发现 [patch.crates-io] 或新的 unsafe 合约问题。
验证:scripts/review_pr_helper.py prepare-review 确认工作区为当前 head e5866c531cb2d7b4828d6f030a77c7afb152c9b3;git diff --check origin/dev...HEAD 和 cargo fmt --check 通过。组织 CI 针对此 head 的 76 个 check 均已完成,结果为 success 或预期的矩阵/路径 skipped,未见失败;按审查指示未重复运行完整 Starry QEMU/物理 UVC 流程。helper 识别出 axklib、crab-usb、starry-kernel 三个受影响 crate;新增测试虽会被内核测试编译路径收集,但不能覆盖真实修复路径,见行内问题。
已检查历史审查:当前 head 上已有一条相同结论的行内意见,技术上合理且尚未由本次测试提交解决;本 review 保留该阻塞原因。重复/重叠分析已检查 base 的 usbfs/xHCI 实现及相关开放 PR 搜索,未发现等价实现或需要先后合入的重叠 PR。
最终清单:实现、DMA/锁/endpoint 生命周期、格式、CI 和重复分析已完成;唯一未满足项是 bug 修复缺少能在旧实现失败的真实异步 URB 生命周期回归测试。补齐该测试及修复前失败证据后可重新审查。
Powered by gpt-5.6-terra
| use super::*; | ||
|
|
||
| #[test] | ||
| fn uvc_claim_releases_live_endpoints_before_updating_alternate() { |
There was a problem hiding this comment.
阻塞(测试覆盖):这里的两个用例只替换 commit_userspace_uvc_claim 的 closure 并检查本地 map,未进入 UsbDeviceFile::claim_interface 的真实 URB drain/cancel/retire、lease.claim_interface 或 xHCI endpoint 状态。因此旧实现也能通过,不能验证本 PR 声称修复的切换 alternate setting 后残留 endpoint 引用或重复 completion。请通过 usbfs/xHCI 测试适配层提交真实异步 URB、执行实际接口切换,并断言 endpoint/inflight request 被回收且没有第二次 completion;同时覆盖 cleanup 失败时仍返回 ResourceBusy 并保持原 alternate,并提供修复前失败的证据。
问题
DISCARDURB、接口 alternate setting 切换、接口释放和文件关闭时缺少完整的清理流程,可能导致 endpoint 仍被控制器引用、旧 endpoint handle 残留或 URB 被重复完成改动
效果
实测摄像头画面更新延迟从原来的 300-450 ms 转变为 24-37 ms