You need to sign in or sign up before continuing.
提交 7c4b4f89 编写于 作者: M Martin Kletzander

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: NMartin Kletzander <mkletzan@redhat.com>
上级 af427040
...@@ -1647,15 +1647,17 @@ virCapabilitiesInitCaches(virCapsPtr caps) ...@@ -1647,15 +1647,17 @@ virCapabilitiesInitCaches(virCapsPtr caps)
goto cleanup; goto cleanup;
typeret = virResctrlGetCacheControlType(bank->level); typeret = virResctrlGetCacheControlType(bank->level);
if (typeret < 0)
goto cleanup;
if (typeret == 0) { if (typeret == 1) {
if (virResctrlGetCacheInfo(bank->level, if (virResctrlGetCacheInfo(bank->level,
bank->size, bank->size,
VIR_CACHE_TYPE_BOTH, VIR_CACHE_TYPE_BOTH,
&bank->controls, &bank->controls,
&bank->ncontrols) < 0) &bank->ncontrols) < 0)
goto cleanup; goto cleanup;
} else if (typeret == 1) { } else if (typeret == 2) {
if (virResctrlGetCacheInfo(bank->level, if (virResctrlGetCacheInfo(bank->level,
bank->size, bank->size,
VIR_CACHE_TYPE_CODE, VIR_CACHE_TYPE_CODE,
......
...@@ -45,6 +45,16 @@ VIR_ENUM_IMPL(virCache, VIR_CACHE_TYPE_LAST, ...@@ -45,6 +45,16 @@ VIR_ENUM_IMPL(virCache, VIR_CACHE_TYPE_LAST,
"code", "code",
"data") "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 int
virResctrlGetCacheInfo(unsigned int level, virResctrlGetCacheInfo(unsigned int level,
unsigned long long size, unsigned long long size,
...@@ -114,40 +124,64 @@ virResctrlGetCacheInfo(unsigned int level, ...@@ -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 * This function tests which TYPE of cache control is supported
* Return values are: * Return values are:
* -1: not supported * -1: error
* 0: CAT * 0: none
* 1: CDP * 1: CAT
* 2: CDP
*/ */
int int
virResctrlGetCacheControlType(unsigned int level) virResctrlGetCacheControlType(unsigned int level)
{ {
int ret = -1; int rv = -1;
char *path = NULL;
if (virAsprintf(&path, rv = virResctrlGetCacheSupport(level, VIR_CACHE_TYPE_BOTH);
SYSFS_RESCTRL_PATH "/info/L%u", if (rv < 0)
level) < 0)
return -1; return -1;
if (rv)
return 1;
if (virFileExists(path)) { rv = virResctrlGetCacheSupport(level, VIR_CACHE_TYPE_CODE);
ret = 0; if (rv < 0)
} else { return -1;
VIR_FREE(path); if (rv)
/* return 2;
* 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;
}
VIR_FREE(path); return 0;
return ret;
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册