mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-24 06:35:24 +00:00
vircgroup: extract virCgroupV1GetMemoryStat
Reviewed-by: Fabiano Fidêncio <fidencio@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
This commit is contained in:
parent
53f43deb0d
commit
64bfbd7ceb
@ -1615,69 +1615,10 @@ virCgroupGetMemoryStat(virCgroupPtr group,
|
|||||||
unsigned long long *inactiveFile,
|
unsigned long long *inactiveFile,
|
||||||
unsigned long long *unevictable)
|
unsigned long long *unevictable)
|
||||||
{
|
{
|
||||||
int ret = -1;
|
VIR_CGROUP_BACKEND_CALL(group, getMemoryStat, -1, cache,
|
||||||
char *stat = NULL;
|
activeAnon, inactiveAnon,
|
||||||
char *line = NULL;
|
activeFile, inactiveFile,
|
||||||
unsigned long long cacheVal = 0;
|
unevictable);
|
||||||
unsigned long long activeAnonVal = 0;
|
|
||||||
unsigned long long inactiveAnonVal = 0;
|
|
||||||
unsigned long long activeFileVal = 0;
|
|
||||||
unsigned long long inactiveFileVal = 0;
|
|
||||||
unsigned long long unevictableVal = 0;
|
|
||||||
|
|
||||||
if (virCgroupGetValueStr(group,
|
|
||||||
VIR_CGROUP_CONTROLLER_MEMORY,
|
|
||||||
"memory.stat",
|
|
||||||
&stat) < 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
line = stat;
|
|
||||||
|
|
||||||
while (line) {
|
|
||||||
char *newLine = strchr(line, '\n');
|
|
||||||
char *valueStr = strchr(line, ' ');
|
|
||||||
unsigned long long value;
|
|
||||||
|
|
||||||
if (newLine)
|
|
||||||
*newLine = '\0';
|
|
||||||
|
|
||||||
if (!valueStr) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
||||||
_("Cannot parse 'memory.stat' cgroup file."));
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
*valueStr = '\0';
|
|
||||||
|
|
||||||
if (virStrToLong_ull(valueStr + 1, NULL, 10, &value) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (STREQ(line, "cache"))
|
|
||||||
cacheVal = value >> 10;
|
|
||||||
else if (STREQ(line, "active_anon"))
|
|
||||||
activeAnonVal = value >> 10;
|
|
||||||
else if (STREQ(line, "inactive_anon"))
|
|
||||||
inactiveAnonVal = value >> 10;
|
|
||||||
else if (STREQ(line, "active_file"))
|
|
||||||
activeFileVal = value >> 10;
|
|
||||||
else if (STREQ(line, "inactive_file"))
|
|
||||||
inactiveFileVal = value >> 10;
|
|
||||||
else if (STREQ(line, "unevictable"))
|
|
||||||
unevictableVal = value >> 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
*cache = cacheVal;
|
|
||||||
*activeAnon = activeAnonVal;
|
|
||||||
*inactiveAnon = inactiveAnonVal;
|
|
||||||
*activeFile = activeFileVal;
|
|
||||||
*inactiveFile = inactiveFileVal;
|
|
||||||
*unevictable = unevictableVal;
|
|
||||||
|
|
||||||
ret = 0;
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
VIR_FREE(stat);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -214,6 +214,15 @@ typedef int
|
|||||||
(*virCgroupSetMemoryCB)(virCgroupPtr group,
|
(*virCgroupSetMemoryCB)(virCgroupPtr group,
|
||||||
unsigned long long kb);
|
unsigned long long kb);
|
||||||
|
|
||||||
|
typedef int
|
||||||
|
(*virCgroupGetMemoryStatCB)(virCgroupPtr group,
|
||||||
|
unsigned long long *cache,
|
||||||
|
unsigned long long *activeAnon,
|
||||||
|
unsigned long long *inactiveAnon,
|
||||||
|
unsigned long long *activeFile,
|
||||||
|
unsigned long long *inactiveFile,
|
||||||
|
unsigned long long *unevictable);
|
||||||
|
|
||||||
struct _virCgroupBackend {
|
struct _virCgroupBackend {
|
||||||
virCgroupBackendType type;
|
virCgroupBackendType type;
|
||||||
|
|
||||||
@ -254,6 +263,7 @@ struct _virCgroupBackend {
|
|||||||
virCgroupGetBlkioDeviceWriteBpsCB getBlkioDeviceWriteBps;
|
virCgroupGetBlkioDeviceWriteBpsCB getBlkioDeviceWriteBps;
|
||||||
|
|
||||||
virCgroupSetMemoryCB setMemory;
|
virCgroupSetMemoryCB setMemory;
|
||||||
|
virCgroupGetMemoryStatCB getMemoryStat;
|
||||||
};
|
};
|
||||||
typedef struct _virCgroupBackend virCgroupBackend;
|
typedef struct _virCgroupBackend virCgroupBackend;
|
||||||
typedef virCgroupBackend *virCgroupBackendPtr;
|
typedef virCgroupBackend *virCgroupBackendPtr;
|
||||||
|
@ -1403,6 +1403,81 @@ virCgroupV1SetMemory(virCgroupPtr group,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
virCgroupV1GetMemoryStat(virCgroupPtr group,
|
||||||
|
unsigned long long *cache,
|
||||||
|
unsigned long long *activeAnon,
|
||||||
|
unsigned long long *inactiveAnon,
|
||||||
|
unsigned long long *activeFile,
|
||||||
|
unsigned long long *inactiveFile,
|
||||||
|
unsigned long long *unevictable)
|
||||||
|
{
|
||||||
|
int ret = -1;
|
||||||
|
char *stat = NULL;
|
||||||
|
char *line = NULL;
|
||||||
|
unsigned long long cacheVal = 0;
|
||||||
|
unsigned long long activeAnonVal = 0;
|
||||||
|
unsigned long long inactiveAnonVal = 0;
|
||||||
|
unsigned long long activeFileVal = 0;
|
||||||
|
unsigned long long inactiveFileVal = 0;
|
||||||
|
unsigned long long unevictableVal = 0;
|
||||||
|
|
||||||
|
if (virCgroupGetValueStr(group,
|
||||||
|
VIR_CGROUP_CONTROLLER_MEMORY,
|
||||||
|
"memory.stat",
|
||||||
|
&stat) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
line = stat;
|
||||||
|
|
||||||
|
while (line) {
|
||||||
|
char *newLine = strchr(line, '\n');
|
||||||
|
char *valueStr = strchr(line, ' ');
|
||||||
|
unsigned long long value;
|
||||||
|
|
||||||
|
if (newLine)
|
||||||
|
*newLine = '\0';
|
||||||
|
|
||||||
|
if (!valueStr) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("Cannot parse 'memory.stat' cgroup file."));
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
*valueStr = '\0';
|
||||||
|
|
||||||
|
if (virStrToLong_ull(valueStr + 1, NULL, 10, &value) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (STREQ(line, "cache"))
|
||||||
|
cacheVal = value >> 10;
|
||||||
|
else if (STREQ(line, "active_anon"))
|
||||||
|
activeAnonVal = value >> 10;
|
||||||
|
else if (STREQ(line, "inactive_anon"))
|
||||||
|
inactiveAnonVal = value >> 10;
|
||||||
|
else if (STREQ(line, "active_file"))
|
||||||
|
activeFileVal = value >> 10;
|
||||||
|
else if (STREQ(line, "inactive_file"))
|
||||||
|
inactiveFileVal = value >> 10;
|
||||||
|
else if (STREQ(line, "unevictable"))
|
||||||
|
unevictableVal = value >> 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
*cache = cacheVal;
|
||||||
|
*activeAnon = activeAnonVal;
|
||||||
|
*inactiveAnon = inactiveAnonVal;
|
||||||
|
*activeFile = activeFileVal;
|
||||||
|
*inactiveFile = inactiveFileVal;
|
||||||
|
*unevictable = unevictableVal;
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
VIR_FREE(stat);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
virCgroupBackend virCgroupV1Backend = {
|
virCgroupBackend virCgroupV1Backend = {
|
||||||
.type = VIR_CGROUP_BACKEND_TYPE_V1,
|
.type = VIR_CGROUP_BACKEND_TYPE_V1,
|
||||||
|
|
||||||
@ -1441,6 +1516,7 @@ virCgroupBackend virCgroupV1Backend = {
|
|||||||
.getBlkioDeviceWriteBps = virCgroupV1GetBlkioDeviceWriteBps,
|
.getBlkioDeviceWriteBps = virCgroupV1GetBlkioDeviceWriteBps,
|
||||||
|
|
||||||
.setMemory = virCgroupV1SetMemory,
|
.setMemory = virCgroupV1SetMemory,
|
||||||
|
.getMemoryStat = virCgroupV1GetMemoryStat,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user