bmc重启后,网络适配器下总线信息 BusInfo重启前与重启后不一致,偶现 2次/100次

问题描述

KL 2280 V2 + 920BS + SF221Q ;bmc重启后,网络适配器下总线信息 BusInfo重启前(0000:34:00.0)与重启后(0000:00:00.0)不一致,偶现 2次/100次

配置文件中,NetworkAdapter_1下的Bus、Device、Function均取用PCIeDevice_1下属性:

查看日志中 /bmc/kepler/Systems/1/PCIeDevices/PCIeDevice_1_010105

bmc.kepler.Systems.PCIeDevices.PCIeDevice Bus、Device、Function均为0

环境信息

  • 软件版本:OpenUBMC2603

重现步骤

  1. 重启bmc,有概率出现

期望结果

总线信息在重启前后保持一致,PCIeDevice_1下Bus、Device、Function信息通常由bios上报,重启bmc是否会有概率导致数据丢失?

实际结果

重启bmc后总线信息发生变化

尝试过的解决方案

NA

分析结论

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

结论(基于现有信息)

在 BMC 重启过程中,PCIe 设备信息(BDF)的获取存在时序依赖,且 bmc.kepler.pcie_device 服务当前不可用,导致 PCIeDevice 属性(Bus、Device、Function)在部分情况下未能被正确更新,初始化为 0。随后 NetworkAdapter 组件读取了这些默认值,造成重启前后总线信息不一致。

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

根据您提供的问题描述和知识库中的相关信息,对“BMC重启后,网络适配器下总线信息 BusInfo 重启前后不一致(偶现 2次/100次)”的问题进行如下分析:

问题概述

  • 现象:BMC重启后,网络适配器(NetworkAdapter_1)下的总线信息(Bus、Device、Function)从重启前的 0000:34:00.0 变为重启后的 0000:00:00.0。
  • 配置:NetworkAdapter_1 下的 Bus、Device、Function 均取自 PCIeDevice_1 的属性。
  • 日志:查询 /bmc/kepler/Systems/1/PCIeDevices/PCIeDevice\_1\_010105,发现 bmc.kepler.Systems.PCIeDevices.PCIeDevice 的 Bus、Device、Function 均为 0。

相关背景(来自知识库)

  • PCIeDevice 对象:代表 PCIe 设备,其属性包括 Bus、Device、Function(BDF),用于标识设备在 PCIe 拓扑中的位置。BDF 信息通常由 BIOS 提供,BMC 通过 PMU(Power/Platform Management Unit)获取设备的配置信息(包括 BDF 四元组)。
  • 服务可用性:知识库指出 bmc.kepler.pcie_device 服务当前不可用,缺少对应的 .service 文件,这可能导致 PCIe 设备监控与管理功能不完整。
  • 类似时序问题:文档块 8 描述了 AC 重启后,BIOS 在 BMC 尚未准备好丝印信息时获取数据,导致返回空值或错误,最终 BMC 无法正确上报信息。这体现了启动阶段组件加载顺序对数据一致性的影响。

可能原因分析

  1. BDF 信息获取时序异常
    BMC 在启动过程中可能未能在网络适配器组件读取 PCIeDevice 属性之前,从 BIOS/PMU 获取正确的 BDF 值。由于 PCIeDevice 的 Bus、Device、Function 初始可能默认为 0,若后续更新未完成(或未触发),则 NetworkAdapter 读取到的是默认值 0000:00:00.0。

  2. PMU 通信或服务启动失败
    BMC 需要查询 PMU 来获得 PCIe 设备配置数据。若 PMU 通信在重启后未及时就绪,或 bmc.kepler.pcie_device 服务不可用,可能导致 PCIeDevice 属性无法被正确填充,从而保持为 0。

  3. 与已知案例类似的服务加载阻塞
    文档块 8 中,fructrl 组件在 BMC 尚未完全启动时被 BIOS 访问,导致数据为空。同理,此处可能是网络适配器组件在 BMC 完成 PCIe 设备信息初始化前,就获取了属性,且该次获取仅进行一次,后续未更新。

  4. 偶发性与初始化失败
    “偶现 2次/100次”提示为概率性问题,可能与每次启动时 PMU 响应延迟、服务竞争或总线时序变化有关。

结论(基于现有信息)

在 BMC 重启过程中,PCIe 设备信息(BDF)的获取存在时序依赖,且 bmc.kepler.pcie_device 服务当前不可用,导致 PCIeDevice 属性(Bus、Device、Function)在部分情况下未能被正确更新,初始化为 0。随后 NetworkAdapter 组件读取了这些默认值,造成重启前后总线信息不一致。

建议方向(基于知识库已有的解决方法思路)

  • 参考文档块 8 的解决方案:调整启动时序,确保 BMC 在 PCIe 设备信息完全就绪后再允许相关组件读取属性(例如等待所有服务启动完成,或增加初始化等待时间)。
  • 确认 bmc.kepler.pcie_device 服务为何缺失,补齐 .service 文件或修复服务加载问题,以保证 PCIe 设备监控功能可用。
  • 检查 PMU 与 BMC 的通信机制,确保 BMC 能稳定获取 BDF 四元组信息。

注:以上分析严格基于提供的知识库和文档块内容,未引入外部信息。若需要进一步根因定位,建议检查启动日志中 PCIeDevice 属性初始化与更新的具体顺序。

20260904145908.zip (29.4 MB)

感觉只分析了一半哦,要继续分析下重启BMC下PCIeDevice是属性是怎么设置的

咨询下,sr文件里的PCIeAddrinfo属性在什么情况下会进行持久化设置,持久化设置时失败,导致PcieAddrInfo_NIC_1_010101对象挂掉

问题原因为:

app.log日志中报错,原因是网卡的PCIeDevice未在PCIeAddrinfo列表中匹配到对应的PCIeAddrinfo,从而给PCIeDevice分配Bus、Device、Function等信息,匹配逻辑为

PCIeAddrInfo.ComponentType == PCIeDevice.DeviceType && PCIeAddrInfo.SlotID == PCIeAddrInfo.SlotID

if addr_obj:get_prop('ComponentType') == obj:get_prop('DeviceType') and
    addr_obj:get_prop('SlotID') == obj:get_prop('SlotID') and addr_obj:get_prop('SlotID') ~= 0 then
    obj:sync_pcie_addr_info(addr_obj)
    self:update_pcie_type(biz_topo_service, obj)
     -- 对于multihost场景,需要继续遍历
    ret = true
end

根据日志dump_info\AppDump\pcie_device\mdb_info.log来看,PcieAddrInfo_NIC_1_010101似乎并没有被加载上,导致没有找到相关的PCIeAddrInfo去分配信息

2026-09-04 14:47:38.534480 pcie_device ERROR: device_service.lua(607): [DeviceService] Can not find matching PCIeAddrinfo, PCIeDevice position=010105 DeviceType=13 SlotID=1

进一步发现PcieAddrInfo_NIC_1_010101的Bus再持久化设置时设置失败,导致对象挂掉

2026-09-04 14:25:21.426514 pcie_device ERROR: object_manage.lua(325): AddObject PcieAddrInfo_NIC_1_010101 failed, life_cycle_id:1, error:kepler.class.SetSyncPropertyError: The property Bus of the object PcieAddrInfo_NIC_1_010101 is a synchronous property and cannot be set


对象配置PcieAddrInfo_NIC_1中,bus使用表达式

		"PcieAddrInfo_NIC_1": {
			"Segment": 0,
			"GroupID": 1,
			"SlotID": 1,
			"SocketID": "<=/Scanner_4PFlag.Status;<=/Scanner_4PFlag.Value |> expr((($1 == 0) && ($2 == 4)) ? 2 : 0)",
			"Bus": "<=/Scanner_4PFlag.Status;<=/Scanner_4PFlag.Value |> expr((($1 == 0) && ($2 == 4)) ? 180 : 52)",
			"Device": 0,
			"Function": 0,
			"Location": "CpuBoard${Slot}",
			"ContainerSlot": "${Slot}",
			"ComponentType": 13,
			"ControllerIndex": 0,
			"ControllerType": 1,
			"ContainerUID": "00000001020302083825",
			"ContainerUnitType": "BCU",
			"GroupPosition": "PcieAddrInfo_NIC_1_${GroupPosition}",
			"@Default": {
				"SocketID": 0
			}
		},

PcieAddrInfo_NIC_1是配置在KunLunServer_CSR_PSR仓库内,此文件同步过来后没有做修改,其中PcieAddrInfo_NIC_1的Bus配置为表达式,与持久化数据不允许配置表达式冲突,请问文件配置时的背景是什么?

KunLunServer_CSR_PSR/src/0502YLDV/source/00000001020302083825.sr

优先检查:

  1. 当前使用的代码里,是否有对pcieaddrinfo对象进行持久化的配置(见model.json)
  2. 当前csr里是否使用了同步语法

持久化和同步语法是互斥的,同步语法会导致持久化失败。