Merged
fix(csr1): stop embedded interface timers before teardown #1330
fix(csr1): stop embedded interface timers before teardown #1330
Merged
liuxingsenAdd on 25 days ago
liuxingsenCollaborators
25 days ago

当前PR是否有AI参与:

[x ] 否
[] 是
__1. AI Agent 平台:
__2. AI 模型:
__3. Prompt上下文 :

PR功能描述 / 为什么需要这个合入:

CSR1 接口内嵌于宿主设备。原定时器将接口作为父对象,取消后仍存活的定时器可能在接口已销毁后访问这个父对象;析构也需先停止仍使用接口成员的回调。

修改方案:

  • 总线、芯片可访问性/锁/看门狗和Scanner定时器采用无父对象创建,并显式绑定宿主或接口执行器。
  • 在接口析构、替换及停止路径先停止定时器;单次回调结束后保留成员句柄,让后续析构仍可等待在途回调。
  • 增加定时器被外部持有而宿主先销毁、替换旧定时器和可访问性恢复等回归。
  • 独立基于 origin/main@e4db788734f0d222c48294256f8ea1aa3e339dbb,不包含其他拆分主题。本 PR 的服务版本与 CHANGELOG 保持主线基线 1.2.530;本轮由 !1329、!1332 承担既有 1.2.531 更新,其他主题不单独升版。

以 drivers/csr1/bus/common/interface/i_bus.cpp 为例:

// 原 !1307 之前
m_access_timer = mc::make_shared<mc::timer>(this);
// 本 PR:由成员持有,不向内嵌接口建立父指针
m_access_timer = mc::make_shared<mc::timer>();
auto* owner = get_owner();
m_access_timer->bind_executor(owner != nullptr ? owner->executor() : executor());
// 本 PR:析构函数体先执行,随后 C++ 才自动销毁成员
Interface_Bus::~Interface_Bus() { stop_access_timer(); }

this 相当于 C 函数的接口 ctx。接口本身是宿主结构里的成员,不能假定取消后的 timer 会先于它销毁。mc::shared_ptr 成员只负责持有 timer;异步执行器仍可能另持一份引用。省略构造参数切断 timer→内嵌接口的父指针,显式绑定执行器保留原调度归属。超时 lambda 仍借用 this,因此析构时先停止并等待活动回调仍不可省略;智能指针本身不完成异步收尾。

旧实现的风险路径:取消 → 接口存储结束 → 外部持有的 timer 稍后释放 → 访问失效父指针。修复后 timer 没有该父指针;另一条“活动回调仍访问接口”的路径由析构入口的停止步骤处理。等待边界也需要明确:stop() 等待的是其他执行线程上已经进入的业务回调,不意味着所有排队的取消处理都已执行。从该 timer 自己的业务回调内调用 stop() 会避免等待自身,不能随即销毁当前回调仍在访问的接口。成员 reset() 只释放当前引用,其他持有者仍可让 timer 晚于接口存在。停止契约依赖项目 libmcpp 实现,本轮只声明所列缓存依赖下的回归结果。

验证方案:

在本分支重新编译相关测试程序及声明的依赖。使用私有 mount/IPC/network/PID 命名空间和私有临时目录串行运行,核查逐程序 XML,保存实际源码、日志与二进制哈希。

测试建议:

在正式 Bingo/CI 依赖及目标板上验证对应正常操作与错误路径;生命周期主题需进一步多轮压力验证,并在实际插桩构建上运行 ASan/UBSan。以上产品、目标板及新增全量压力验证本轮未执行。

自验证报告:

  • 历史实测的源码归属提交 db1793ba89cddc9323d2dc2e5ce418c2b47e6e0f:独立编译成功;4 个程序、302/302 个用例通过,失败/错误/跳过/禁用均为0。
  • 当前提交 a4cabf70710a8ee28eeb8ae7955f90ecffcccd3f:本轮仅调整服务版本/CHANGELOG 元信息;除这两项元信息外,所有跟踪文件逐字节相同。沿用上述历史运行结果,本轮未重新编译或运行 C++ 测试。文件头、全部 pre-commit 钩子、amend 提交钩子及 diff 检查已重新通过;远端 CI 结果需对应当前 SHA 单独核实。
  • Linux宿主 plain、断言启用、tests=true、unidev=true,无sanitizer插桩。复用libmcpp缓存,头文件checkout 10829fb9;缓存二进制缺少完整构建溯源,不能声称重新编译了最新libmcpp。
  • 本次为分支定向回归,不复用旧50轮计数,也不宣称间歇性故障已经由一次通过证明消除。远端门禁需按当前SHA单独核实。
  • 执行时的工作树 HEAD 为 e4db788734f0d222c48294256f8ea1aa3e339dbb,同时存在待提交修改,已在该次 commands.json 的 status_before 中记录。保存的命令/结果记录与随后提交登记将实测结果归属源码提交 db1793ba89cddc9323d2dc2e5ce418c2b47e6e0f;并非在该 SHA 提交后重新运行。本次只修正结果归属说明,没有重新编译或运行 C++ 测试。
  • 取证限制:当时未冻结完整待提交工作树的哈希,不能仅凭现存记录独立证明当时完整源码树与上述归属提交逐字相同;保留原始命令、工作树修改列表、日志、XML、已有二进制哈希及随后提交记录,不把源码归属登记当成执行时干净 HEAD 的证明。

该PR关联的issue

fixes #755

希望检视人员了解:

这是 !1307 拆分的第 4/10 项,各主题独立针对同一 main 基线,后续主线更新时需正常整合。本轮仅 !1329、!1332 保留服务版本和 CHANGELOG 更新,其余八项不单独升版;这不改变本 PR 包含运行时代码修复的事实。拆分背景与方法统一见 !1327 的 tests/README.md,原历史报告不随本 PR 提交。未执行合入。

检视意见复核(基于当前装配顺序,未调整生产代码):

  • 193676868:晚绑定或运行后换执行器是条件性限制,当前生产路径未出现该时序。 start_access_watchdog() 的唯一生产调用位于 chip_object_base.cpp::initialize_default_properties(),由已构造对象的 init() 调用;所核对 libmcpp 的对象/接口构造与服务装配先建立 owner。interface_timers_use_owner_executor 测试先完成 make_chip() 的 init,再主动更换执行器,因此停止并重建看门狗;这不是 owner 晚绑定的复现。绑定取启动时配置,不宣称支持运行中的动态 owner/executor 迁移;若将来增加该用法,应先停止在途回调再按新配置创建,不能仅去掉幂等判断。
  • 193676874:保留已到期 timer 是有界且有意的,不采纳回调末尾 reset()。 i_bus.cpp::SetAccessibility() 每次先停止旧 timer,成员最多保留一个 timer,下一次设置或析构时释放;completed_access_timer_does_not_retain_interface_parent 已明确检查这一行为。回调末尾操作 m_access_timer 本身仍在访问接口成员,会与其他线程析构/停止时对同一非原子句柄的读取和停止产生竞态;外部引用保活 timer 并不保活接口。保留成员使析构仍能找到 timer 并等待其他线程的活动回调结束,不能用“已经写入 AccessEnabled”代替这个完成条件。
likedislike
Pull Request has been successfully merged by openUBMC-robot.
(Thank you for liuxingsen's contribution.)
LliuxingsenCollaborators
25 days ago Created pull request, commit 79a45200
LliuxingsenCollaborators
25 days ago Associated issue: [任务]: 整合驱动内存边界和异步生命周期修复并完成回归验收,[任务]: 由嵌入式 CSR1 总线、芯片和 Scanner 接口显式持有无父定时器,并在析构前停止回调
openUBMC-robotopenUBMC-robotCollaborators
25 days ago Added label: sig/sig-component-drivers
openUBMC-robot
openUBMC-robotCollaborators
25 days ago Comments:

欢迎来到 openUBMC 社区

Hey @xiaoxinglxs , 感谢你对社区的贡献.

机器人使用手册

有关指令的使用,可以点击 说明文档 或 论坛 查看详情。开发人员可以在每个PR或Issue下方评论特定指令来触发机器人任务。您可以自助配置此仓库的 PR 合并规则,更多详情,请参阅机器人自助配置使用手册。

联系指引

有疑问可以联系 SIG: sig-component-drivers ,
维护者是: @dongyushan, @net_swift_wangchen, @sam_h1973, @u012924942, @weixin_37569011, @xiaoxinglxs ,
优秀贡献者是: @adellonzzy, @avery-j, @changxingOpenUBMC, @chenshengfan, @dli_bmc, @huangjiapei, @leessential, @net_swift_tianwen, @xiapengc1, @yelvsub .

likedislike
openUBMC-robotopenUBMC-robotCollaborators
25 days ago Added label: ai-co-authored
52 messages are collapsed here。 See more
openUBMC-robot
openUBMC-robotCollaborators
25 days ago Comments:

  • 标签 lgtm, approved 已被添加. 这意味着 leessential 已经检查过代码了. 👋
Tips
  • 如果PR还没有被合入, 请评论 /check-pr 进行检查. 😄
likedislike
lishengxiaoCollaborators
25 days ago Comments:

/check-pr

likedislike
openUBMC-robotopenUBMC-robotCollaborators
25 days ago Removed label: unresolved-reviews
openUBMC-robotopenUBMC-robotCollaborators
25 days ago Closed associated issue
openUBMC-robotopenUBMC-robotCollaborators
25 days ago Merged pull request, merge node SHA: 42684c10b55fb67449fc5597e92829a8f9c774e8