render / rpms / libvirt

Forked from rpms/libvirt 7 months ago
Clone
Pablo Greco 40546a
From 04bdbfa106768447822f3e8eeb2946e1f7bfb2b5 Mon Sep 17 00:00:00 2001
Pablo Greco 40546a
Message-Id: <04bdbfa106768447822f3e8eeb2946e1f7bfb2b5@dist-git>
Pablo Greco 40546a
From: Pavel Hrdina <phrdina@redhat.com>
Pablo Greco 40546a
Date: Mon, 1 Jul 2019 17:07:12 +0200
Pablo Greco 40546a
Subject: [PATCH] util: introduce cgroup v2 files
Pablo Greco 40546a
MIME-Version: 1.0
Pablo Greco 40546a
Content-Type: text/plain; charset=UTF-8
Pablo Greco 40546a
Content-Transfer-Encoding: 8bit
Pablo Greco 40546a
Pablo Greco 40546a
Place cgroup v2 backend type before cgroup v1 to make it obvious
Pablo Greco 40546a
that cgroup v2 is preferred implementation.
Pablo Greco 40546a
Pablo Greco 40546a
Following patches will introduce support for hybrid configuration
Pablo Greco 40546a
which will allow us to use both at the same time, but we should
Pablo Greco 40546a
prefer cgroup v2 regardless.
Pablo Greco 40546a
Pablo Greco 40546a
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
Pablo Greco 40546a
(cherry picked from commit b4ddf5ae62ee3a50c7ead1e00914a141e5798096)
Pablo Greco 40546a
Pablo Greco 40546a
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1689297
Pablo Greco 40546a
Pablo Greco 40546a
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
Pablo Greco 40546a
Message-Id: <fcbffeda541380f2e11e42f192b80276153bc84f.1561993100.git.phrdina@redhat.com>
Pablo Greco 40546a
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Pablo Greco 40546a
---
Pablo Greco 40546a
 src/Makefile.am             |  1 +
Pablo Greco 40546a
 src/libvirt_private.syms    |  3 ++
Pablo Greco 40546a
 src/util/Makefile.inc.am    |  2 ++
Pablo Greco 40546a
 src/util/vircgroup.c        |  3 ++
Pablo Greco 40546a
 src/util/vircgroupbackend.c |  2 ++
Pablo Greco 40546a
 src/util/vircgroupbackend.h |  3 +-
Pablo Greco 40546a
 src/util/vircgrouppriv.h    |  9 ++++++
Pablo Greco 40546a
 src/util/vircgroupv2.c      | 63 +++++++++++++++++++++++++++++++++++++
Pablo Greco 40546a
 src/util/vircgroupv2.h      | 27 ++++++++++++++++
Pablo Greco 40546a
 9 files changed, 112 insertions(+), 1 deletion(-)
Pablo Greco 40546a
 create mode 100644 src/util/vircgroupv2.c
Pablo Greco 40546a
 create mode 100644 src/util/vircgroupv2.h
Pablo Greco 40546a
Pablo Greco 40546a
diff --git a/src/Makefile.am b/src/Makefile.am
Pablo Greco 40546a
index 0def0a3b19..cc8e29a45a 100644
Pablo Greco 40546a
--- a/src/Makefile.am
Pablo Greco 40546a
+++ b/src/Makefile.am
Pablo Greco 40546a
@@ -680,6 +680,7 @@ libvirt_setuid_rpc_client_la_SOURCES = \
Pablo Greco 40546a
 		util/vircgroup.c \
Pablo Greco 40546a
 		util/vircgroupbackend.c \
Pablo Greco 40546a
 		util/vircgroupv1.c \
Pablo Greco 40546a
+		util/vircgroupv2.c \
Pablo Greco 40546a
 		util/vircommand.c \
Pablo Greco 40546a
 		util/virconf.c \
Pablo Greco 40546a
 		util/virdbus.c \
Pablo Greco 40546a
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
Pablo Greco 40546a
index b144955154..8132f9664b 100644
Pablo Greco 40546a
--- a/src/libvirt_private.syms
Pablo Greco 40546a
+++ b/src/libvirt_private.syms
Pablo Greco 40546a
@@ -1598,6 +1598,9 @@ virCgroupBackendRegister;
Pablo Greco 40546a
 # util/vircgroupv1.h
Pablo Greco 40546a
 virCgroupV1Register;
Pablo Greco 40546a
 
Pablo Greco 40546a
+# util/vircgroupv2.h
Pablo Greco 40546a
+virCgroupV2Register;
Pablo Greco 40546a
+
Pablo Greco 40546a
 # util/virclosecallbacks.h
Pablo Greco 40546a
 virCloseCallbacksGet;
Pablo Greco 40546a
 virCloseCallbacksGetConn;
Pablo Greco 40546a
diff --git a/src/util/Makefile.inc.am b/src/util/Makefile.inc.am
Pablo Greco 40546a
index 725ece98e9..24a98632a3 100644
Pablo Greco 40546a
--- a/src/util/Makefile.inc.am
Pablo Greco 40546a
+++ b/src/util/Makefile.inc.am
Pablo Greco 40546a
@@ -27,6 +27,8 @@ UTIL_SOURCES = \
Pablo Greco 40546a
 	util/vircgroupbackend.h \
Pablo Greco 40546a
 	util/vircgroupv1.c \
Pablo Greco 40546a
 	util/vircgroupv1.h \
Pablo Greco 40546a
+	util/vircgroupv2.c \
Pablo Greco 40546a
+	util/vircgroupv2.h \
Pablo Greco 40546a
 	util/virclosecallbacks.c \
Pablo Greco 40546a
 	util/virclosecallbacks.h \
Pablo Greco 40546a
 	util/vircommand.c \
Pablo Greco 40546a
diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c
Pablo Greco 40546a
index 7ec1399bc6..42930582db 100644
Pablo Greco 40546a
--- a/src/util/vircgroup.c
Pablo Greco 40546a
+++ b/src/util/vircgroup.c
Pablo Greco 40546a
@@ -1240,6 +1240,9 @@ virCgroupFree(virCgroupPtr *group)
Pablo Greco 40546a
         VIR_FREE((*group)->legacy[i].placement);
Pablo Greco 40546a
     }
Pablo Greco 40546a
 
Pablo Greco 40546a
+    VIR_FREE((*group)->unified.mountPoint);
Pablo Greco 40546a
+    VIR_FREE((*group)->unified.placement);
Pablo Greco 40546a
+
Pablo Greco 40546a
     VIR_FREE((*group)->path);
Pablo Greco 40546a
     VIR_FREE(*group);
Pablo Greco 40546a
 }
Pablo Greco 40546a
diff --git a/src/util/vircgroupbackend.c b/src/util/vircgroupbackend.c
Pablo Greco 40546a
index d854c9711d..79fe6cb73d 100644
Pablo Greco 40546a
--- a/src/util/vircgroupbackend.c
Pablo Greco 40546a
+++ b/src/util/vircgroupbackend.c
Pablo Greco 40546a
@@ -21,6 +21,7 @@
Pablo Greco 40546a
 
Pablo Greco 40546a
 #include "vircgroupbackend.h"
Pablo Greco 40546a
 #include "vircgroupv1.h"
Pablo Greco 40546a
+#include "vircgroupv2.h"
Pablo Greco 40546a
 #include "virerror.h"
Pablo Greco 40546a
 #include "virthread.h"
Pablo Greco 40546a
 
Pablo Greco 40546a
@@ -28,6 +29,7 @@
Pablo Greco 40546a
 
Pablo Greco 40546a
 VIR_ENUM_DECL(virCgroupBackend);
Pablo Greco 40546a
 VIR_ENUM_IMPL(virCgroupBackend, VIR_CGROUP_BACKEND_TYPE_LAST,
Pablo Greco 40546a
+              "cgroup V2",
Pablo Greco 40546a
               "cgroup V1");
Pablo Greco 40546a
 
Pablo Greco 40546a
 static virOnceControl virCgroupBackendOnce = VIR_ONCE_CONTROL_INITIALIZER;
Pablo Greco 40546a
diff --git a/src/util/vircgroupbackend.h b/src/util/vircgroupbackend.h
Pablo Greco 40546a
index 1c5744ef76..b1f19233e4 100644
Pablo Greco 40546a
--- a/src/util/vircgroupbackend.h
Pablo Greco 40546a
+++ b/src/util/vircgroupbackend.h
Pablo Greco 40546a
@@ -50,7 +50,8 @@ typedef enum {
Pablo Greco 40546a
 } virCgroupBackendTaskFlags;
Pablo Greco 40546a
 
Pablo Greco 40546a
 typedef enum {
Pablo Greco 40546a
-    VIR_CGROUP_BACKEND_TYPE_V1 = 0,
Pablo Greco 40546a
+    VIR_CGROUP_BACKEND_TYPE_V2 = 0,
Pablo Greco 40546a
+    VIR_CGROUP_BACKEND_TYPE_V1,
Pablo Greco 40546a
     VIR_CGROUP_BACKEND_TYPE_LAST,
Pablo Greco 40546a
 } virCgroupBackendType;
Pablo Greco 40546a
 
Pablo Greco 40546a
diff --git a/src/util/vircgrouppriv.h b/src/util/vircgrouppriv.h
Pablo Greco 40546a
index c50a25f195..4a0d75ddbc 100644
Pablo Greco 40546a
--- a/src/util/vircgrouppriv.h
Pablo Greco 40546a
+++ b/src/util/vircgrouppriv.h
Pablo Greco 40546a
@@ -45,12 +45,21 @@ struct _virCgroupV1Controller {
Pablo Greco 40546a
 typedef struct _virCgroupV1Controller virCgroupV1Controller;
Pablo Greco 40546a
 typedef virCgroupV1Controller *virCgroupV1ControllerPtr;
Pablo Greco 40546a
 
Pablo Greco 40546a
+struct _virCgroupV2Controller {
Pablo Greco 40546a
+    int controllers;
Pablo Greco 40546a
+    char *mountPoint;
Pablo Greco 40546a
+    char *placement;
Pablo Greco 40546a
+};
Pablo Greco 40546a
+typedef struct _virCgroupV2Controller virCgroupV2Controller;
Pablo Greco 40546a
+typedef virCgroupV2Controller *virCgroupV2ControllerPtr;
Pablo Greco 40546a
+
Pablo Greco 40546a
 struct _virCgroup {
Pablo Greco 40546a
     char *path;
Pablo Greco 40546a
 
Pablo Greco 40546a
     virCgroupBackendPtr backend;
Pablo Greco 40546a
 
Pablo Greco 40546a
     virCgroupV1Controller legacy[VIR_CGROUP_CONTROLLER_LAST];
Pablo Greco 40546a
+    virCgroupV2Controller unified;
Pablo Greco 40546a
 };
Pablo Greco 40546a
 
Pablo Greco 40546a
 int virCgroupSetValueStr(virCgroupPtr group,
Pablo Greco 40546a
diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c
Pablo Greco 40546a
new file mode 100644
Pablo Greco 40546a
index 0000000000..23bf81dae2
Pablo Greco 40546a
--- /dev/null
Pablo Greco 40546a
+++ b/src/util/vircgroupv2.c
Pablo Greco 40546a
@@ -0,0 +1,63 @@
Pablo Greco 40546a
+/*
Pablo Greco 40546a
+ * vircgroupv2.c: methods for cgroups v2 backend
Pablo Greco 40546a
+ *
Pablo Greco 40546a
+ * Copyright (C) 2018 Red Hat, Inc.
Pablo Greco 40546a
+ *
Pablo Greco 40546a
+ * This library is free software; you can redistribute it and/or
Pablo Greco 40546a
+ * modify it under the terms of the GNU Lesser General Public
Pablo Greco 40546a
+ * License as published by the Free Software Foundation; either
Pablo Greco 40546a
+ * version 2.1 of the License, or (at your option) any later version.
Pablo Greco 40546a
+ *
Pablo Greco 40546a
+ * This library is distributed in the hope that it will be useful,
Pablo Greco 40546a
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
Pablo Greco 40546a
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Pablo Greco 40546a
+ * Lesser General Public License for more details.
Pablo Greco 40546a
+ *
Pablo Greco 40546a
+ * You should have received a copy of the GNU Lesser General Public
Pablo Greco 40546a
+ * License along with this library.  If not, see
Pablo Greco 40546a
+ * <http://www.gnu.org/licenses/>.
Pablo Greco 40546a
+ */
Pablo Greco 40546a
+#include <config.h>
Pablo Greco 40546a
+
Pablo Greco 40546a
+#include "internal.h"
Pablo Greco 40546a
+
Pablo Greco 40546a
+#define __VIR_CGROUP_ALLOW_INCLUDE_PRIV_H__
Pablo Greco 40546a
+#include "vircgrouppriv.h"
Pablo Greco 40546a
+#undef __VIR_CGROUP_ALLOW_INCLUDE_PRIV_H__
Pablo Greco 40546a
+
Pablo Greco 40546a
+#include "vircgroup.h"
Pablo Greco 40546a
+#include "vircgroupbackend.h"
Pablo Greco 40546a
+#include "vircgroupv2.h"
Pablo Greco 40546a
+#include "virlog.h"
Pablo Greco 40546a
+
Pablo Greco 40546a
+VIR_LOG_INIT("util.cgroup");
Pablo Greco 40546a
+
Pablo Greco 40546a
+#define VIR_FROM_THIS VIR_FROM_CGROUP
Pablo Greco 40546a
+
Pablo Greco 40546a
+VIR_ENUM_DECL(virCgroupV2Controller);
Pablo Greco 40546a
+VIR_ENUM_IMPL(virCgroupV2Controller, VIR_CGROUP_CONTROLLER_LAST,
Pablo Greco 40546a
+              "cpu", "cpuacct", "cpuset", "memory", "devices",
Pablo Greco 40546a
+              "freezer", "io", "net_cls", "perf_event", "name=systemd");
Pablo Greco 40546a
+
Pablo Greco 40546a
+#ifdef __linux__
Pablo Greco 40546a
+
Pablo Greco 40546a
+virCgroupBackend virCgroupV2Backend = {
Pablo Greco 40546a
+    .type = VIR_CGROUP_BACKEND_TYPE_V2,
Pablo Greco 40546a
+};
Pablo Greco 40546a
+
Pablo Greco 40546a
+
Pablo Greco 40546a
+void
Pablo Greco 40546a
+virCgroupV2Register(void)
Pablo Greco 40546a
+{
Pablo Greco 40546a
+    virCgroupBackendRegister(&virCgroupV2Backend);
Pablo Greco 40546a
+}
Pablo Greco 40546a
+
Pablo Greco 40546a
+#else /* !__linux__ */
Pablo Greco 40546a
+
Pablo Greco 40546a
+void
Pablo Greco 40546a
+virCgroupV2Register(void)
Pablo Greco 40546a
+{
Pablo Greco 40546a
+    VIR_INFO("Control groups not supported on this platform");
Pablo Greco 40546a
+}
Pablo Greco 40546a
+
Pablo Greco 40546a
+#endif /* !__linux__ */
Pablo Greco 40546a
diff --git a/src/util/vircgroupv2.h b/src/util/vircgroupv2.h
Pablo Greco 40546a
new file mode 100644
Pablo Greco 40546a
index 0000000000..a5d0bd0978
Pablo Greco 40546a
--- /dev/null
Pablo Greco 40546a
+++ b/src/util/vircgroupv2.h
Pablo Greco 40546a
@@ -0,0 +1,27 @@
Pablo Greco 40546a
+/*
Pablo Greco 40546a
+ * vircgroupv2.h: methods for cgroups v2 backend
Pablo Greco 40546a
+ *
Pablo Greco 40546a
+ * Copyright (C) 2018 Red Hat, Inc.
Pablo Greco 40546a
+ *
Pablo Greco 40546a
+ * This library is free software; you can redistribute it and/or
Pablo Greco 40546a
+ * modify it under the terms of the GNU Lesser General Public
Pablo Greco 40546a
+ * License as published by the Free Software Foundation; either
Pablo Greco 40546a
+ * version 2.1 of the License, or (at your option) any later version.
Pablo Greco 40546a
+ *
Pablo Greco 40546a
+ * This library is distributed in the hope that it will be useful,
Pablo Greco 40546a
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
Pablo Greco 40546a
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Pablo Greco 40546a
+ * Lesser General Public License for more details.
Pablo Greco 40546a
+ *
Pablo Greco 40546a
+ * You should have received a copy of the GNU Lesser General Public
Pablo Greco 40546a
+ * License along with this library.  If not, see
Pablo Greco 40546a
+ * <http://www.gnu.org/licenses/>.
Pablo Greco 40546a
+ */
Pablo Greco 40546a
+
Pablo Greco 40546a
+#ifndef __VIR_CGROUP_V2_H__
Pablo Greco 40546a
+# define __VIR_CGROUP_V2_H__
Pablo Greco 40546a
+
Pablo Greco 40546a
+void
Pablo Greco 40546a
+virCgroupV2Register(void);
Pablo Greco 40546a
+
Pablo Greco 40546a
+#endif /* __VIR_CGROUP_V2_H__ */
Pablo Greco 40546a
-- 
Pablo Greco 40546a
2.22.0
Pablo Greco 40546a