From nobody Sun Feb 8 18:43:09 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1537285651479466.8824024824196; Tue, 18 Sep 2018 08:47:31 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8D7143001974; Tue, 18 Sep 2018 15:47:28 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 566CB897F6; Tue, 18 Sep 2018 15:47:28 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id D9CA941F54; Tue, 18 Sep 2018 15:47:27 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w8IFkros012537 for ; Tue, 18 Sep 2018 11:46:53 -0400 Received: by smtp.corp.redhat.com (Postfix) id 069994F9A1; Tue, 18 Sep 2018 15:46:53 +0000 (UTC) Received: from antique-work.brq.redhat.com (unknown [10.43.2.181]) by smtp.corp.redhat.com (Postfix) with ESMTP id 49F4082AE8 for ; Tue, 18 Sep 2018 15:46:45 +0000 (UTC) From: Pavel Hrdina To: libvir-list@redhat.com Date: Tue, 18 Sep 2018 17:45:53 +0200 Message-Id: In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 32/47] vircgroup: extract virCgroupV1(Set|Get)Memory*Limit X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.40]); Tue, 18 Sep 2018 15:47:30 +0000 (UTC) X-ZohoMail: RDMRC_0 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" They all need virCgroupV1GetMemoryUnlimitedKB() so it's easier to move them in one commit. Signed-off-by: Pavel Hrdina --- src/util/vircgroup.c | 128 ++------------------------- src/util/vircgroupbackend.h | 30 +++++++ src/util/vircgrouppriv.h | 6 ++ src/util/vircgroupv1.c | 168 ++++++++++++++++++++++++++++++++++++ 4 files changed, 211 insertions(+), 121 deletions(-) diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c index 1229959300..cd6b087a69 100644 --- a/src/util/vircgroup.c +++ b/src/util/vircgroup.c @@ -636,7 +636,7 @@ virCgroupMakeGroup(virCgroupPtr parent, * * Returns 0 on success, -1 on error */ -static int +int virCgroupNew(pid_t pid, const char *path, virCgroupPtr parent, @@ -1539,51 +1539,6 @@ virCgroupGetBlkioDeviceWeight(virCgroupPtr group, } =20 =20 -/* - * Retrieve the "memory.limit_in_bytes" value from the memory controller - * root dir. This value cannot be modified by userspace and therefore - * is the maximum limit value supported by cgroups on the local system. - * Returns this value scaled to KB or falls back to the original - * VIR_DOMAIN_MEMORY_PARAM_UNLIMITED. Either way, remember the return - * value to avoid unnecessary cgroup filesystem access. - */ -static unsigned long long int virCgroupMemoryUnlimitedKB; -static virOnceControl virCgroupMemoryOnce =3D VIR_ONCE_CONTROL_INITIALIZER; - -static void -virCgroupMemoryOnceInit(void) -{ - virCgroupPtr group; - unsigned long long int mem_unlimited =3D 0ULL; - - if (virCgroupNew(-1, "/", NULL, -1, &group) < 0) - goto cleanup; - - if (!virCgroupHasController(group, VIR_CGROUP_CONTROLLER_MEMORY)) - goto cleanup; - - ignore_value(virCgroupGetValueU64(group, - VIR_CGROUP_CONTROLLER_MEMORY, - "memory.limit_in_bytes", - &mem_unlimited)); - cleanup: - virCgroupFree(&group); - virCgroupMemoryUnlimitedKB =3D mem_unlimited >> 10; -} - -static unsigned long long int -virCgroupGetMemoryUnlimitedKB(void) -{ - if (virOnce(&virCgroupMemoryOnce, virCgroupMemoryOnceInit) < 0) - VIR_DEBUG("Init failed, will fall back to defaults."); - - if (virCgroupMemoryUnlimitedKB) - return virCgroupMemoryUnlimitedKB; - else - return VIR_DOMAIN_MEMORY_PARAM_UNLIMITED; -} - - /** * virCgroupSetMemory: * @@ -1654,7 +1609,7 @@ virCgroupGetMemoryUsage(virCgroupPtr group, unsigned = long *kb) int virCgroupSetMemoryHardLimit(virCgroupPtr group, unsigned long long kb) { - return virCgroupSetMemory(group, kb); + VIR_CGROUP_BACKEND_CALL(group, setMemoryHardLimit, -1, kb); } =20 =20 @@ -1669,18 +1624,7 @@ virCgroupSetMemoryHardLimit(virCgroupPtr group, unsi= gned long long kb) int virCgroupGetMemoryHardLimit(virCgroupPtr group, unsigned long long *kb) { - long long unsigned int limit_in_bytes; - - if (virCgroupGetValueU64(group, - VIR_CGROUP_CONTROLLER_MEMORY, - "memory.limit_in_bytes", &limit_in_bytes) < 0) - return -1; - - *kb =3D limit_in_bytes >> 10; - if (*kb >=3D virCgroupGetMemoryUnlimitedKB()) - *kb =3D VIR_DOMAIN_MEMORY_PARAM_UNLIMITED; - - return 0; + VIR_CGROUP_BACKEND_CALL(group, getMemoryHardLimit, -1, kb); } =20 =20 @@ -1695,25 +1639,7 @@ virCgroupGetMemoryHardLimit(virCgroupPtr group, unsi= gned long long *kb) int virCgroupSetMemorySoftLimit(virCgroupPtr group, unsigned long long kb) { - unsigned long long maxkb =3D VIR_DOMAIN_MEMORY_PARAM_UNLIMITED; - - if (kb > maxkb) { - virReportError(VIR_ERR_INVALID_ARG, - _("Memory '%llu' must be less than %llu"), - kb, maxkb); - return -1; - } - - if (kb =3D=3D maxkb) - return virCgroupSetValueI64(group, - VIR_CGROUP_CONTROLLER_MEMORY, - "memory.soft_limit_in_bytes", - -1); - else - return virCgroupSetValueU64(group, - VIR_CGROUP_CONTROLLER_MEMORY, - "memory.soft_limit_in_bytes", - kb << 10); + VIR_CGROUP_BACKEND_CALL(group, setMemorySoftLimit, -1, kb); } =20 =20 @@ -1728,18 +1654,7 @@ virCgroupSetMemorySoftLimit(virCgroupPtr group, unsi= gned long long kb) int virCgroupGetMemorySoftLimit(virCgroupPtr group, unsigned long long *kb) { - long long unsigned int limit_in_bytes; - - if (virCgroupGetValueU64(group, - VIR_CGROUP_CONTROLLER_MEMORY, - "memory.soft_limit_in_bytes", &limit_in_bytes= ) < 0) - return -1; - - *kb =3D limit_in_bytes >> 10; - if (*kb >=3D virCgroupGetMemoryUnlimitedKB()) - *kb =3D VIR_DOMAIN_MEMORY_PARAM_UNLIMITED; - - return 0; + VIR_CGROUP_BACKEND_CALL(group, getMemorySoftLimit, -1, kb); } =20 =20 @@ -1754,25 +1669,7 @@ virCgroupGetMemorySoftLimit(virCgroupPtr group, unsi= gned long long *kb) int virCgroupSetMemSwapHardLimit(virCgroupPtr group, unsigned long long kb) { - unsigned long long maxkb =3D VIR_DOMAIN_MEMORY_PARAM_UNLIMITED; - - if (kb > maxkb) { - virReportError(VIR_ERR_INVALID_ARG, - _("Memory '%llu' must be less than %llu"), - kb, maxkb); - return -1; - } - - if (kb =3D=3D maxkb) - return virCgroupSetValueI64(group, - VIR_CGROUP_CONTROLLER_MEMORY, - "memory.memsw.limit_in_bytes", - -1); - else - return virCgroupSetValueU64(group, - VIR_CGROUP_CONTROLLER_MEMORY, - "memory.memsw.limit_in_bytes", - kb << 10); + VIR_CGROUP_BACKEND_CALL(group, setMemSwapHardLimit, -1, kb); } =20 =20 @@ -1787,18 +1684,7 @@ virCgroupSetMemSwapHardLimit(virCgroupPtr group, uns= igned long long kb) int virCgroupGetMemSwapHardLimit(virCgroupPtr group, unsigned long long *kb) { - long long unsigned int limit_in_bytes; - - if (virCgroupGetValueU64(group, - VIR_CGROUP_CONTROLLER_MEMORY, - "memory.memsw.limit_in_bytes", &limit_in_byte= s) < 0) - return -1; - - *kb =3D limit_in_bytes >> 10; - if (*kb >=3D virCgroupGetMemoryUnlimitedKB()) - *kb =3D VIR_DOMAIN_MEMORY_PARAM_UNLIMITED; - - return 0; + VIR_CGROUP_BACKEND_CALL(group, getMemSwapHardLimit, -1, kb); } =20 =20 diff --git a/src/util/vircgroupbackend.h b/src/util/vircgroupbackend.h index 672fb082c1..5e75e495c3 100644 --- a/src/util/vircgroupbackend.h +++ b/src/util/vircgroupbackend.h @@ -219,6 +219,30 @@ typedef int (*virCgroupGetMemoryUsageCB)(virCgroupPtr group, unsigned long *kb); =20 +typedef int +(*virCgroupSetMemoryHardLimitCB)(virCgroupPtr group, + unsigned long long kb); + +typedef int +(*virCgroupGetMemoryHardLimitCB)(virCgroupPtr group, + unsigned long long *kb); + +typedef int +(*virCgroupSetMemorySoftLimitCB)(virCgroupPtr group, + unsigned long long kb); + +typedef int +(*virCgroupGetMemorySoftLimitCB)(virCgroupPtr group, + unsigned long long *kb); + +typedef int +(*virCgroupSetMemSwapHardLimitCB)(virCgroupPtr group, + unsigned long long kb); + +typedef int +(*virCgroupGetMemSwapHardLimitCB)(virCgroupPtr group, + unsigned long long *kb); + struct _virCgroupBackend { virCgroupBackendType type; =20 @@ -261,6 +285,12 @@ struct _virCgroupBackend { virCgroupSetMemoryCB setMemory; virCgroupGetMemoryStatCB getMemoryStat; virCgroupGetMemoryUsageCB getMemoryUsage; + virCgroupSetMemoryHardLimitCB setMemoryHardLimit; + virCgroupGetMemoryHardLimitCB getMemoryHardLimit; + virCgroupSetMemorySoftLimitCB setMemorySoftLimit; + virCgroupGetMemorySoftLimitCB getMemorySoftLimit; + virCgroupSetMemSwapHardLimitCB setMemSwapHardLimit; + virCgroupGetMemSwapHardLimitCB getMemSwapHardLimit; }; typedef struct _virCgroupBackend virCgroupBackend; typedef virCgroupBackend *virCgroupBackendPtr; diff --git a/src/util/vircgrouppriv.h b/src/util/vircgrouppriv.h index 3a968c1ce2..7b985280e1 100644 --- a/src/util/vircgrouppriv.h +++ b/src/util/vircgrouppriv.h @@ -88,6 +88,12 @@ int virCgroupGetValueForBlkDev(virCgroupPtr group, const char *path, char **value); =20 +int virCgroupNew(pid_t pid, + const char *path, + virCgroupPtr parent, + int controllers, + virCgroupPtr *group); + int virCgroupNewPartition(const char *path, bool create, int controllers, diff --git a/src/util/vircgroupv1.c b/src/util/vircgroupv1.c index 7abb137b81..5fc046afad 100644 --- a/src/util/vircgroupv1.c +++ b/src/util/vircgroupv1.c @@ -1377,6 +1377,51 @@ virCgroupV1GetBlkioDeviceWriteBps(virCgroupPtr group, } =20 =20 +/* + * Retrieve the "memory.limit_in_bytes" value from the memory controller + * root dir. This value cannot be modified by userspace and therefore + * is the maximum limit value supported by cgroups on the local system. + * Returns this value scaled to KB or falls back to the original + * VIR_DOMAIN_MEMORY_PARAM_UNLIMITED. Either way, remember the return + * value to avoid unnecessary cgroup filesystem access. + */ +static unsigned long long int virCgroupV1MemoryUnlimitedKB; +static virOnceControl virCgroupV1MemoryOnce =3D VIR_ONCE_CONTROL_INITIALIZ= ER; + +static void +virCgroupV1MemoryOnceInit(void) +{ + virCgroupPtr group; + unsigned long long int mem_unlimited =3D 0ULL; + + if (virCgroupNew(-1, "/", NULL, -1, &group) < 0) + goto cleanup; + + if (!virCgroupV1HasController(group, VIR_CGROUP_CONTROLLER_MEMORY)) + goto cleanup; + + ignore_value(virCgroupGetValueU64(group, + VIR_CGROUP_CONTROLLER_MEMORY, + "memory.limit_in_bytes", + &mem_unlimited)); + cleanup: + virCgroupFree(&group); + virCgroupV1MemoryUnlimitedKB =3D mem_unlimited >> 10; +} + +static unsigned long long int +virCgroupV1GetMemoryUnlimitedKB(void) +{ + if (virOnce(&virCgroupV1MemoryOnce, virCgroupV1MemoryOnceInit) < 0) + VIR_DEBUG("Init failed, will fall back to defaults."); + + if (virCgroupV1MemoryUnlimitedKB) + return virCgroupV1MemoryUnlimitedKB; + else + return VIR_DOMAIN_MEMORY_PARAM_UNLIMITED; +} + + static int virCgroupV1SetMemory(virCgroupPtr group, unsigned long long kb) @@ -1488,6 +1533,123 @@ virCgroupV1GetMemoryUsage(virCgroupPtr group, } =20 =20 +static int +virCgroupV1SetMemoryHardLimit(virCgroupPtr group, + unsigned long long kb) +{ + return virCgroupV1SetMemory(group, kb); +} + + +static int +virCgroupV1GetMemoryHardLimit(virCgroupPtr group, + unsigned long long *kb) +{ + long long unsigned int limit_in_bytes; + + if (virCgroupGetValueU64(group, + VIR_CGROUP_CONTROLLER_MEMORY, + "memory.limit_in_bytes", &limit_in_bytes) < 0) + return -1; + + *kb =3D limit_in_bytes >> 10; + if (*kb >=3D virCgroupV1GetMemoryUnlimitedKB()) + *kb =3D VIR_DOMAIN_MEMORY_PARAM_UNLIMITED; + + return 0; +} + + +static int +virCgroupV1SetMemorySoftLimit(virCgroupPtr group, + unsigned long long kb) +{ + unsigned long long maxkb =3D VIR_DOMAIN_MEMORY_PARAM_UNLIMITED; + + if (kb > maxkb) { + virReportError(VIR_ERR_INVALID_ARG, + _("Memory '%llu' must be less than %llu"), + kb, maxkb); + return -1; + } + + if (kb =3D=3D maxkb) + return virCgroupSetValueI64(group, + VIR_CGROUP_CONTROLLER_MEMORY, + "memory.soft_limit_in_bytes", + -1); + else + return virCgroupSetValueU64(group, + VIR_CGROUP_CONTROLLER_MEMORY, + "memory.soft_limit_in_bytes", + kb << 10); +} + + +static int +virCgroupV1GetMemorySoftLimit(virCgroupPtr group, + unsigned long long *kb) +{ + long long unsigned int limit_in_bytes; + + if (virCgroupGetValueU64(group, + VIR_CGROUP_CONTROLLER_MEMORY, + "memory.soft_limit_in_bytes", &limit_in_bytes= ) < 0) + return -1; + + *kb =3D limit_in_bytes >> 10; + if (*kb >=3D virCgroupV1GetMemoryUnlimitedKB()) + *kb =3D VIR_DOMAIN_MEMORY_PARAM_UNLIMITED; + + return 0; +} + + +static int +virCgroupV1SetMemSwapHardLimit(virCgroupPtr group, + unsigned long long kb) +{ + unsigned long long maxkb =3D VIR_DOMAIN_MEMORY_PARAM_UNLIMITED; + + if (kb > maxkb) { + virReportError(VIR_ERR_INVALID_ARG, + _("Memory '%llu' must be less than %llu"), + kb, maxkb); + return -1; + } + + if (kb =3D=3D maxkb) + return virCgroupSetValueI64(group, + VIR_CGROUP_CONTROLLER_MEMORY, + "memory.memsw.limit_in_bytes", + -1); + else + return virCgroupSetValueU64(group, + VIR_CGROUP_CONTROLLER_MEMORY, + "memory.memsw.limit_in_bytes", + kb << 10); +} + + +static int +virCgroupV1GetMemSwapHardLimit(virCgroupPtr group, + unsigned long long *kb) +{ + long long unsigned int limit_in_bytes; + + if (virCgroupGetValueU64(group, + VIR_CGROUP_CONTROLLER_MEMORY, + "memory.memsw.limit_in_bytes", &limit_in_byte= s) < 0) + return -1; + + *kb =3D limit_in_bytes >> 10; + if (*kb >=3D virCgroupV1GetMemoryUnlimitedKB()) + *kb =3D VIR_DOMAIN_MEMORY_PARAM_UNLIMITED; + + return 0; +} + + virCgroupBackend virCgroupV1Backend =3D { .type =3D VIR_CGROUP_BACKEND_TYPE_V1, =20 @@ -1528,6 +1690,12 @@ virCgroupBackend virCgroupV1Backend =3D { .setMemory =3D virCgroupV1SetMemory, .getMemoryStat =3D virCgroupV1GetMemoryStat, .getMemoryUsage =3D virCgroupV1GetMemoryUsage, + .setMemoryHardLimit =3D virCgroupV1SetMemoryHardLimit, + .getMemoryHardLimit =3D virCgroupV1GetMemoryHardLimit, + .setMemorySoftLimit =3D virCgroupV1SetMemorySoftLimit, + .getMemorySoftLimit =3D virCgroupV1GetMemorySoftLimit, + .setMemSwapHardLimit =3D virCgroupV1SetMemSwapHardLimit, + .getMemSwapHardLimit =3D virCgroupV1GetMemSwapHardLimit, }; =20 =20 --=20 2.17.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list