Open
fix: 隔离双向事务并保留 MCTP 查询资源 #11
fix: 隔离双向事务并保留 MCTP 查询资源 #11
Open
liuxingsenAdd on 14 days ago
liuxingsenCollaborators
14 days ago

当前PR是否有AI参与:

[ ] 否

[x] 是
__1. AI Agent 平台: OpenAI Codex
__2. AI 模型: gpt-6-astra(实现、测试与独立复核)
__3. Prompt上下文 : 用户授权接手 SP888-MCTP 联调所需的 BMC 实现,修复同 Tag 主动通知误完成查询,隔离重组并保护既有 requester 资源;按门禁拆分可独立验证的模块。

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

对端主动通知可能误完成本端同 Tag 查询,分片关联维度及资源保护不足。本 PR 隔离双向事务、重组来源并为已登记查询保留响应空间,保持 VDPCI 通知链路。

修改方案:

响应方向才可完成 VDPCI、NC-SI 和通用查询;通用 TO=1 过滤保留 DEBUG 诊断。重组键包含介质、双向物理地址/EID、Tag/TO,32 项分为普通与可信响应各16项,普通每来源4项;4096B、包间100ms和总1s上限。最多64项预期响应登记,匹配完整传输键和消息类型;同路由跨上层协议共享8个Tag。查询完成/失败/消费异常/复位释放,NVMe More Processing续期,旧协程不得删除新等待项;PCIe补齐改为resize。增加按介质、物理地址和EID定向撤销重组/响应预约并隔离旧Tag的接口,保留无关对端;上层路由接线另行提交。修正两处旧discovery测试漏传ep_name。版本1.130.16,一个提交。

验证方案:

重新构建本拆分分支 native/ARM 协议核心及绑定;验证方向、介质、物理地址、乱序、长度、超时、可信响应配额、跨类型Tag、异常及复位释放。

测试建议:

继续实际跨接口/地址代次、Control专用资源、异步硬件TX完成和NVMe More Processing最终应答。PLDM协议及Base由PR !13承载,取时业务模块由PR !12承载,本PR不含这些模块。

自验证报告:

  • 最新 47083fdb94fde59702baa33959a734b7eb932809:139/139、native/ARM协议核心和Lua绑定构建、pre-commit、生产核心ASan/UBSan均通过。拒绝超长或降为普通配额的同键SOM不删除旧合法半包;满32项时普通/保留消息的合法重启均通过。包间99.999/100ms和总期999.999/1000ms边界确定性通过;文档明确接收新片也执行100ms检查,250ms仅为空闲回收粒度。共994新增行,一个提交,版本仍1.130.16。以下历史实测保持原SHA归属,本增量尚未安装43000。

  • 当前修订7e4d6e32364f完整139/139通过、pre-commit全部通过,995新增行;本轮仅Lua发送背压计数与用例,C++源码与62f103550d0d已验证的native/ARM库一致。

  • 按介质/物理地址/EID清理重组、撤销查询预约;旧Tag隔离至原查询截止后再加1秒,拒绝迟到帧,旧release和重复invalidate不会提前解除或延长隔离,仍占64项总预算。

  • ASan/UBSan通过;确定性时钟验证1019.999/1020ms隔离边界、到期恢复及64项耗尽背压。原重组和查询续期时钟边界继续通过。

  • 四PR集成43f21765fb4e(含本PR之前修订)在43000通过正常/时间服务退出/恢复各44请求、28条通知和5次约3秒合法未应答查询。新定向接口和Tag隔离尚未安装43000,不引用旧实机结果宣称本次已验收。

  • Send在8个Tag均忙时明确失败并计数,不复用在途Tag或静默丢弃;释放后恢复。该新用例先验证计数缺失,再修复通过。调用者需处理失败并按业务策略重试。

该PR关联的issue

fixes #11

希望检视人员了解:

当前PR替换早期基础范围中的PLDM重叠代码,PLDM必要实现和测试完整保留在PR !13。!14提供PCIe有界发送,!15提供路由变化与MDB重绑;完整跨接口身份、旧事务按peer接线、Control专用配额、单包限流和阶段2仍待实现验收,不将局部通过标为整阶段完成。没有自动合入或修改无关在线服务。

likedislike
Merge blocked
LliuxingsenCollaborators
14 days ago Created pull request, commit 3ddb2d95
LliuxingsenCollaborators
14 days ago Associated issue: [任务] 修复主动通知误完成查询及 PLDM 请求编解码
openUBMC-robotopenUBMC-robotCollaborators
14 days ago Added label: sig/sig-component-drivers
openUBMC-robot
openUBMC-robotCollaborators
14 days ago Comments:

欢迎来到 openUBMC 社区

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

机器人使用手册

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

联系指引

有疑问可以联系 SIG: sig-component-drivers ,
维护者是: @dongyushan, @net_swift_wangchen, @sam_h1973, @u012924942, @weixin_37569011, @xiaoxinglxs ,
优秀贡献者是: @hzy1010, @leessential .

likedislike
openUBMC-robotopenUBMC-robotCollaborators
14 days ago Added label: ai-co-authored
269 messages are collapsed here。 See more
openubmc-ci-botCollaborators
13 days ago Comments:

人工检视报告

感谢 @xiaoxinglxs 的贡献!本轮围绕双向事务隔离、重组资源按来源/已登记响应分配、Tag 共享与异常/复位/peer 失效清理,配套单测充分(方向/介质/物理来源/乱序/长度/超时/可信响应配额/跨类型 Tag/复位与 peer 隔离),且文档与版本号同步更新,整体质量优秀。

📋 检视概览

项目 详情
评级 良好
严重问题 0
警告 0(本轮新增)
建议 0(本轮新增)

已确认修复的问题 ✅

对照既有 openubmc-ci-bot 检视意见与当前头版本 47083fd 逐条核对:

  1. 💡 SOM 被配额拒绝前清掉同键在途半包 → mctp_protocol.cpp:355 已将 m_rx_ctx.erase(id) 移到容量/配额/超长检查通过之后,被拒的 SOM 不再破坏仍有效的半包。✅ 已修复
  2. 💡 header-only MCTP 报文静默丢弃 → mctp_protocol.cpp:275 pop 改 data.size() <= mctp_hdr_len 并补 debug_log。✅ 已修复
  3. 🚨 PCIe 补齐尾后越界写入 → pcie_vdm_protocol.cpp:160 由 resize(size()+pad) + std::fill_n(begin()+size(), ...) 改为 resize(size()+pad, 0),彻底消除越界写;新增 test_tx_padding_at_capacity_boundary 覆盖。✅ 已修复
  4. ⚠️ 重组池满/超长/单包静默丢弃 → process_som、单包 som&&eom 分支均已补 debug_log。✅ 已修复
  5. ⚠️ Tag 选择与 reserve_response TOCTOU → ep_mctp.lua:158-168 在挑选 Tag 时先查 response_reserved,且「Tag 检查到 C++ 预约之间不 yield」。✅ 已处理

仍需关注/按设计保留的项

  • 250ms 闲置巡检与 100ms 包间阈值(mctp_engine.lua:242 vs INTER_PACKET_TIMEOUT=100ms):文档已明确「250ms 空闲巡检只决定空闲回收粒度,不把包间窗口延长到 250ms 或 1s」,按设计保留。
  • 通知发送路径(send)8 个 Tag 占满时抛背压异常:作者已用 test_send_reports_backpressure_without_reusing_active_tags 固化「明确失败、不复用在途 Tag、不静默丢弃、释放后恢复」的契约,属有意的有界隔离,按设计保留。
  • NC-SI 对 tag_owner 主动报文静默丢弃(不补日志):已在 PR 描述与文档说明「NC-SI 无主动报文上报接口,不宣告 AEN」;与 general 端点新增 DEBUG 日志不对称,属可观测性取舍,不阻塞。

结论

核心算法(reserve_response/response_reserved/renew_response/release_response、invalidate_peer、expire_reassembly、重组准入与来源/响应配额)逻辑自洽,message_key(介质/双向物理地址/EID/Tag/TO)与响应对应关系正确,池上限(32 重组、64 预约)、1s 总期限、peer 隔离与旧 Tag 隔离均按设计生效。建议合入;invalidate_peer 的上层接线将由后续 PR 接入,属 PR 已声明的范围外。

likedislike
Oopenubmc-ci-botCollaborators
13 days ago Removed label: ci-running
openubmc-ci-botCollaborators
13 days ago Comments:
任务名称结果
pre-commit检查✅ SUCCESS
PR描述检查✅ SUCCESS
防投毒检查✅ SUCCESS
开源合规检查✅ SUCCESS
编译构建✅ SUCCESS
UT测试✅ SUCCESS
IT测试✅ SUCCESS
代码覆盖率✅ SUCCESS
修改行数检查✅ SUCCESS
头文件检查✅ SUCCESS
AI Review✅ SUCCESS
likedislike
Oopenubmc-ci-botCollaborators
13 days ago Added label: ci-successful
liuxingsenCollaborators11 days agoStart code review1
src/lualib-src/libmctp/transport/mctp_protocol.cpp
@@ -54,2 +67,4 @@
5467void mctp_protocol::set_pcie_eid(mctp_eid_t eid)
5568{
69+ if (m_pcie_eid != eid) {
70+ reset_reassembly();
liuxingsen11 days agoComments:

[P2] EID 更新只应清理对应介质的在途状态

PCIe 与 SMBus 共用同一个 mctp_protocol。若 SMBus 查询已收到首片,此时 PCIe 重新发现经 set_bmc_eid 更新本端 EID,这里的 reset_reassembly() 会把两种介质的 m_rx_ctx 和 m_responses 一并清空:随后合法的 SMBus 尾片查不到半包,NVMe More Processing 的预约续期也返回 false,造成无关 SMBus 查询失败;set_smbus_eid 中的同类调用对 PCIe 同样存在影响。本轮用当前 47083fdb 的原始 C++ 做了 ASan/UBSan 对照:SMBus 首片→PCIe EID 10→11→SMBus 尾片,当前提交交付数为 0、预约/续期均为 false;共同基线 0fe122aa 同样操作交付数为 1,当前提交不改 PCIe EID 也交付 1。请按被修改的介质筛选清理重组与预约,将全表清空留给整引擎复位,并补充双向跨介质回归。

likedislike