Blame SOURCES/0023-dmi-avoid-creating-multiple-memory-nodes-700.patch

21ef37
From 2afe96801354fdf6bb49d230f357131c6b49fbcc Mon Sep 17 00:00:00 2001
21ef37
From: Dan Callaghan <dcallagh@redhat.com>
21ef37
Date: Thu, 16 Jul 2015 16:46:44 +1000
21ef37
Subject: [PATCH 23/26] dmi: avoid creating multiple memory nodes (#700)
21ef37
21ef37
The rest of the codebase expects to only find at most one "memory" node,
21ef37
even though the SMBIOS data may indicate more than one.
21ef37
21ef37
If we really do find more than one memory array with type System Memory
21ef37
in SMBIOS, we just discard the subsequent ones and place all memory
21ef37
devices (DIMMs) into the first memory array.
21ef37
---
21ef37
 src/core/dmi.cc | 38 ++++++++++++++++++++++++++------------
21ef37
 1 file changed, 26 insertions(+), 12 deletions(-)
21ef37
21ef37
diff --git a/src/core/dmi.cc b/src/core/dmi.cc
21ef37
index 8242fed..d5a771d 100644
21ef37
--- a/src/core/dmi.cc
21ef37
+++ b/src/core/dmi.cc
21ef37
@@ -1392,39 +1392,52 @@ int dmiversionmin)
21ef37
       case 16:
21ef37
 // Physical Memory Array
21ef37
         {
21ef37
-          hwNode newnode("memory",
21ef37
-            hw::memory);
21ef37
-          string id = "";
21ef37
+          string id = "memory";
21ef37
           string description = "";
21ef37
+          bool claim = false, memory_icon = false;
21ef37
           switch (data[5])
21ef37
           {
21ef37
             case 0x03:
21ef37
               description = _("System Memory");
21ef37
-              newnode.claim();
21ef37
-              newnode.addHint("icon", string("memory"));
21ef37
+              claim = true;
21ef37
+              memory_icon = true;
21ef37
               break;
21ef37
             case 0x04:
21ef37
+              id = "videomemory";
21ef37
               description = _("Video Memory");
21ef37
               break;
21ef37
             case 0x05:
21ef37
+              id = "flash";
21ef37
               description = _("Flash Memory");
21ef37
               break;
21ef37
             case 0x06:
21ef37
+              id = "nvram";
21ef37
               description = _("NVRAM");
21ef37
               break;
21ef37
             case 0x07:
21ef37
+              id = "cache";
21ef37
               description = _("Cache Memory");
21ef37
-              newnode.addHint("icon", string("memory"));
21ef37
+              memory_icon = true;
21ef37
               break;
21ef37
             default:
21ef37
               description = _("Generic Memory");
21ef37
-              newnode.addHint("icon", string("memory"));
21ef37
+              memory_icon = true;
21ef37
           }
21ef37
-
21ef37
+          if (id == "memory" && hardwarenode->getChild("memory"))
21ef37
+          {
21ef37
+            // we don't want multiple "System memory" nodes,
21ef37
+            // so just ignore this one
21ef37
+            break;
21ef37
+          }
21ef37
+          hwNode newnode(id, hw::memory);
21ef37
           newnode.setHandle(handle);
21ef37
           newnode.setPhysId(dm->handle);
21ef37
           newnode.setDescription(description);
21ef37
           newnode.setSlot(dmi_memory_array_location(data[4]));
21ef37
+          if (memory_icon)
21ef37
+            newnode.addHint("icon", string("memory"));
21ef37
+          if (claim)
21ef37
+            newnode.claim();
21ef37
           switch (data[6])
21ef37
           {
21ef37
             case 0x04:
21ef37
@@ -1552,16 +1565,17 @@ int dmiversionmin)
21ef37
             newnode.setDescription(newnode.getDescription() + " " + _("[empty]"));
21ef37
           newnode.setClock(clock);
21ef37
           hwNode *memoryarray = hardwarenode->findChildByHandle(arrayhandle);
21ef37
-          if (memoryarray)
21ef37
-            memoryarray->addChild(newnode);
21ef37
-          else
21ef37
+          if (!memoryarray)
21ef37
+            memoryarray = hardwarenode->getChild("memory");
21ef37
+          if (!memoryarray)
21ef37
           {
21ef37
             hwNode ramnode("memory",
21ef37
               hw::memory);
21ef37
-            ramnode.addChild(newnode);
21ef37
             ramnode.addHint("icon", string("memory"));
21ef37
             hardwarenode->addChild(ramnode);
21ef37
+            memoryarray = hardwarenode->getChild("memory");
21ef37
           }
21ef37
+          memoryarray->addChild(newnode);
21ef37
         }
21ef37
         break;
21ef37
       case 18:
21ef37
-- 
21ef37
2.10.2
21ef37