diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c index 8594f75eaf..44e88c46f2 100644 --- a/src/util/vircgroup.c +++ b/src/util/vircgroup.c @@ -555,7 +555,7 @@ virCgroupSetValueI64(virCgroupPtr group, } -static int +int virCgroupGetValueI64(virCgroupPtr group, int controller, const char *key, @@ -2254,19 +2254,7 @@ virCgroupGetCpuCfsPeriod(virCgroupPtr group, unsigned long long *cfs_period) int virCgroupSetCpuCfsQuota(virCgroupPtr group, long long cfs_quota) { - /* The cfs_quota should be greater or equal than 1ms */ - if (cfs_quota >= 0 && - (cfs_quota < 1000 || - cfs_quota > ULLONG_MAX / 1000)) { - virReportError(VIR_ERR_INVALID_ARG, - _("cfs_quota '%lld' must be in range (1000, %llu)"), - cfs_quota, ULLONG_MAX / 1000); - return -1; - } - - return virCgroupSetValueI64(group, - VIR_CGROUP_CONTROLLER_CPU, - "cpu.cfs_quota_us", cfs_quota); + VIR_CGROUP_BACKEND_CALL(group, setCpuCfsQuota, -1, cfs_quota); } @@ -2590,9 +2578,7 @@ virCgroupKillPainfully(virCgroupPtr group) int virCgroupGetCpuCfsQuota(virCgroupPtr group, long long *cfs_quota) { - return virCgroupGetValueI64(group, - VIR_CGROUP_CONTROLLER_CPU, - "cpu.cfs_quota_us", cfs_quota); + VIR_CGROUP_BACKEND_CALL(group, getCpuCfsQuota, -1, cfs_quota); } diff --git a/src/util/vircgroupbackend.h b/src/util/vircgroupbackend.h index 7dc1f77bfd..f7c230db76 100644 --- a/src/util/vircgroupbackend.h +++ b/src/util/vircgroupbackend.h @@ -292,6 +292,14 @@ typedef int (*virCgroupGetCpuCfsPeriodCB)(virCgroupPtr group, unsigned long long *cfs_period); +typedef int +(*virCgroupSetCpuCfsQuotaCB)(virCgroupPtr group, + long long cfs_quota); + +typedef int +(*virCgroupGetCpuCfsQuotaCB)(virCgroupPtr group, + long long *cfs_quota); + struct _virCgroupBackend { virCgroupBackendType type; @@ -351,6 +359,8 @@ struct _virCgroupBackend { virCgroupGetCpuSharesCB getCpuShares; virCgroupSetCpuCfsPeriodCB setCpuCfsPeriod; virCgroupGetCpuCfsPeriodCB getCpuCfsPeriod; + virCgroupSetCpuCfsQuotaCB setCpuCfsQuota; + virCgroupGetCpuCfsQuotaCB getCpuCfsQuota; }; typedef struct _virCgroupBackend virCgroupBackend; typedef virCgroupBackend *virCgroupBackendPtr; diff --git a/src/util/vircgrouppriv.h b/src/util/vircgrouppriv.h index 7b985280e1..38c911e8ed 100644 --- a/src/util/vircgrouppriv.h +++ b/src/util/vircgrouppriv.h @@ -78,6 +78,11 @@ int virCgroupSetValueI64(virCgroupPtr group, const char *key, long long int value); +int virCgroupGetValueI64(virCgroupPtr group, + int controller, + const char *key, + long long int *value); + int virCgroupPartitionEscape(char **path); char *virCgroupGetBlockDevString(const char *path); diff --git a/src/util/vircgroupv1.c b/src/util/vircgroupv1.c index f1760d474d..ea206d8b37 100644 --- a/src/util/vircgroupv1.c +++ b/src/util/vircgroupv1.c @@ -1815,6 +1815,36 @@ virCgroupV1GetCpuCfsPeriod(virCgroupPtr group, } +static int +virCgroupV1SetCpuCfsQuota(virCgroupPtr group, + long long cfs_quota) +{ + /* The cfs_quota should be greater or equal than 1ms */ + if (cfs_quota >= 0 && + (cfs_quota < 1000 || + cfs_quota > ULLONG_MAX / 1000)) { + virReportError(VIR_ERR_INVALID_ARG, + _("cfs_quota '%lld' must be in range (1000, %llu)"), + cfs_quota, ULLONG_MAX / 1000); + return -1; + } + + return virCgroupSetValueI64(group, + VIR_CGROUP_CONTROLLER_CPU, + "cpu.cfs_quota_us", cfs_quota); +} + + +static int +virCgroupV1GetCpuCfsQuota(virCgroupPtr group, + long long *cfs_quota) +{ + return virCgroupGetValueI64(group, + VIR_CGROUP_CONTROLLER_CPU, + "cpu.cfs_quota_us", cfs_quota); +} + + virCgroupBackend virCgroupV1Backend = { .type = VIR_CGROUP_BACKEND_TYPE_V1, @@ -1872,6 +1902,8 @@ virCgroupBackend virCgroupV1Backend = { .getCpuShares = virCgroupV1GetCpuShares, .setCpuCfsPeriod = virCgroupV1SetCpuCfsPeriod, .getCpuCfsPeriod = virCgroupV1GetCpuCfsPeriod, + .setCpuCfsQuota = virCgroupV1SetCpuCfsQuota, + .getCpuCfsQuota = virCgroupV1GetCpuCfsQuota, };