南向设备树网卡网络适配器对象RootBDF在AC后变更

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

问题描述

SF400T网卡配置在南向设备树,其networkAdapter对象的RootBDF属性在AC后概现出现为0000:c1:04.ff ,正常情况为0000:c1:04.00.概率1/40

环境信息

  • 操作系统:

  • 软件版本:OpenUBMC2606

  • 硬件配置:[如 CPU、内存等]

重现步骤

期望结果

AC后不出现RootBDF的变更

实际结果

AC前为0000:c1:04.00,AC后概现0000:c1:04.ff

尝试过的解决方案

分析src/lualib/device/class/nic_mgmt/card/card_init_id.lua文件中属性同步properties_synchronizer函数,怀疑在首次更新update_root_bdf()后,在listen_update_resource_tree_property(orm_obj)开启监听前,Function才更新过来,由于时序问题导致也未监听到。所以调整了顺序,先开启了监听功能,如下:

但是后续在跑长时间AC仍然出现该问题。

(修改后还存在问题,是否是需要对update_root_bdf函数添加队列处理)

分析结论

不确定根因

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

可能的根因结论

结合知识库中的“问题原因”模板和描述,最可能的原因是:

  • BIOS 在 AC 后未能正确上报 SF400T 网卡的 Function 值,导致 BMC 获取到的 BDF 不完整(Function 字段为 0xff),而当前代码未对这类无效值做防御性校验,导致错误值被同步到资源树并持久化。

建议优先与 BIOS 团队确认该网卡在 AC 后的 BDF 上报行为,同时可在 BMC 侧增加对 0xff 无效值的过滤或重试机制,以规避概率性问题。

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

根据您提供的问题描述和相关上下文,我对“SF400T网卡在南向设备树中networkAdapter对象的RootBDF属性在AC后变更”这一问题进行了分析。结合知识库中的信息,以下是分析和建议:

问题分析

RootBDF 的本质定义

在系统中,RootBDF 实际上就是 PCIe桥的BDF(Bus、Device、Function),它并非一个独立生成的值,而是来源于 PCIeDevice 资源树对象上的 Bus、Device、Function 三个属性(来自持久化数据库、BIOS上报或CSR配置)。在代码中,network_adapter 组件就是使用这三个属性拼接出了 RootBDF 属性(self.RootBDF = val)。

异常值 0000:c1:04.ff 的疑点

正常值为 0000:c1:04.00,异常值为 0000:c1:04.ff,差异仅在 Function 字段(从 00 变成了 ff)。在PCIe协议中,0xff 通常表示:

  • 无效值或未初始化值:当一个字段未被正确写入或读取失败时,常表现为 0xff。
  • 系统复位后,相关寄存器或持久化数据可能尚未被正确加载或同步。

时序问题的深入分析

您怀疑是时序问题,并尝试通过调整监听顺序来解决,但仍未根除。基于知识库中的信息,问题可能出在以下环节:

  1. 数据源本身的不一致:知识库中提到“RootBDF 使用大写BDF格式(如 0000:B4:03.0)在 iBMA 查询中,而在 silkconfig.json 中使用小写格式(0000:b4:03.0)”,这暗示系统中存在大小写格式的差异。更有价值的信息是:“iBMA 使用大写 BDF 格式查询,而字典查找是大小写敏感的,导致匹配失败”。这说明大小写不一致会直接导致匹配或同步失败。

  2. BIOS 的上报时序:RootBDF 的值最终来源于 BIOS 上报或 CSR 配置。如果在 AC 后,BIOS 尚未完成上报或上报的值本身不完整(如 Function 字段为 0xff),那么 BMC 侧拿到的就是一个不完整的数据。

  3. 持久化数据的回读:系统重启后,RootBDF 可能从持久化数据库中恢复。如果持久化的数据本身有问题(如存储时 Function 字段未被正确写入),则恢复后就会出现 0xff。

关于您尝试的方案

您将监听提前到 update_root_bdf() 之前,确实改善了部分时序问题,但问题仍存在。这说明根因可能不仅仅是监听时序,而更可能是数据源(BIOS/CSR/持久化)在 AC 后本身就无法提供正确的 Function 值。

建议的排查方向

基于以上分析,建议从以下方面进一步排查:

  1. 验证 BIOS 上报的 BDF 值:在 AC 后,通过日志(关键字 pcie_device、PcieCardBDF)查看 BIOS 上报的 BDF 中 Function 字段是否为 0xff。如果 BIOS 上报的就是 ff,则问题在 BIOS 侧,需确认 BIOS 是否正确配置了该网卡的 Function 号。

  2. 检查 CSR 配置:确认 SF400T 网卡在 BDFConfig 中的配置是否完整,包括 Function 字段。如果 CSR 中未配置或配置为默认值,可能导致 AC 后读取到 ff。

  3. 关注持久化数据的恢复逻辑:查看 AC 重启后,RootBDF 是从持久化数据库恢复还是从 BIOS/CSR 重新获取。如果是从持久化恢复,请确认持久化的数据在 AC 前是否被正确写入(可在 AC 前通过 busctl introspect 或 mdbctl lsprop 主动查询确认)。

  4. 防御性处理:在代码中增加对 0xff 这类无效值的校验。如果检测到 Function 为 0xff,可尝试重新从 BIOS/CSR 获取或延后更新,避免错误值被持久化。

  5. 队列化的可行性:您提到是否为 update_root_bdf 添加队列处理。从知识库来看,该函数是一个同步更新函数,增加队列可以保证顺序执行,但如果数据源本身是错误的(如 BIOS 上报 ff),队列化并不能解决根本问题,只能缓解竞争条件。

可能的根因结论

结合知识库中的“问题原因”模板和描述,最可能的原因是:

  • BIOS 在 AC 后未能正确上报 SF400T 网卡的 Function 值,导致 BMC 获取到的 BDF 不完整(Function 字段为 0xff),而当前代码未对这类无效值做防御性校验,导致错误值被同步到资源树并持久化。

建议优先与 BIOS 团队确认该网卡在 AC 后的 BDF 上报行为,同时可在 BMC 侧增加对 0xff 无效值的过滤或重试机制,以规避概率性问题。

20260823155402.tar.gz (9.7 MB)

问下这个问题有什么影响嘛,networkAdapter的RootBDF错误,PcieDevice的bus,device,Function正确。除了影响网络适配器界面的显示,还有什么影响嘛,实际的会影响什么模块嘛

影响你要看代码分析哦,用opencode或者claude code分析下,很容易的

建议在network_adapter模块每次设置RootBDF之前把设置的值和对应的调用栈打印出来,这样就复现时就知道异常属性是哪里设置进去的,调用栈用这个函数debug.traceback()

好的 今天复现一下

请问这边增加打印后,日志打印具体是什么情况呢

定位进展:

1、根据日志发现NetWorkAdapter属性同步是根据设备树对象PcieNicCard来同步的,然后日志中的PcieNicCard对象的Function属性也为0xFF。

image

2、所以问题在于Pcie_device组件仓中资源树向设备树同步时的问题。Function属性由pcidDevice从PcieAddrInfo属性变化监听,然后同步资源树对象属性到设备树对象属性(Function的途径),但是并没有上报属性同步失败的日志。

3、在on_add_device_obj会创建pciedevice对象然后第一次由资源树同步设备树属性。在on_dev_prop_changed监听PcieDevice变化。

猜测1:在首次初始化和监听 中间Function才传递过来,导致没有触发设置。

猜测2:在首次初始化 和 监听存在时序问题,首次初始化阻测,导致后续监听真实变化时被刷新回去。

1、最终pcie_device和network_adapter的Function值是多少;
2、如果pcie_device正常的话,network_adapter监听变化那有没有监听到

PcieDevice对象的Function为正常的0,NetworkAdapter对象的Function为不正确的0xFF.

network_adapter监听变化和初始化中没有添加属性同步的日志记录,也没有失败的记录。