先说结论:csr中的同步语法和资源树属性配置持久化(ResetPer、PoweroffPer等)会存在冲突,导致对象加载失败。
定位过程:
在使用openubmc进行开发的时候,我们修改了一张GPU卡的csr中一个属性值的来源:
“UncorrectableError”: 0 → “UncorrectableError”: “<=/GPU_1.UncorrectableError”
修改之后,该GPU卡的pciedevice组件加载失败:
![]()
error log的意思是不能给同步语法属性直接赋值,也就是代码中存在给这个属性赋值的地方。
我在代码中找到了唯一一处赋值的地方,并将其注释,但是注释后问题还在,pciedevice对象依旧加载失败。
全局搜索UncorrectableError这个属性,确实只有这一处地方给它赋值。
此时定位有些卡壳了,尝试查看其它配了同步语法的属性和普通属性的区别,发现不少普通属性都配置了ResetPer,而同步语法似乎都没有配置。ResetPer的意思复位持久化,也就是iBMC复位时,会从数据库恢复配置了ResetPer的属性的值。
那从数据库恢复属性值的时候会不会与同步语法冲突?于是将UncorrectableError属性的ResetPer去掉,重新gen并出包验证,发现问题消失,pciedevice对象成功加载,故此得出结论。
如果各位大佬有别的结论或者想法希望可以跟帖分享。


