[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdelibs/solid/solid
From:       Alex Merry <kde () randomguy3 ! me ! uk>
Date:       2010-11-26 17:45:11
Message-ID: 20101126174511.4083CAC8A2 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1201079 by alexmerry:

Report correct information for processors in Solid udev backend.

Review request: 5892



 M  +1 -0      CMakeLists.txt  
 M  +1 -0      backends/shared/udevqt.h  
 M  +13 -0     backends/shared/udevqtdevice.cpp  
 A             backends/udev/cpuinfo.cpp   [License: LGPL]
 A             backends/udev/cpuinfo.h   [License: LGPL]
 M  +18 -2     backends/udev/udevdevice.cpp  
 M  +1 -0      backends/udev/udevdevice.h  
 M  +8 -2      backends/udev/udevmanager.cpp  
 M  +39 -18    backends/udev/udevprocessor.cpp  
 M  +9 -0      backends/udev/udevprocessor.h  


--- trunk/KDE/kdelibs/solid/solid/CMakeLists.txt #1201078:1201079
@@ -176,6 +176,7 @@
       backends/udev/udevmanager.cpp
       backends/udev/udevdeviceinterface.cpp
       backends/udev/udevgenericinterface.cpp
+      backends/udev/cpuinfo.cpp
       backends/udev/udevprocessor.cpp
       backends/udev/udevcamera.cpp
       backends/udev/udevportablemediaplayer.cpp
--- trunk/KDE/kdelibs/solid/solid/backends/shared/udevqt.h #1201078:1201079
@@ -44,6 +44,7 @@
         QString devType() const;
         QString name() const;
         QString sysfsPath() const;
+        int sysfsNumber() const;
         QString driver() const;
         QString primaryDeviceFile() const;
         QStringList alternateDeviceSymlinks() const;
--- trunk/KDE/kdelibs/solid/solid/backends/shared/udevqtdevice.cpp #1201078:1201079
@@ -152,6 +152,19 @@
     return QString::fromLatin1(udev_device_get_syspath(d->udev));
 }
 
+int Device::sysfsNumber() const
+{
+    if (!d)
+        return -1;
+
+    QString value = QString::fromLatin1(udev_device_get_sysnum(d->udev));
+    bool success = false;
+    int number = value.toInt(&success);
+    if (success)
+        return number;
+    return -1;
+}
+
 QString Device::driver() const
 {
     if (!d)
--- trunk/KDE/kdelibs/solid/solid/backends/udev/udevdevice.cpp #1201078:1201079
@@ -24,6 +24,7 @@
 #include "udevprocessor.h"
 #include "udevcamera.h"
 #include "udevportablemediaplayer.h"
+#include "cpuinfo.h"
 
 using namespace Solid::Backends::UDev;
 
@@ -49,13 +50,23 @@
 
 QString UDevDevice::vendor() const
 {
-    return m_device.sysfsProperty("manufacturer").toString();
+    QString vendor = m_device.sysfsProperty("manufacturer").toString();
+    if (vendor.isEmpty() && queryDeviceInterface(Solid::DeviceInterface::Processor)) {
+        // sysfs doesn't have anything useful here
+        vendor = extractCpuInfoLine(deviceNumber(), "vendor_id\\s+:\\s+(\\S.+)");
 }
+    return vendor;
+}
 
 QString UDevDevice::product() const
 {
-    return m_device.sysfsProperty("product").toString();
+    QString product = m_device.sysfsProperty("product").toString();
+    if (product.isEmpty() && queryDeviceInterface(Solid::DeviceInterface::Processor)) {
+        // sysfs doesn't have anything useful here
+        product = extractCpuInfoLine(deviceNumber(), "model name\\s+:\\s+(\\S.+)");
 }
+    return product;
+}
 
 QString UDevDevice::icon() const
 {
@@ -181,6 +192,11 @@
     return m_device.sysfsPath();
 }
 
+int UDevDevice::deviceNumber() const
+{
+    return m_device.sysfsNumber();
+}
+
 QString UDevDevice::devicePath() const
 {
     return QString(UDEV_UDI_PREFIX) + deviceName();
--- trunk/KDE/kdelibs/solid/solid/backends/udev/udevdevice.h #1201078:1201079
@@ -68,6 +68,7 @@
     QString systemAttribute(const char *attribute) const;
     QString deviceName() const;
     QString devicePath() const;
+    int deviceNumber() const;
 
 private:
     UdevQt::Device m_device;
--- trunk/KDE/kdelibs/solid/solid/backends/udev/udevmanager.cpp #1201078:1201079
@@ -25,6 +25,7 @@
 #include "../shared/rootdevice.h"
 
 #include <QtCore/QSet>
+#include <QtCore/QFile>
 
 using namespace Solid::Backends::UDev;
 using namespace Solid::Backends::Shared;
@@ -53,9 +54,14 @@
 
 bool UDevManager::Private::isOfInterest(const UdevQt::Device &device)
 {
-    return device.driver() == "processor" ||
-           device.driver() == "video";
+    if (device.driver() == "processor") {
+        // Linux ACPI reports processor slots, rather than processors.
+        // Empty slots will not have a system device associated with them.
+        return QFile::exists(device.sysfsPath() + "/sysdev");
+    } else {
+        return device.driver() == "video";
 }
+}
 
 UDevManager::UDevManager(QObject *parent)
     : Solid::Ifaces::DeviceManager(parent),
--- trunk/KDE/kdelibs/solid/solid/backends/udev/udevprocessor.cpp #1201078:1201079
@@ -21,6 +21,7 @@
 #include "udevprocessor.h"
 
 #include "udevdevice.h"
+#include "cpuinfo.h"
 #include "../shared/cpufeatures.h"
 
 #include <QtCore/QFile>
@@ -28,7 +29,9 @@
 using namespace Solid::Backends::UDev;
 
 Processor::Processor(UDevDevice *device)
-    : DeviceInterface(device)
+    : DeviceInterface(device),
+      m_canChangeFrequency(NotChecked),
+      m_maxSpeed(-1)
 {
 
 }
@@ -40,32 +43,50 @@
 
 int Processor::number() const
 {
-    QRegExp regExp(":(\\d+)$");
-    if (regExp.indexIn(m_device->udi()) != -1) {
-        return regExp.cap(1).toInt();
+    // There's a subtle assumption here: suppose the system's ACPI
+    // supports more processors/cores than are installed, and so udev reports
+    // 4 cores when there are 2, say.  Will the processor numbers (in
+    // /proc/cpuinfo, in particular) always match the sysfs device numbers?
+    return m_device->deviceNumber();
     }
-    return -1;
-}
 
 int Processor::maxSpeed() const
 {
-    QFile m_cpuInfo("/proc/cpuinfo");
-    m_cpuInfo.open(QIODevice::ReadOnly);
-    QString cpuInfo = m_cpuInfo.readAll();
-    m_cpuInfo.close();
+    if (m_maxSpeed == -1) {
+        QFile cpuMaxFreqFile(m_device->deviceName() + "/sysdev/cpufreq/cpuinfo_max_freq");
+        if (cpuMaxFreqFile.open(QIODevice::ReadOnly)) {
+            QString value = cpuMaxFreqFile.readAll().trimmed();
+            // cpuinfo_max_freq is in kHz
+            m_maxSpeed = static_cast<int>(value.toLongLong() / 1000);
+        }
+        if (m_maxSpeed <= 0) {
+            // couldn't get the info from /sys, try /proc instead
+            m_maxSpeed = extractCpuInfoLine(number(), "cpu MHz\\s+:\\s+(\\d+).*").toInt();
+        }
+    }
+    return m_maxSpeed;
+}
 
-    const QRegExp regExp("cpu MHz\\s+:\\s+(\\d+)");
-    regExp.indexIn(cpuInfo);
+bool Processor::canChangeFrequency() const
+{
+    if (m_canChangeFrequency == NotChecked) {
+        /* Note that cpufreq is the right information source here, rather than
+         * anything to do with throttling (ACPI T-states).  */
 
-    // TODO: really get information for each processor.
+        m_canChangeFrequency = CannotChangeFreq;
 
-    return regExp.capturedTexts()[1].toInt();
+        QFile cpuMinFreqFile(m_device->deviceName() + "/sysdev/cpufreq/cpuinfo_min_freq");
+        QFile cpuMaxFreqFile(m_device->deviceName() + "/sysdev/cpufreq/cpuinfo_max_freq");
+        if (cpuMinFreqFile.open(QIODevice::ReadOnly) && cpuMaxFreqFile.open(QIODevice::ReadOnly)) {
+            QString minFreq = cpuMinFreqFile.readAll().trimmed();
+            QString maxFreq = cpuMaxFreqFile.readAll().trimmed();
+            if (minFreq > 0 && maxFreq > minFreq) {
+                m_canChangeFrequency = CanChangeFreq;
 }
+        }
+    }
 
-bool Processor::canChangeFrequency() const
-{
-    // TODO: source ?
-    return false;
+    return m_canChangeFrequency == CanChangeFreq;
 }
 
 Solid::Processor::InstructionSets Processor::instructionSets() const
--- trunk/KDE/kdelibs/solid/solid/backends/udev/udevprocessor.h #1201078:1201079
@@ -45,7 +45,16 @@
     virtual int maxSpeed() const;
     virtual bool canChangeFrequency() const;
     virtual Solid::Processor::InstructionSets instructionSets() const;
+
+private:
+    enum CanChangeFrequencyEnum {
+        NotChecked,
+        CanChangeFreq,
+        CannotChangeFreq
 };
+    mutable CanChangeFrequencyEnum m_canChangeFrequency;
+    mutable int m_maxSpeed;
+};
 }
 }
 }
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic