Change in vdsm[master]: caps: refactor cpuinfo parsing

mpolednik at redhat.com mpolednik at redhat.com
Thu Jan 7 15:33:22 UTC 2016


Martin Polednik has uploaded a new change for review.

Change subject: caps: refactor cpuinfo parsing
......................................................................

caps: refactor cpuinfo parsing

The cpuinfo file parsing gathers information such as CPU model name,
frequency and supported flags.

Current code parses whole file, keeping all the CPU information. This
is not effective as the values are duplicates - therefore allowing us
to parse only the essential information and discard the rest.

Change-Id: Ib705bba4789bd1938bf26ae387af72b079020ce7
Signed-off-by: Martin Polednik <mpolednik at redhat.com>
---
M vdsm/caps.py
1 file changed, 32 insertions(+), 28 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/23/51523/1

diff --git a/vdsm/caps.py b/vdsm/caps.py
index 98cd543..998f283 100644
--- a/vdsm/caps.py
+++ b/vdsm/caps.py
@@ -29,6 +29,7 @@
 import glob
 import re
 import xml.etree.ElementTree as ET
+from collections import namedtuple
 from distutils.version import LooseVersion
 
 import libvirt
@@ -91,45 +92,48 @@
 class CpuInfo(object):
     def __init__(self, cpuinfo='/proc/cpuinfo'):
         """Parse /proc/cpuinfo"""
-        self._info = {}
-        p = {}
-        self._arch = platform.machine()
+        self.arch = cpuarch.real()
+        self.required_fields_for_platform = {
+            cpuarch.X86_64: ('flags', 'cpu MHz', 'model name'),
+            cpuarch.PPC64: ('flags', 'clock', 'cpu'),
+            cpuarch.PPC64LE: ('flags', 'clock', 'cpu')}
+        self.parsed_fields = {field: None for field in
+                              self.required_fields_for_platform[self.arch]}
+
+        if cpuarch.is_ppc(self.arch):
+            self.parsed_fields['flags'] = ['powernv']
 
         with open(cpuinfo) as info:
             for line in info:
-                if line.strip() == '':
-                    p = {}
+                if not line.strip():
                     continue
+
                 key, value = map(str.strip, line.split(':', 1))
-                if key == 'processor':
-                    self._info[value] = p
-                else:
-                    p[key] = value
+
+                try:
+                    index = self.required_fields_for_platform[
+                        self.arch].index(key)
+                except ValueError:
+                    continue
+
+                self.parsed_fields[self.required_fields_for_platform[
+                    self.arch][index]] = value
+
+                if (len(filter(None, self.parsed_fields.values())) ==
+                    len(self.required_fields_for_platform[self.arch])):
+                    break
 
     def flags(self):
-        if cpuarch.is_x86(self._arch):
-            return self._info.itervalues().next()['flags'].split()
-        elif cpuarch.is_ppc(self._arch):
-            return ['powernv']
-        else:
-            raise RuntimeError('Unsupported architecture')
+        return self.parsed_fields[
+            self.required_fields_for_platform[self.arch][0]].split()
 
     def mhz(self):
-        if cpuarch.is_x86(self._arch):
-            return self._info.itervalues().next()['cpu MHz']
-        elif cpuarch.is_ppc(self._arch):
-            clock = self._info.itervalues().next()['clock']
-            return clock[:-3]
-        else:
-            raise RuntimeError('Unsupported architecture')
+        return self.parsed_fields[
+            self.required_fields_for_platform[self.arch][1]]
 
     def model(self):
-        if cpuarch.is_x86(self._arch):
-            return self._info.itervalues().next()['model name']
-        elif cpuarch.is_ppc(self._arch):
-            return self._info.itervalues().next()['cpu']
-        else:
-            raise RuntimeError('Unsupported architecture')
+        return self.parsed_fields[
+            self.required_fields_for_platform[self.arch][2]]
 
 
 class CpuTopology(object):


-- 
To view, visit https://gerrit.ovirt.org/51523
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib705bba4789bd1938bf26ae387af72b079020ce7
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Martin Polednik <mpolednik at redhat.com>


More information about the vdsm-patches mailing list