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(a)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