[libvirt] [PATCH 30/53] vircgroup: introduce virCgroupV2GetMemoryStat

Michal Privoznik mprivozn at redhat.com
Fri Oct 5 09:10:02 UTC 2018


On 10/02/2018 10:44 AM, Pavel Hrdina wrote:
> Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
> ---
>  src/util/vircgroupv2.c | 75 ++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 75 insertions(+)
> 
> diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c
> index 32d20f2ff6..da3b3a984c 100644
> --- a/src/util/vircgroupv2.c
> +++ b/src/util/vircgroupv2.c
> @@ -1044,6 +1044,80 @@ virCgroupV2SetMemory(virCgroupPtr group,
>  }
>  
>  
> +static int
> +virCgroupV2GetMemoryStat(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)
> +{
> +    VIR_AUTOFREE(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."));
> +            return -1;
> +        }
> +        *valueStr = '\0';
> +
> +        if (virStrToLong_ull(valueStr + 1, NULL, 10, &value) < 0) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR,
> +                           _("Unable to parse '%s' as an integer"),
> +                           valueStr + 1);
> +            return -1;
> +        }
> +
> +        if (STREQ(line, "file"))
> +            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;

Funny, in 22/53 you've created an array so that you don't need to do
this. I couldn't care less TBH.

> +    }
> +
> +    *cache = cacheVal;
> +    *activeAnon = activeAnonVal;
> +    *inactiveAnon = inactiveAnonVal;
> +    *activeFile = activeFileVal;
> +    *inactiveFile = inactiveFileVal;
> +    *unevictable = unevictableVal;
> +
> +    return 0;
> +}
> +
> +
>  virCgroupBackend virCgroupV2Backend = {
>      .type = VIR_CGROUP_BACKEND_TYPE_V2,
>  
> @@ -1082,6 +1156,7 @@ virCgroupBackend virCgroupV2Backend = {
>      .getBlkioDeviceWriteBps = virCgroupV2GetBlkioDeviceWriteBps,
>  
>      .setMemory = virCgroupV2SetMemory,
> +    .getMemoryStat = virCgroupV2GetMemoryStat,
>  };
>  
>  
> 


ACK

Michal




More information about the libvir-list mailing list