Skip to content

Fix UVC asynchronous transfer lifecycle - #1924

Open
Ivans-11 wants to merge 5 commits into
devfrom
fix/uvc-lifecycle
Open

Fix UVC asynchronous transfer lifecycle#1924
Ivans-11 wants to merge 5 commits into
devfrom
fix/uvc-lifecycle

Conversation

@Ivans-11

@Ivans-11 Ivans-11 commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

问题

  • usbfs worker 在每次 USB 活动后遍历所有已提交 URB,包括同一硬件队列中排在未完成请求之后的 URB。xHCI readiness probe 还会复制 isochronous packet metadata。深队列下,这会产生大量无效 reclaim 和 waker 注册,使已完成画面持续积压。导致摄像头画面延迟
  • 异步 URB 在 DISCARDURB、接口 alternate setting 切换、接口释放和文件关闭时缺少完整的清理流程,可能导致 endpoint 仍被控制器引用、旧 endpoint handle 残留或 URB 被重复完成

改动

  • 每次只探测每个 endpoint 或 control queue 最早的 pending transfer,并允许不同硬件队列独立推进
  • 不再复制完整 isochronous packet metadata,只记录请求类型
  • 串行化 URB 提交、丢弃和接口生命周期操作,被丢弃的 URB 由统一 worker 完成底层清理
  • 接口切换时先确保旧 endpoint 停止,再清除不会继续产生 completion 的 xHCI 请求,其他控制器则在切换前完成取消和回收
  • 同步清理旧 endpoint handles,避免残留引用和重复完成
  • 修正 xHCI endpoint interval 编码、设备描述符短读及非对齐读取
  • streaming DMA 仅在地址和长度均满足 cache-line 对齐时直映射,否则使用 bounce buffer

效果

实测摄像头画面更新延迟从原来的 300-450 ms 转变为 24-37 ms

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

本 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...HEADcargo fmt --check --all 通过;当前头为 00f95cd076a184ae5e24295631469269224e42e7。组织 CI 的当前头检查无失败(可见汇总为 success 44、skipped 56;跳过项为 run_host/run_container 与路径/矩阵的预期分支),因此未重复运行完整 Starry QEMU/物理 UVC 流程。未增加或使用 [patch.crates-io]

既有 review/PR discussion 均为空,没有待解决的历史审查线程。重复/重叠分析:base 中不存在同等的本 PR 修复,按 usbfsxhciusb-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() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

阻塞:这里的测试只验证了 helper 调用 closure 的先后顺序,未进入 claim_interface 的真实 URB drain/retire、lease.claim_interface 或 xHCI endpoint context 切换。因而旧实现也会通过,无法覆盖本 PR 声称修复的“切换 alternate setting 后仍被控制器引用、残留 endpoint 或重复完成”回归。请补充一个通过 usbfs/xHCI 测试适配层提交异步 URB、执行真实接口切换并断言 retire/endpoint 回收及无重复 completion 的确定性测试(同时覆盖失败时保持 ResourceBusy),并给出该测试在修复前失败的证据。

@mai-team-app
mai-team-app Bot requested a review from ZR233 August 7, 2026 17:37

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

本 PR 修复 UVC/usbfs 异步 URB 生命周期,并调整 xHCI endpoint interval、设备描述符短读/非对齐读取及 streaming DMA 直映射约束;会影响 USB endpoint 配置、URB 取消/回收以及 StarryOS usbfs 的 CLAIMINTERFACEDISCARDURB、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 e5866c531cb2d7b4828d6f030a77c7afb152c9b3git diff --check origin/dev...HEADcargo 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() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

阻塞(测试覆盖):这里的两个用例只替换 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,并提供修复前失败的证据。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant