已开启
fix: 路由重绑定向撤销旧事务并恢复端点 #15
liuxingsen创建于 13 天前
fix: 路由重绑定向撤销旧事务并恢复端点 #15
已开启
liuxingsen创建于 13 天前
liuxingsen成员
13 天前

当前PR是否有AI参与:

[ ] 否

[x] 是
__1. AI Agent 平台: OpenAI Codex
__2. AI 模型: gpt-6-astra(实现、测试和独立只读复核)
__3. Prompt上下文 : 用户要求继续SP888-MCTP阶段1,修复地址/路由变化后的旧事务失效及评审意见,完成真实验收后再发布模板;mctpd仅提交PR、暂不合入。

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

同物理地址的EID或路由字段变化未触发更新,端点、等待查询和MDB通知仍使用旧身份;两张网卡交换EID时按“物理地址或EID”首匹配还会串改另一张卡的登记。

修改方案:

比较完整路由字段,先撤销旧身份再恢复新路由;定向退休端点、唤醒对应等待查询并对接重组/响应预约和PLDM回复上下文清理。登记优先匹配物理身份,多协议消费者逐个恢复;驱动失败标记未就绪,随现有路由刷新重试,支持失败后换EID。修复MDB订阅参数、空signal、延迟订阅重复投递,物理迁移重建路径并刷新诊断映射。协议类型是登记键,换类型需独立登记。版本保持1.130.20、一个提交。

验证方案:

独立main基线构建native/ARM并执行全部单测;与!11共享传输、!12取时、!13回复上下文、!14有界发送整合后验收真实重绑、资源耗尽和恢复。

测试建议:

在专用43000覆盖活动查询/回复上下文/TX中途改址、两卡交换EID、驱动暂时失败和恢复,核对其他网卡不中断及MDB通知归属。继续真实未授时、压力、Control纳管/V2和阶段2。

自验证报告:

  • 当前提交 e63cbf5544422b6b40d333a1785bbbb163034971:127/127通过、完整pre-commit与差异检查通过;841新增/40删除、版本仍1.130.20、单提交。

  • 撤销端点后正常及延迟初始订阅都不再查找已移除端点,恢复后仅投递一次;先复现3次无效查找再修复通过。真实PCIe报文解析会提供完整来源BDF;缺失物理上下文保持拒收,新增正反用例确认,不放宽来源隔离。

  • 集成8185d56配合qemu_mockup f14e28f(模块b2533c73)在43000实测:44次PLDM请求、NC-SI前后各8查询全部通过;变更卡旧查询3.48秒MctpEndpointReset,未变更卡15.02秒MctpRequestTimeout;旧来源0误投递,重绑与恢复8条通知正确归属。stubs=[]、未注入查询响应,inventory_ready=true。

  • 该实机结果对应8185d56;当前追加的撤销订阅守卫和来源解析测试未安装实测。生产C++未变化,沿用主线C++构建及冻结清单。本轮Lua执行与历史ARM/native构建记录分别保留。

  • 完整阶段1的Control/V2、资源压力、真实未授时,以及阶段2尚未完成,不将局部通过视为整体验收。控制台与其他实例未重启。

  • 当前追加计时器所有权修复:撤销等待项先清空timer再停止,唤醒后的请求退出不重复停止。新增回归先复现2次清理,再通过仅1次清理;126项与完整pre-commit通过,真实8185d56结果仍是此前候选,不冒充本修订实测。

  • 介质评审补证:add_reg_info固定登记PCIe,SMBus发现不进入该表;新增同地址/EID的SMBus端点测试,PCIe登记改址和清表均保持SMBus端点可用。该测试在原实现上即通过,未伪造失败或以重放PCIe路由替代SMBus纳管。当前修订仅补测试与范围文档,生产源码与8ea5479一致。

该PR关联的issue

fixes #15

希望检视人员了解:

计划依次整合!11(1.130.16)、!12(1.130.17)、!13(1.130.18)、!14(1.130.19)、本PR(1.130.20),共享文件整合必须保留双方修改。协议定向清理依赖!11;PLDM pending清理在启用!13时生效;旧排队TX身份检查依赖!14。单独main可运行,但不能提供缺失模块的能力。已经写入硬件的报文不能撤回,完整SMBus接口身份、本端全局复位后的旧Tag隔离、Control资源和V2仍未完成。全部mctpd PR保持未合入,不触发合并机器人。

likedislike
合并受阻
Lliuxingsen成员
13 天前 创建了 pull request,commit 1c112a2d
Lliuxingsen成员
13 天前 关联了issue:修复路由变化漏报与MDB端点重绑通知
openUBMC-robotopenUBMC-robot成员
13 天前 添加了label:sig/sig-component-drivers
openUBMC-robot
openUBMC-robot成员
13 天前 评论:

欢迎来到 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-robot成员
13 天前 添加了label:ai-co-authored
此处折叠了117条消息 查看更多
openubmc-ci-bot成员
13 天前 评论:

人工检视报告

感谢 @xiaoxinglxs 的贡献!本 PR 针对「同物理地址 EID/路由字段变化未触发更新、两卡交换 EID 的登记串改、驱动失败后恢复、MDB 订阅与物理迁移」做了系统性重构:路由表改为比较完整平坦字段并「先撤销旧身份/事务再发布新路由」;retire_peer 定向退休端点并终结等待/重组/响应预约/PLDM 回复上下文;upd_mdb_endpoint 修正订阅参数与重绑、以 active/route_withdrawn/config_failed 保护延迟订阅和驱动失败重试。整体设计自洽、测试覆盖充分,与既有多个机器人评论(多数已 resolved)处理方向一致。

📋 检视概览

项目 详情
评级 良好
严重问题 0
警告 1
建议 1

已确认修复的问题 ✅

  • 路由撤销路径已补 PCIe 绑定守卫(on_del_entry/on_del_reg 过滤 phys_transport_binding_id),与 on_add_entry 对称,非 PCIe 同地址删除不再误撤销 PCIe 端点,且恢复/撤销介质守卫不对称问题已由回归覆盖。
  • retire_peer 与 request 的计时器所有权已收敛:撤销前先清 wait.timer 再 stop,唤醒后的请求退出不再重复停止,双停问题有单测(test_retirement_stops_wait_timer_once_before_resume)。
  • PCIe 陈旧来源校验已落地(rx 按 remote_phy_addr 与当前端点物理身份比对),并有正/反回归及 wire parser 来源注入测试。

需关注的问题(已关联代码行)

# 文件 行 级别 说明
1 src/lualib/mctp_engine.lua 543 ⚠️ 警告 超时/复位时跳过 more_process_cb 可能残留 NVMe 重放/对账状态
2 src/lualib/mctp_engine.lua 567 💡 建议 reservation 参数入 wait_info 后从未被读取,属死代码

结论与建议

核心路由重绑、退休与恢复逻辑正确且测试充分,可作为本次迭代候选。建议后续合入前:

  1. 澄清 more_process_cb 在超时/撤销路径上的 NVMe 状态清理语义(当前行为变更需显式确认);
  2. 清理未使用的 reservation 参数字段,避免维护歧义。
    其余待办(完整 SMBus 接口身份、本端全局复位后的旧 Tag 隔离、Control/V2、阶段 2)与 PR 描述一致,可继续在后续迭代推进。
likedislike
Oopenubmc-ci-bot成员
13 天前 删除了label:ci-running
openubmc-ci-bot成员
13 天前 评论:
任务名称结果
pre-commit检查✅ SUCCESS
PR描述检查✅ SUCCESS
防投毒检查✅ SUCCESS
开源合规检查✅ SUCCESS
编译构建✅ SUCCESS
UT测试✅ SUCCESS
IT测试❌ FAILED
代码覆盖率❌ FAILED
修改行数检查✅ SUCCESS
头文件检查✅ SUCCESS
AI Review✅ SUCCESS
likedislike
Oopenubmc-ci-bot成员
13 天前 添加了label:ci-failed
liuxingsen成员12 天前进行代码检视1
src/lualib/mctp_engine.lua
@@ -449,29 +573,30 @@
573+ self.rsp_wait_list[key] = nil
574+ end
575+ if wait_info.timer then
576+ stop_timer(wait_info.timer)
577+ end
578+ if not ok then
579+ return E_ERROR, err
449580 end
450- 
451- self.rsp_wait_list[key] = nil
452- stop_timer(wait_info.timer)
453581 
454582 if wait_info.is_timeout then
455583 self:log_mctp_time_out()
@@ -484,6 +612,11 @@ function c_mctp_engine:rx(ctx, data, msg_type, medium_type)
484612 local src_eid = mctp_ctx.src
485613 local ep = self.endpoints:get_endpoint(src_eid, msg_type, medium_type)
486614 if ep then
615+ -- EID可被另一张卡复用;通知也必须来自该端点当前的物理身份。
616+ if medium_type == mctp_def.PHY_MEDIUM_PCI and ctx:get('remote_phy_addr', 'pcie_vdm_ctx') ~= ep.phy_addr then
617+ log:debug('[System%s]drop stale PCIe source for eid=%d type=%d', self.system_id, src_eid, msg_type)
618+ return true
619+ end
487620 return ep:rx(ctx, data)
488621 end
489622 
@@ -498,7 +631,10 @@ function c_mctp_engine:config_eid_table(reg)
498631 reg_info.msg_src_eid = reg.msg_src_eid
499632 reg_info.msg_type = reg.msg_type
500633 if self.hw_pcie_proto:config_eid_table(reg_info) then
634+ reg.config_failed, reg.ep_status = nil, mctp_def.ENDPOINT_IS_DISCOVERY
liuxingsen12 天前评论:

[P2] 按整数返回码判断登记结果,使失败恢复分支可达

驱动登记失败时,本 PR 新增的未就绪标记和路由刷新重试实际上不会执行:hw_pcie_vdm_channel::config_eid_table() 返回 int(成功为 0,失败返回 E_ERROR=-1 或驱动非零错误码),l_mctp.cpp:415 又通过 c_func_wrap 直接把整数交给 Lua;Lua 中 0 和 -1 都是真,因此这里总进入成功分支,清掉 config_failed、把端点标成已发现并创建端点。on_entry_updated 只重试 config_failed 的登记,后续同值路由刷新也不会恢复。当前 SHA 的真实 Lua 函数以 -1/0 返回值做隔离探针时,首次失败后得到 status=1, config_failed=nil, endpoint_exists=true,刷新后驱动调用仍为 1 次;测试中用 false/true 模拟驱动掩盖了该契约。请显式比较成功返回码(或在绑定层明确定义布尔返回),并将失败/恢复回归改为真实数字返回值。这里指出的是本 PR 新增恢复分支不可达;原有裸真假判断不另记一个旧缺陷。

likedislike