[libvirt] [PATCH] * src/nodeinfo.c: Read nodeinfo->mhz from cpufreq device file, if detected.

Thomas Treutner thomas at scripty.at
Tue Feb 2 17:15:51 UTC 2010


---
 src/nodeinfo.c |   36 ++++++++++++++++++++++++++++++++++++
 1 files changed, 36 insertions(+), 0 deletions(-)

diff --git a/src/nodeinfo.c b/src/nodeinfo.c
index 7d26b2b..15877ed 100644
--- a/src/nodeinfo.c
+++ b/src/nodeinfo.c
@@ -55,11 +55,14 @@
 
 #ifdef __linux__
 #define CPUINFO_PATH "/proc/cpuinfo"
+#define SCALINGMAXFREQ_PATH "/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq"
 
 /* NB, these are not static as we need to call them from testsuite */
 int linuxNodeInfoCPUPopulate(virConnectPtr conn, FILE *cpuinfo,
                              virNodeInfoPtr nodeinfo);
 
+int linuxNodeInfoConsiderCPUScaling(FILE *scalingmaxfreq, virNodeInfoPtr nodeinfo);
+
 int linuxNodeInfoCPUPopulate(virConnectPtr conn, FILE *cpuinfo, virNodeInfoPtr nodeinfo) {
     char line[1024];
 
@@ -132,6 +135,27 @@ int linuxNodeInfoCPUPopulate(virConnectPtr conn, FILE *cpuinfo, virNodeInfoPtr n
     return 0;
 }
 
+int linuxNodeInfoConsiderCPUScaling(FILE *scalingmaxfreq, virNodeInfoPtr nodeinfo) {
+    char line[1024];
+
+    while (fgets(line, sizeof(line), scalingmaxfreq) != NULL) {
+        char *buf = line;
+        char *p;
+        unsigned int khz;
+
+        if (virStrToLong_ui(buf, &p, 10, &khz) == 0)
+        {
+            if(khz/1000 > nodeinfo->mhz)
+            {
+                nodeinfo->mhz = khz/1000;
+                return 0;
+            }
+        }
+    }
+    return 1;
+}
+
+
 #endif
 
 int nodeGetInfo(virConnectPtr conn,
@@ -164,6 +188,18 @@ int nodeGetInfo(virConnectPtr conn,
     if (ret < 0)
         return -1;
 
+    FILE *scalingmaxfreq = fopen(SCALINGMAXFREQ_PATH, "r");
+    if (scalingmaxfreq != NULL) {
+        // TODO: some logging information that cpufreq was detected?
+        ret = linuxNodeInfoConsiderCPUScaling(scalingmaxfreq, nodeinfo);
+        if(ret == 0) {
+            // TODO: logging: nodeinfo->mhz was updated
+        } else if(ret == 1) {
+            // TODO: logging: cpufreq was detected, but information available didn't make sense
+        }
+        fclose(scalingmaxfreq);
+    }
+    
     /* Convert to KB. */
     nodeinfo->memory = physmem_total () / 1024;
 
-- 
1.5.4.3




More information about the libvir-list mailing list