mdrv2: Attempt to update D-Bus objects in place
When systemInfoUpdate() is called multiple times, there's a potential
race condition of a user polling for the objects while the array of
D-Bus objects are erased and being repopulated. This results in
incomplete set of memory or CPU counts, which can lead to unforseen
consequences.
Tested: Verified that a corner case that was hitting this case
consistently (when SMBIOS was transferred using ipmi-blob repeatedly)
goes away with this implementation.
Signed-off-by: Brandon Kim <brandonkim@google.com>
Change-Id: I312aa91cd11b1dd06502d04272889922108d39a2
diff --git a/include/cpu.hpp b/include/cpu.hpp
index 6328393..bae8dc0 100644
--- a/include/cpu.hpp
+++ b/include/cpu.hpp
@@ -129,10 +129,11 @@
Item, association>(bus, objPath.c_str()),
cpuNum(cpuId), storage(smbiosTableStorage), motherboardPath(motherboard)
{
- infoUpdate();
+ infoUpdate(smbiosTableStorage, motherboard);
}
- void infoUpdate(void);
+ void infoUpdate(uint8_t* smbiosTableStorage,
+ const std::string& motherboard);
private:
uint8_t cpuNum;
diff --git a/include/dimm.hpp b/include/dimm.hpp
index dbeb053..1ea406a 100644
--- a/include/dimm.hpp
+++ b/include/dimm.hpp
@@ -86,13 +86,13 @@
sdbusplus::server::object_t<sdbusplus::server::xyz::openbmc_project::
state::decorator::OperationalStatus>(
bus, objPath.c_str()),
- dimmNum(dimmId), storage(smbiosTableStorage),
- motherboardPath(motherboard)
+ dimmNum(dimmId)
{
- memoryInfoUpdate();
+ memoryInfoUpdate(smbiosTableStorage, motherboard);
}
- void memoryInfoUpdate(void);
+ void memoryInfoUpdate(uint8_t* smbiosTableStorage,
+ const std::string& motherboard);
uint16_t memoryDataWidth(uint16_t value) override;
size_t memorySizeInKB(size_t value) override;
diff --git a/include/pcieslot.hpp b/include/pcieslot.hpp
index f984650..ccedcb9 100644
--- a/include/pcieslot.hpp
+++ b/include/pcieslot.hpp
@@ -47,13 +47,13 @@
const std::string& motherboard) :
sdbusplus::server::object_t<PCIeSlot, location, embedded, item,
association>(bus, objPath.c_str()),
- pcieNum(pcieId), storage(smbiosTableStorage),
- motherboardPath(motherboard)
+ pcieNum(pcieId)
{
- pcieInfoUpdate();
+ pcieInfoUpdate(smbiosTableStorage, motherboard);
}
- void pcieInfoUpdate();
+ void pcieInfoUpdate(uint8_t* smbiosTableStorage,
+ const std::string& motherboard);
private:
uint8_t pcieNum;