Merged
fix(csr1): stop embedded interface timers before teardown #1330
liuxingsenAdd on 25 days ago
fix(csr1): stop embedded interface timers before teardown #1330
Merged
Pull Request has been successfully merged by openUBMC-robot.
(Thank you for liuxingsen's contribution.)25 days ago Created pull request, commit 79a45200
Lliuxingsen
25 days ago Associated issue: [任务]: 整合驱动内存边界和异步生命周期修复并完成回归验收,[任务]: 由嵌入式 CSR1 总线、芯片和 Scanner 接口显式持有无父定时器,并在析构前停止回调
25 days ago Associated issue: [任务]: 整合驱动内存边界和异步生命周期修复并完成回归验收,[任务]: 由嵌入式 CSR1 总线、芯片和 Scanner 接口显式持有无父定时器,并在析构前停止回调
25 days ago Added label: sig/sig-component-drivers
openUBMC-robot
25 days ago Comments:
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 .


25 days ago Added label: ai-co-authored
52 messages are collapsed here。 See more
openUBMC-robot
25 days ago Comments:
25 days ago Comments:
lishengxiao
25 days ago Comments:
25 days ago Comments:
/check-pr


25 days ago Removed label: unresolved-reviews
25 days ago Closed associated issue
25 days ago Merged pull request, merge node SHA: 42684c10b55fb67449fc5597e92829a8f9c774e8
25 days ago Merged pull request, merge node SHA: 42684c10b55fb67449fc5597e92829a8f9c774e8
当前PR是否有AI参与:
[x ] 否
[] 是
__1. AI Agent 平台:
__2. AI 模型:
__3. Prompt上下文 :
PR功能描述 / 为什么需要这个合入:
CSR1 接口内嵌于宿主设备。原定时器将接口作为父对象,取消后仍存活的定时器可能在接口已销毁后访问这个父对象;析构也需先停止仍使用接口成员的回调。
修改方案:
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 单独核实。plain、断言启用、tests=true、unidev=true,无sanitizer插桩。复用libmcpp缓存,头文件checkout10829fb9;缓存二进制缺少完整构建溯源,不能声称重新编译了最新libmcpp。e4db788734f0d222c48294256f8ea1aa3e339dbb,同时存在待提交修改,已在该次commands.json的status_before中记录。保存的命令/结果记录与随后提交登记将实测结果归属源码提交db1793ba89cddc9323d2dc2e5ce418c2b47e6e0f;并非在该 SHA 提交后重新运行。本次只修正结果归属说明,没有重新编译或运行 C++ 测试。该PR关联的issue
fixes #755
希望检视人员了解:
这是 !1307 拆分的第 4/10 项,各主题独立针对同一 main 基线,后续主线更新时需正常整合。本轮仅 !1329、!1332 保留服务版本和 CHANGELOG 更新,其余八项不单独升版;这不改变本 PR 包含运行时代码修复的事实。拆分背景与方法统一见 !1327 的 tests/README.md,原历史报告不随本 PR 提交。未执行合入。
检视意见复核(基于当前装配顺序,未调整生产代码):
start_access_watchdog()的唯一生产调用位于chip_object_base.cpp::initialize_default_properties(),由已构造对象的init()调用;所核对 libmcpp 的对象/接口构造与服务装配先建立 owner。interface_timers_use_owner_executor测试先完成make_chip()的 init,再主动更换执行器,因此停止并重建看门狗;这不是 owner 晚绑定的复现。绑定取启动时配置,不宣称支持运行中的动态 owner/executor 迁移;若将来增加该用法,应先停止在途回调再按新配置创建,不能仅去掉幂等判断。reset()。i_bus.cpp::SetAccessibility()每次先停止旧 timer,成员最多保留一个 timer,下一次设置或析构时释放;completed_access_timer_does_not_retain_interface_parent已明确检查这一行为。回调末尾操作m_access_timer本身仍在访问接口成员,会与其他线程析构/停止时对同一非原子句柄的读取和停止产生竞态;外部引用保活 timer 并不保活接口。保留成员使析构仍能找到 timer 并等待其他线程的活动回调结束,不能用“已经写入 AccessEnabled”代替这个完成条件。