util: Make virResctrlGetCacheControlType() behave like other functions

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@redhat.com>
This commit is contained in:
Martin Kletzander 2017-08-02 13:33:04 +02:00
parent af4270400a
commit 7c4b4f8905
2 changed files with 64 additions and 28 deletions

View File

@ -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,

View File

@ -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 which TYPE of cache control is supported
* Return values are:
* -1: not supported
* 0: CAT
* 1: CDP
* This function tests whether TYPE of cache control is supported or not.
*
* Returns 0 if not, 1 if yes and negative value on error.
*/
int
virResctrlGetCacheControlType(unsigned int level)
static int
virResctrlGetCacheSupport(unsigned int level, virCacheType type)
{
int ret = -1;
char *path = NULL;
if (virAsprintf(&path,
SYSFS_RESCTRL_PATH "/info/L%u",
level) < 0)
if (virResctrlGetCacheDir(&path, "/info", level, type) < 0)
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;
}
ret = virFileExists(path);
VIR_FREE(path);
return ret;
}
/*
* This function tests which TYPE of cache control is supported
* Return values are:
* -1: error
* 0: none
* 1: CAT
* 2: CDP
*/
int
virResctrlGetCacheControlType(unsigned int level)
{
int rv = -1;
rv = virResctrlGetCacheSupport(level, VIR_CACHE_TYPE_BOTH);
if (rv < 0)
return -1;
if (rv)
return 1;
rv = virResctrlGetCacheSupport(level, VIR_CACHE_TYPE_CODE);
if (rv < 0)
return -1;
if (rv)
return 2;
return 0;
}