The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/8146

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
This gets us CPU weight and CPU max limits, at which point the only two things missing are:

 - swappiness
 - net_prio

Both of which aren't currently supported in the kernel and are reported by LXD on startup, everything else is functional and tested.
From dc00b3e9193ec8ed2570be5acf9dc6db46d10d55 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Wed, 11 Nov 2020 16:54:35 -0500
Subject: [PATCH 1/4] lxd/cgroup: Support SetCPUShare on V2
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/cgroup/abstraction.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lxd/cgroup/abstraction.go b/lxd/cgroup/abstraction.go
index f78da3ab95..892ccc541d 100644
--- a/lxd/cgroup/abstraction.go
+++ b/lxd/cgroup/abstraction.go
@@ -447,7 +447,7 @@ func (cg *CGroup) SetCPUShare(limit int64) error {
        case V1:
                return cg.rw.Set(version, "cpu", "cpu.shares", 
fmt.Sprintf("%d", limit))
        case V2:
-               return ErrControllerMissing
+               return cg.rw.Set(version, "cpu", "cpu.weight", 
fmt.Sprintf("%d", limit))
        }
 
        return ErrUnknownVersion

From 5253004394d1d8dde9b9b069c5534b42a27b9cd9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Wed, 11 Nov 2020 17:03:43 -0500
Subject: [PATCH 2/4] lxd/cgroup: Implement SetCPUCfsLimit for V2
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/cgroup/abstraction.go | 34 ++++++++++++++++------------------
 1 file changed, 16 insertions(+), 18 deletions(-)

diff --git a/lxd/cgroup/abstraction.go b/lxd/cgroup/abstraction.go
index 892ccc541d..c57ae2e3bc 100644
--- a/lxd/cgroup/abstraction.go
+++ b/lxd/cgroup/abstraction.go
@@ -453,32 +453,30 @@ func (cg *CGroup) SetCPUShare(limit int64) error {
        return ErrUnknownVersion
 }
 
-// SetCPUCfsPeriod sets the duration in ms for each scheduling period
-func (cg *CGroup) SetCPUCfsPeriod(limit int64) error {
+// SetCPUCfsLimit sets the quota and duration in ms for each scheduling period
+func (cg *CGroup) SetCPUCfsLimit(limitPeriod int64, limitQuota int64) error {
        version := cgControllers["cpu"]
        switch version {
        case Unavailable:
                return ErrControllerMissing
        case V1:
-               return cg.rw.Set(version, "cpu", "cpu.cfs_period_us", 
fmt.Sprintf("%d", limit))
-       case V2:
-               return ErrControllerMissing
-       }
+               err := cg.rw.Set(version, "cpu", "cpu.cfs_quota_us", 
fmt.Sprintf("%d", limitQuota))
+               if err != nil {
+                       return err
+               }
 
-       return ErrUnknownVersion
-}
+               err = cg.rw.Set(version, "cpu", "cpu.cfs_period_us", 
fmt.Sprintf("%d", limitPeriod))
+               if err != nil {
+                       return err
+               }
 
-// SetCPUCfsQuota sets the max time in ms during each cfs_period_us that
-// the current group can run for
-func (cg *CGroup) SetCPUCfsQuota(limit int64) error {
-       version := cgControllers["cpu"]
-       switch version {
-       case Unavailable:
-               return ErrControllerMissing
-       case V1:
-               return cg.rw.Set(version, "cpu", "cpu.cfs_quota_us", 
fmt.Sprintf("%d", limit))
+               return nil
        case V2:
-               return ErrControllerMissing
+               if limitPeriod == -1 && limitQuota == -1 {
+                       return cg.rw.Set(version, "cpu", "cpu.max", "max")
+               }
+
+               return cg.rw.Set(version, "cpu", "cpu.max", fmt.Sprintf("%d 
%d", limitQuota, limitPeriod))
        }
 
        return ErrUnknownVersion

From 0e05ad3b98ea956767102fddc51e1f5d00bb408a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Wed, 11 Nov 2020 17:03:50 -0500
Subject: [PATCH 3/4] lxd/instance/lxc: Port to SetCPUCfsLimit
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/instance/drivers/driver_lxc.go | 18 ++++--------------
 1 file changed, 4 insertions(+), 14 deletions(-)

diff --git a/lxd/instance/drivers/driver_lxc.go 
b/lxd/instance/drivers/driver_lxc.go
index b02f212c3e..101a0078d7 100644
--- a/lxd/instance/drivers/driver_lxc.go
+++ b/lxd/instance/drivers/driver_lxc.go
@@ -1209,15 +1209,8 @@ func (c *lxc) initLXC(config bool) error {
                        }
                }
 
-               if cpuCfsPeriod != -1 {
-                       err = cg.SetCPUCfsPeriod(cpuCfsPeriod)
-                       if err != nil {
-                               return err
-                       }
-               }
-
-               if cpuCfsQuota != -1 {
-                       err = cg.SetCPUCfsQuota(cpuCfsQuota)
+               if cpuCfsPeriod != -1 && cpuCfsQuota != -1 {
+                       err = cg.SetCPUCfsLimit(cpuCfsPeriod, cpuCfsQuota)
                        if err != nil {
                                return err
                        }
@@ -4428,16 +4421,13 @@ func (c *lxc) Update(args db.InstanceArgs, 
userRequested bool) error {
                                if err != nil {
                                        return err
                                }
+
                                err = cg.SetCPUShare(cpuShares)
                                if err != nil {
                                        return err
                                }
-                               err = cg.SetCPUCfsPeriod(cpuCfsPeriod)
-                               if err != nil {
-                                       return err
-                               }
 
-                               err = cg.SetCPUCfsQuota(cpuCfsQuota)
+                               err = cg.SetCPUCfsLimit(cpuCfsPeriod, 
cpuCfsQuota)
                                if err != nil {
                                        return err
                                }

From b9b1ed31c108cae7227bea588ac9735c098123fe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Wed, 11 Nov 2020 17:21:25 -0500
Subject: [PATCH 4/4] lxd/cgroup: Support CGroup V2 in ParseCPU
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/cgroup/cgroup_cpu.go | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/lxd/cgroup/cgroup_cpu.go b/lxd/cgroup/cgroup_cpu.go
index c808d3392b..bf048dfe85 100644
--- a/lxd/cgroup/cgroup_cpu.go
+++ b/lxd/cgroup/cgroup_cpu.go
@@ -23,6 +23,12 @@ func TaskSchedulerTrigger(srcType string, srcName string, 
srcStatus string) {
 func ParseCPU(cpuAllowance string, cpuPriority string) (int64, int64, int64, 
error) {
        var err error
 
+       // Max shares depending on backend.
+       maxShares := int64(1024)
+       if cgControllers["cpu"] == V2 {
+               maxShares = 100
+       }
+
        // Parse priority
        cpuShares := int64(0)
        cpuPriorityInt := 10
@@ -36,7 +42,7 @@ func ParseCPU(cpuAllowance string, cpuPriority string) 
(int64, int64, int64, err
 
        // Parse allowance
        cpuCfsQuota := int64(-1)
-       cpuCfsPeriod := int64(100000)
+       cpuCfsPeriod := int64(-1)
 
        if cpuAllowance != "" {
                if strings.HasSuffix(cpuAllowance, "%") {
@@ -46,7 +52,7 @@ func ParseCPU(cpuAllowance string, cpuPriority string) 
(int64, int64, int64, err
                                return -1, -1, -1, err
                        }
 
-                       cpuShares += int64((10 * percent) + 24)
+                       cpuShares += int64(float64(maxShares) / float64(100) * 
float64(percent))
                } else {
                        // Time based allocation
                        fields := strings.SplitN(cpuAllowance, "/", 2)
@@ -67,11 +73,11 @@ func ParseCPU(cpuAllowance string, cpuPriority string) 
(int64, int64, int64, err
                        // Set limit in ms
                        cpuCfsQuota = int64(quota * 1000)
                        cpuCfsPeriod = int64(period * 1000)
-                       cpuShares += 1024
+                       cpuShares += maxShares
                }
        } else {
                // Default is 100%
-               cpuShares += 1024
+               cpuShares += maxShares
        }
 
        // Deal with a potential negative score
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to