通过BMC下发hPPR命令返回U0后,维护日志没有触发hPPR

// 此模板仅供参考,如果不适用可以修改

问题描述

通过BMC下发hPPR命令返回U0后,维护日志没有触发hPPR

环境信息

  • 操作系统:[如 Ubuntu 24.04]

  • 软件版本:[如 OpenUBMC2509]

  • 硬件配置:920Bpro

重现步骤

  1. [第一步] 在BIOS侧开启hPPR开关,使用redfish开启MemHardPPREnabled

  2. [第二步] 使用ssh连接BMC,在 BIOS启动过程中下发命令

  3. [第三步]查看 维护日志 ,没有BMC下发命令操作和触发hPPR隔离操作

期望结果

下发命令成功后,有触发hPPR操作

实际结果

命令下发成功后,无触发hPPR操作记录

尝试过的解决方案

1、下发sPPR成功,

分析结论

[详细总结您对此问题的分析结论]

答案内容由AI生成,仅供参考:

初步结论

U0 仅表示 BMC 命令层成功,不保证硬件层 hPPR 真正执行。维护日志无记录可能是:

  • 新版本的设计(成功事件仅通过属性暴露)
  • 功能开关未完全生效
  • 命令参数或硬件限制导致隔离未实际触发

建议优先通过上述第 2、3 步确认隔离是否真实执行,再根据结果针对性调整配置或深入硬件层面。若问题持续,建议收集完整的 BMC 日志(app.log、maintenance log 等)和命令调用过程,以便社区或开发团队进一步分析。

点击此处查看详细分析解答

问题分析

从您描述的现象看,通过 BMC 下发 hPPR 命令返回 U0(通常对应 IPMI 完成码 00h,表示命令执行成功),但维护日志中没有触发 hPPR 相关记录。结合知识库中的信息,可能的原因及排查方向如下。


1. 命令返回 U0 的含义

  • 知识库说明:在 IPMI 规范中,完成码 00h 表示成功(Completion Code 实体)。对于 hPPR/sPPR 等内存隔离命令,自定义返回码 U0 通常对应 ResultState 的 bit[7] = 0(成功)且 bit[0:6] = 0(无附加错误),可参考《上报内存隔离结果》文档中的响应码定义。
  • 但成功码只说明 BMC 已接收并处理了命令,并不代表硬件层面确实执行了 hPPR 隔离。

2. 维护日志未记录的可能原因

2.1 维护日志的记录策略

在较新的 openUBMC 版本中,内存隔离的成功/失败事件不再通过传统维护日志打印,而是通过新增属性 MemIsolationSuccessBitmap / MemIsolationFailureBitmap 指示(详见 【已评审】新增属性支持内存隔离执行成功/失败指示)。其中 hPPR 对应 bit2。

  • 如果是新特性版本:成功执行后不会在维护日志自动打印,需查询上述属性确认(例如通过 busctl get-property 获取)。
  • 如果仍期望日志打印:可能需要检查日志级别或确认该次隔离是否真的被硬件执行(见下)。

2.2 功能开关未正确开启

  • BIOS 侧:需在 BIOS setup 中开启 hPPR 相关开关(如 MemHardPPREnabled)。
  • BMC 侧:需通过 Redfish 或配置导入导出功能将 BMCSet_MemHardPPREnabled 设为 "on"(值对应 true),并确认 MemHardPPREnabled 开关生效(详见 【已评审】部分内存故障预隔离开关项支持配置导入导出和装备定制化)。
  • 若开关未正确生效,命令可能返回成功但实际不触发硬件隔离,维护日志自然无记录。

2.3 命令参数问题

  • hPPR 命令需指定准确的地址信息(CPU、Channel、Dimm、Rank、SubRank、Device、Bank、Row、Col 等)。从《Get Memory HPPR Address》命令格式看,参数错误可能导致 BMC 返回成功但硬件不执行。
  • 可对照《Get Memory HPPR Address》请求中的域定义,检查下发命令的参数字节是否合法。

2.4 硬件或资源限制

  • 硬件不支持:部分平台可能不支持 hPPR 功能。
  • 资源耗尽:如果 BankGroup 中已无冗余资源,隔离会失败。响应码 U0 可能掩盖了真实状态——但实际上硬件未执行(参考《上报内存隔离结果》中 hPPR 的响应码定义,资源耗尽对应响应码 3)。
  • CPLD 透传问题:BMC 通过 HardwareProxy 下发命令,若 CPLD 或底层通信异常,也可能出现命令成功但实际未触发的现象。

3. 排查建议

  1. 确认功能开关

    • 使用 Redfish 或 busctl get-property 检查 BMC 侧 MemHardPPREnabled 是否为 true。
    • 查看 BIOS setup 中 hPPR 选项是否已开启。
  2. 查询隔离结果属性

    • 调用 busctl --user call bmc.kepler.Systems.FDMDomain.MemoryRAS ... 获取 MemIsolationSuccessBitmap,检查 bit2(hPPR)是否从 0 变为 1。若已置位,说明隔离成功,维护日志不打印是设计行为。
  3. 使用 Get Memory HPPR Address 命令验证

    • 下发 ipmicmd -k "0f 00 30 92 db 07 00 66 ..." 查询当前已隔离的 HPPR 地址列表。如果成功隔离,返回应有非零的地址信息。
  4. 检查 BMC 应用日志

    • 查看 /var/log/app.log,搜索 fault_diagnosis 或 FDMDomain 相关关键词,可能包含 fail to send 或 Isolation failed 等错误信息(参考 sPPR 问题类似场景)。若全无打印,可考虑日志级别限制。
  5. 确认硬件兼容性与资源状态

    • 确认 CPU(如 Kunpeng 920)及内存颗粒是否支持 hPPR。
    • 查阅《Report Memory Fault Isolation Address》中的响应码定义,若硬件内返回非 0 响应码,BMC 可能仍返回 U0(需根据具体实现判断)。
  6. 参考类似问题的解决过程

    • 在 openUBMC 社区或知识库中,huangzhiyu 等贡献者曾针对内存隔离问题提供过详细的排查步骤(如检查 CPLD 透传、逻辑分析仪抓波形、验证 SMC 命令字等),可作为深入排查的指引。

初步结论

U0 仅表示 BMC 命令层成功,不保证硬件层 hPPR 真正执行。维护日志无记录可能是:

  • 新版本的设计(成功事件仅通过属性暴露)
  • 功能开关未完全生效
  • 命令参数或硬件限制导致隔离未实际触发

建议优先通过上述第 2、3 步确认隔离是否真实执行,再根据结果针对性调整配置或深入硬件层面。若问题持续,建议收集完整的 BMC 日志(app.log、maintenance log 等)和命令调用过程,以便社区或开发团队进一步分析。

注入之后查询这个对象属性值为2,注入失败

hPPR触发流程为:1、先打开BMC侧及BIOS开关,2、再在BMC侧下发命令,3、最后重启,在启动阶段BIOS会向BMC获取隔离信息。(这里2 3步骤反了)
BMC侧不会记录下发hPPR的日志(因是BIOS主动获取的隔离信息,不是BMC下发),仅在隔离之后BIOS上报BMC隔离结果后记录隔离结果日志

这里属性显示隔离失败,是因为sPPR隔离失败
(原因可见你“1、下发sPPR成功,”处维护日志截图,最后一条日志未sPPR隔离失败,原因为BIOS侧开关未打开

现在就是先在BMC下发命令,然后在强制重启,看起来还是没有触发hPPR

在下发sPPR时会有这个日志,BMC successfully reported IMU SPPR isolation information,但下发hPPR就没有这个打印,跟这个有关系吗

hPPR不会打印:“BMC successfully reported IMU XXX isolation information”,hPPR是BIOS在启动阶段主动向BMC查询的,不是BMC reported的。
发送BMC debug命令之后不能重启BMC,需要确保BIOS侧开关打开,之后OS上下电

使用反合630版本之前BMC,可以下发成功

b453e4e7-f0a7-4070-8fe2-c1bd0b031a8b

但是使用630之后的版本下发不成功。同样的操作。

image

image

新版本在装备包场景添加了debug开关,防止测试模拟故障时误触发hPPR隔离。可以通过mdbctl call FDMDomain_1_010101 bmc.kepler.Debug.Systems.FDMDomain GetConfigurations 0 "GetHpprTuneEnable"查看开关状态,1是打开,0是关闭。
通过:mdbctl call FDMDomain_1_010101 bmc.kepler.Debug.Systems.FDMDomain SetConfigurations 0 “SetHpprTuneEnable” 1 打开开关

这个debug开关只影响模拟故障时的场景嘛,不影响真实hPPR隔离问题把

只在装备场景需要打开,现网环境不需要的。