已关闭
[缺陷] 双SP686C RAID卡MCTP通信失败:worker线程与smld线程跨lua_State竞态 #457
guanmaoning创建于  26 天前关闭于  9 天前
guanmaoning成员
26 天前 创建

标题格式

[缺陷] 双SP686C RAID卡MCTP通信失败:worker线程与smld线程跨lua_State竞态

版本分支

问题发现版本

openUBMC 25.12 LTS

严重程度

复现类型

环境信息

双 SP686C RAID 卡硬件环境

预置条件

双 SP686C RAID 卡硬件环境,BMC 运行正常

复现步骤

  1. BMC 上电启动,storage 服务初始化
  2. init.lua 调用 worker.new(1) 创建独立 OS 线程(拥有独立的 lua_State,记为 L_worker)
  3. sml.callback:start_module('sml.sml_callbacks') 在 worker 线程中加载 sml_callbacks.lua
  4. 当首次访问 RAID 卡时,init.lua 通过 sml.callback:send('install_mctp_writeread_cb_X', true) 向 worker 线程发送消息
  5. worker 线程收到消息后调用 cbs:set_mctp_writeread_cb(ctrl_id, mctp_writeread),底层执行 luaL_ref(L_worker) 将回调注册到 L_worker 的 registry
  6. ref_value 机制捕获 m_L = main_thread(L_worker)(即 L_worker 的主线程引用)
  7. smld 线程处理命令(如 register_controller)时,C++ sml_core 库通过 lua_rawgeti(m_L, ref) + lua_pcall(m_L, ...) 调用回调
  8. 上述 lua_pcall 从 smld OS 线程执行,但操作的 lua_State 是 L_worker → 跨线程竞态

实际结果及影响

双 SP686C RAID 卡场景下,MCTP 通信间歇性失败,200 次 AC 上下电必现。worker 线程与 smld 线程同时操作同一个 lua_State(L_worker),导致 Lua 栈/registry 损坏,MCTP 读写回调执行异常。

预期结果

MCTP 通信稳定可靠,多 RAID 卡场景下无间歇性失败。

问题定位情况

根因分析

问题根因是 worker 线程与 smld 线程跨 lua_State 竞态:

  • worker.new(1) 创建独立 OS 线程,拥有独立的 lua_State(L_worker)
  • sml_callbacks.lua 在 worker 线程中执行 cbs:set_mctp_writeread_cb(ctrl_id, mctp_writeread),底层调用 luaL_ref(L_worker) 将回调注册到 L_worker 的 registry
  • ref_value 机制捕获 m_L = main_thread(L_worker)(L_worker 的主线程)
  • 当 smld 线程处理命令时,C++ sml_core 库通过 lua_rawgeti(m_L, ref) + lua_pcall(m_L, ...) 调用回调
  • 这是从 smld OS 线程操作 L_worker 的 lua_State → 两个线程同时操作同一个 lua_State 的栈和 registry → 栈损坏/崩溃/MCTP 通信失败

关键代码路径:

  • src/lualib/sml/init.lua line 37: local sml = setmetatable({ callback = worker.new(1) }, sml_mt) — 创建 worker 线程
  • src/lualib/sml/init.lua line 53-55: sml.callback:send(mctp_ctrl_map[ctrl_idx], true) — 发送注册消息到 worker 线程
  • src/lualib/sml/sml_callbacks.lua line 67-68: cbs:set_mctp_writeread_cb(tonumber(...), mctp_writeread) — 在 L_worker 上执行 luaL_ref
  • C++ sml_core 库: ref_value 构造时 luaL_ref(L_worker) + 捕获 m_L = main_thread(L_worker),执行时 lua_rawgeti(m_L) + lua_pcall(m_L) — 从 smld 线程操作 L_worker
likedislike
openUBMC-robot
openUBMC-robot成员
26 天前 评论:

注意

此 Issue 需要负责人。 如果没有指派时, WeberChen 是默认的负责人

likedislike
openUBMC-robotopenUBMC-robot成员
26 天前 将 WeberChen 设为负责人
openUBMC-robotopenUBMC-robot成员
26 天前 添加了label:sig/sig-hardware
openUBMC-robot
openUBMC-robot成员
26 天前 评论:

欢迎来到 openUBMC 社区

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

机器人使用手册

有关指令的使用,可以点击 说明文档论坛 查看详情。开发人员可以在每个PR或Issue下方评论特定指令来触发机器人任务。

联系指引

有疑问可以联系 SIG: sig-hardware ,
维护者是: @changxingOpenUBMC, @nathanael, @xiaoxinglxs, @yelvsub ,
优秀贡献者是: @dli_bmc, @weiziang, @yelmh .

likedislike
openUBMC-robot
openUBMC-robot成员
26 天前 评论:

Issue 工作流介绍

社区的需求和缺陷的工作流状态处于纳管中。

类型 上个状态 下个状态 评论命令 谁可以操作
需求 待办的 已接纳 /todo2accepted SIG组: sig-release-management (maintainer)
需求 已接纳 开发中 /accepted2developing 仓库成员角色: Maintainer, Committer, Contributor, Owner
需求 开发中 转测中 /developing2testing 仓库成员角色: Maintainer, Committer, Contributor, Owner
需求 转测中 待验收 /testing2UAT 仓库成员角色: Maintainer, Committer, Contributor, Owner
需求 待验收 已完成 /UAT2done SIG组: sig-QA (maintainer,committer)
需求 待办的 已挂起 /todo2suspended SIG组: sig-release-management (maintainer)
需求 已挂起 已接纳 /suspended2accepted SIG组: sig-release-management (maintainer)
需求 待办的 已拒绝 /todo2rejected SIG组: sig-release-management (maintainer)
需求 已拒绝 已接纳 /rejected2accepted SIG组: sig-release-management (maintainer)
likedislike
Gguanmaoning成员
26 天前 将 guanmaoning 设为负责人
此处折叠了6条事件消息 查看更多
Gguanmaoning成员
18 天前 issue类型由 需求 改变为 缺陷
guanmaoning成员
18 天前 评论:

/todo2fixing

likedislike
openUBMC-robotopenUBMC-robot成员
18 天前 issue状态由 待修复 改变为 修复中
openUBMC-robotopenUBMC-robot成员
14 天前 关闭了 issue
openUBMC-robotopenUBMC-robot成员
14 天前 重新打开了 issue
guanmaoning成员
14 天前 评论:

/fixing2UAT

likedislike
openUBMC-robotopenUBMC-robot成员
14 天前 issue状态由 修复中 改变为 待验收
Zzhaoxiang成员
9 天前 关联了看板:openUBMC 25.12 LTS SP3缺陷看板
yanyajun成员
9 天前 评论:

/UAT2done

likedislike
openUBMC-robotopenUBMC-robot成员
9 天前 issue状态由 待验收 改变为 已修复
openUBMC-robotopenUBMC-robot成员
9 天前 关闭了 issue