[libvirt] [PATCH 4/5] util: Make virResctrlGetCacheControlType() behave like other functions

Martin Kletzander mkletzan at redhat.com
Thu Aug 10 13:31:48 UTC 2017


That means that returning negative values means error and non-negative
values differ in meaning, but are all successful.

Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
---
 src/conf/capabilities.c |  6 ++--
 src/util/virresctrl.c   | 84 ++++++++++++++++++++++++++++++++++---------------
 2 files changed, 63 insertions(+), 27 deletions(-)

diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c
index 18849adfcaec..69af3911a083 100644
--- a/src/conf/capabilities.c
+++ b/src/conf/capabilities.c
@@ -1647,15 +1647,17 @@ virCapabilitiesInitCaches(virCapsPtr caps)
                 goto cleanup;
 
             typeret = virResctrlGetCacheControlType(bank->level);
+            if (typeret < 0)
+                goto cleanup;
 
-            if (typeret == 0) {
+            if (typeret == 1) {
                 if (virResctrlGetCacheInfo(bank->level,
                                            bank->size,
                                            VIR_CACHE_TYPE_BOTH,
                                            &bank->controls,
                                            &bank->ncontrols) < 0)
                     goto cleanup;
-            } else if (typeret == 1) {
+            } else if (typeret == 2) {
                 if (virResctrlGetCacheInfo(bank->level,
                                            bank->size,
                                            VIR_CACHE_TYPE_CODE,
diff --git a/src/util/virresctrl.c b/src/util/virresctrl.c
index dfc062c2a0f8..ec1ad7b6edad 100644
--- a/src/util/virresctrl.c
+++ b/src/util/virresctrl.c
@@ -45,6 +45,16 @@ VIR_ENUM_IMPL(virCache, VIR_CACHE_TYPE_LAST,
               "code",
               "data")
 
+/*
+ * This is the same enum, but for the resctrl naming
+ * of the type (L<level><type>)
+ */
+VIR_ENUM_DECL(virResctrl)
+VIR_ENUM_IMPL(virResctrl, VIR_CACHE_TYPE_LAST,
+              "",
+              "CODE",
+              "DATA")
+
 int
 virResctrlGetCacheInfo(unsigned int level,
                        unsigned long long size,
@@ -114,40 +124,64 @@ virResctrlGetCacheInfo(unsigned int level,
 }
 
 
+static inline int
+virResctrlGetCacheDir(char **path,
+                      const char *prefix,
+                      unsigned int level,
+                      virCacheType type)
+{
+    return virAsprintf(path,
+                       SYSFS_RESCTRL_PATH "%s/L%u%s",
+                       prefix ? prefix : "",
+                       level,
+                       virResctrlTypeToString(type));
+}
+
+
+/*
+ * This function tests whether TYPE of cache control is supported or not.
+ *
+ * Returns 0 if not, 1 if yes and negative value on error.
+ */
+static int
+virResctrlGetCacheSupport(unsigned int level, virCacheType type)
+{
+    int ret = -1;
+    char *path = NULL;
+
+    if (virResctrlGetCacheDir(&path, "/info", level, type) < 0)
+        return -1;
+
+    ret = virFileExists(path);
+    VIR_FREE(path);
+    return ret;
+}
+
+
 /*
  * This function tests which TYPE of cache control is supported
  * Return values are:
- *  -1: not supported
- *   0: CAT
- *   1: CDP
+ *  -1: error
+ *   0: none
+ *   1: CAT
+ *   2: CDP
  */
 int
 virResctrlGetCacheControlType(unsigned int level)
 {
-    int ret = -1;
-    char *path = NULL;
+    int rv = -1;
 
-    if (virAsprintf(&path,
-                    SYSFS_RESCTRL_PATH "/info/L%u",
-                    level) < 0)
+    rv = virResctrlGetCacheSupport(level, VIR_CACHE_TYPE_BOTH);
+    if (rv < 0)
         return -1;
+    if (rv)
+        return 1;
 
-    if (virFileExists(path)) {
-        ret = 0;
-    } else {
-        VIR_FREE(path);
-        /*
-         * If CDP is enabled, there will be both CODE and DATA, but it's enough
-         * to check one of those only.
-         */
-        if (virAsprintf(&path,
-                        SYSFS_RESCTRL_PATH "/info/L%uCODE",
-                        level) < 0)
-            return -1;
-        if (virFileExists(path))
-            ret = 1;
-    }
+    rv = virResctrlGetCacheSupport(level, VIR_CACHE_TYPE_CODE);
+    if (rv < 0)
+        return -1;
+    if (rv)
+        return 2;
 
-    VIR_FREE(path);
-    return ret;
+    return 0;
 }
-- 
2.14.0




More information about the libvir-list mailing list