mdbctl setprop modify修改资源树属性信息失败问题分析
更新时间: 2026/06/02
在Gitcode上查看源码问题背景
- 单板类型:鲲鹏服务器;
- 软件版本:部分组件版本为component_drivers:1.2.30;libmcpp:1.2.35;devmon:1.2.13
- 硬件环境:网讯1G网卡;
- 涉及功能:属性更新,属性查询;
- 触发条件:mdbctl setprop modify修改资源树属性值,busctl introspect查看确认属性值被改,mdbctl lsprop查询属性值未更新。
- 业务表现:预期属性信息无论用哪种方式查询均被更新;实际mdbctl lsprop查询属性值未更新。
问题复现步骤
前提:在i_chip.cpp中添加了Drvwritedelay.Property_changed相关监控操作; 操作:通过mdbctl setprop modify修改资源树上Drvwritedelay属性值,发现通过busctl introspect查看的devmon资源树上Drvwritedelay属性内容有被更新,但是通过mdbctl lsprop查看的Chip中DrvWriteDelay属性内容没有被更新。 修改命令如下:
shell
mdbctl setprop modify Chip_SmbusChip_0101011402_dev bmc.dev.Chip DrvWriteDelay 20mdbctl lsprop查询命令如下:
shell
mdbctl lsprop Chip_SmbusChip_0101011402_devbusctl introspect查询命令如下:
shell
busctl --user introspect bmc.kepler.devmon /bmc/dev/topology/Hisport_0_dev/Pca9545_PCA9545_01010114_dev/I2cMux_Pca9545_PCA9545_01010114_dev/Complex/Chip_SmbusChip_0101011402_dev关键日志信息
定位过程
- 怀疑是否还有其他地方(闭源的代码中)对Drvwritedelay.Property_changed()进行了connector,然后去修改mdbctl lsprop查看的Chip属性?导致对同一signal的两次connector中前一个Connector被覆盖,没有生效,所以mdbctl lsprop查看的Chip属性没有更新?涉及到修改代码如下:
- modify和busctl set-property是一样的效果;代码里持续在修改这个属性,可以加点打印验证,或者说通过getprop看下这个属性的配置,是否引用了其他对象,导致查询的时候值重新刷新了;此前曾通过mdbctl setprop set设置过这个属性,set模式为覆写模式,其余的属性修改在unset之前都不会显现,也可以通过mdbctl setprop unset之后再试; 尝试结果:执行mdbctl setprop unset命令后再调用mdbctl setprop modify命令修改Drvwritedelay属性,mdbctl lsprop Chip回显的Drvwritedelay属性恢复初始值后保持不变,"busctl --user introspect"回显的Drvwritedelay属性会根据传参值进行修改;
- 使用getprop方法查询这个属性的结果,命令参考mdbctl lsprop getprop命令介绍;
- 确认csr是否生效,结论生效正常;
- 试一下ssh下执行lsprop查询,看能否查询到符合预期的值;ssh下查询是准确的(mdbctl和busctl查询都是准确的),telnet下不是。抓线显示实际延时是18;
- 猜测应该是因为未写入共享内存导致的,目前看可能跟信号订阅的方式有关,尝试update_drvwritedelay_value传入的this->DrvWriteDelay改为如下图: 测试结果:还是不行。网卡侧有抓波形,modify的修改是有作用到实际的,但还是没有更新mdbctl lsprop返回的bmc.dev.Chip,如下图。
- 尝试libmcpp/include/mc/engine/property.h 文件里if m_signal分支的return注释掉,不做异常返回;
问题原因
信号订阅的方式不正确,空信号依然为正常信号,异常退出的话会导致后续的更新和注册会异常,导致属性修改没写入共享内存。
解决方案
对于异常信号,例如空信号,不再直接返回,正常执行,后续执行过程中退出。验证方法以复现步骤为基础进行测试即可。