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@xxxxxxxxxx> --- 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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list