lcr/0003-update-add-support-update-cpu-rt.patch
gaohuatao 385a897570 update from openeuler master
Signed-off-by: gaohuatao <gaohuatao@huawei.com>
(cherry picked from commit 8099a6b8a545ec9e465075d2113a7c1bd44d5a3b)
Signed-off-by: gaohuatao <gaohuatao@huawei.com>
2020-11-12 18:36:46 +08:00

494 lines
18 KiB
Diff

From a06d44ffb5c6acc492b73bfbb307a6af390ba23f Mon Sep 17 00:00:00 2001
From: lifeng68 <lifeng68@huawei.com>
Date: Tue, 8 Sep 2020 18:46:41 +0800
Subject: [PATCH 03/10] update: add support update cpu rt
Signed-off-by: lifeng68 <lifeng68@huawei.com>
---
src/lcrcontainer.h | 169 +++++++++++++++++++------------------
src/lcrcontainer_execute.c | 88 +++++++++++++++----
2 files changed, 157 insertions(+), 100 deletions(-)
diff --git a/src/lcrcontainer.h b/src/lcrcontainer.h
index 9b41fd9..68014ba 100644
--- a/src/lcrcontainer.h
+++ b/src/lcrcontainer.h
@@ -38,7 +38,6 @@
extern "C" {
#endif
-
/* define console log config */
struct lcr_console_config {
@@ -48,8 +47,8 @@ struct lcr_console_config {
};
/*
- * Store lcr container info
- */
+* Store lcr container info
+*/
struct lcr_container_info {
/* Name of container. */
char *name;
@@ -72,8 +71,8 @@ struct blkio_stats {
};
/*
- * Store lcr container state
- */
+* Store lcr container state
+*/
struct lcr_container_state {
/* Name of container */
char *name;
@@ -125,66 +124,68 @@ struct lcr_cgroup_resources {
uint64_t memory_swap;
uint64_t memory_reservation;
uint64_t kernel_memory_limit;
+ int64_t cpurt_period;
+ int64_t cpurt_runtime;
};
/*
- * Get one container info for a given lcrpath.
- * return struct of container info, or NULL on error.
- */
+* Get one container info for a given lcrpath.
+* return struct of container info, or NULL on error.
+*/
struct lcr_container_info *lcr_container_info_get(const char *name, const char *lcrpath);
/*
- * Free lcr_container_info returned lcr_container_info_get
- */
+* Free lcr_container_info returned lcr_container_info_get
+*/
void lcr_container_info_free(struct lcr_container_info *info);
/*
- * Get a complete list of all containers for a given lcrpath.
- * return Number of containers, or -1 on error.
- */
+* Get a complete list of all containers for a given lcrpath.
+* return Number of containers, or -1 on error.
+*/
int lcr_list_all_containers(const char *lcrpath, struct lcr_container_info **info_arr);
/*
- * Free lcr_container_info array returned by lcr_list_{active,all}_containers
- */
+* Free lcr_container_info array returned by lcr_list_{active,all}_containers
+*/
void lcr_containers_info_free(struct lcr_container_info **info_arr, size_t size);
/*
- * Create a container
- * param name : container name
- * param lcrpath : container path
- * param oci_json_data : json string of oci config data
- */
+* Create a container
+* param name : container name
+* param lcrpath : container path
+* param oci_json_data : json string of oci config data
+*/
bool lcr_create_from_ocidata(const char *name, const char *lcrpath, const void *oci_json_data);
/*
- * Create a container
- * param name : container name
- * param lcrpath : container path
- * param oci_config : pointer of struct oci config
- */
+* Create a container
+* param name : container name
+* param lcrpath : container path
+* param oci_config : pointer of struct oci config
+*/
bool lcr_create(const char *name, const char *lcrpath, void *oci_config);
/*
- * Start a container
- * param name : container name, required.
- * param lcrpath : container path, set to NULL if you want use default lcrpath.
- * param logpath : log file path.
- * param loglevel : log level.
- * param pidfile : container pidfile path, set to NULL if you don't need.
- * param daemonize : daemonize the container.
- * console_fifos[] : path of the console fifos,[0]:input, [1]:output.used internal by iSulad
- * console_logpath :path of console log file,
- * set to NULL if want to use the default configure(base on the config file)
- set to PATH(for example "/home/XX/XX.log"), LXC will save the console to this file
- * share_ns : array of container's name or pid which want to share namespace with them
- * start_timeout : seconds for waiting on a container to start before it is killed
- * container_pidfile : container's pidfile
- * param argv : array of arguments to pass to init.
- * uid : user to run container
- * gid : user in which group
- * additional_gids : Add additional groups to join
- */
+* Start a container
+* param name : container name, required.
+* param lcrpath : container path, set to NULL if you want use default lcrpath.
+* param logpath : log file path.
+* param loglevel : log level.
+* param pidfile : container pidfile path, set to NULL if you don't need.
+* param daemonize : daemonize the container.
+* console_fifos[] : path of the console fifos,[0]:input, [1]:output.used internal by iSulad
+* console_logpath :path of console log file,
+* set to NULL if want to use the default configure(base on the config file)
+ set to PATH(for example "/home/XX/XX.log"), LXC will save the console to this file
+* share_ns : array of container's name or pid which want to share namespace with them
+* start_timeout : seconds for waiting on a container to start before it is killed
+* container_pidfile : container's pidfile
+* param argv : array of arguments to pass to init.
+* uid : user to run container
+* gid : user in which group
+* additional_gids : Add additional groups to join
+*/
struct lcr_start_request {
const char *name;
const char *lcrpath;
@@ -203,73 +204,73 @@ struct lcr_start_request {
bool lcr_start(const struct lcr_start_request *request);
/*
- * Stop a container
- * param name : container name, required.
- * param lcrpath : container path, set to NULL if you want use default lcrpath.
- * param signal : signal to send to the container.
- */
+* Stop a container
+* param name : container name, required.
+* param lcrpath : container path, set to NULL if you want use default lcrpath.
+* param signal : signal to send to the container.
+*/
bool lcr_kill(const char *name, const char *lcrpath, uint32_t signal);
/*
- * Delete a container
- * param name : container name, required.
- * param lcrpath : container path, set to NULL if you want use default lcrpath.
- * param force : force to delete container
- */
+* Delete a container
+* param name : container name, required.
+* param lcrpath : container path, set to NULL if you want use default lcrpath.
+* param force : force to delete container
+*/
bool lcr_delete(const char *name, const char *lcrpath);
bool lcr_clean(const char *name, const char *lcrpath, const char *logpath, const char *loglevel, pid_t pid);
/*
- * Get state of the container
- * param name : container name, required.
- * param lcrpath : container path, set to NULL if you want use default lcrpath.
- * param lcs : returned contaiener state
- */
+* Get state of the container
+* param name : container name, required.
+* param lcrpath : container path, set to NULL if you want use default lcrpath.
+* param lcs : returned contaiener state
+*/
bool lcr_state(const char *name, const char *lcrpath, struct lcr_container_state *lcs);
/*
- * Pause a container
- * param name : container name, required.
- * param lcrpath : container path, set to NULL if you want use default lcrpath.
- */
+* Pause a container
+* param name : container name, required.
+* param lcrpath : container path, set to NULL if you want use default lcrpath.
+*/
bool lcr_pause(const char *name, const char *lcrpath);
/*
- * Resume a container
- * param name : container name, required.
- * param lcrpath : container path, set to NULL if you want use default lcrpath.
- */
+* Resume a container
+* param name : container name, required.
+* param lcrpath : container path, set to NULL if you want use default lcrpath.
+*/
bool lcr_resume(const char *name, const char *lcrpath);
/*
- * Free lcr_container_state returned by lcr_state
- */
+* Free lcr_container_state returned by lcr_state
+*/
void lcr_container_state_free(struct lcr_container_state *lcs);
/*
- * console function
- * param name : name of container
- * param lcrpath : container path, set to NULL if you want use default lcrpath.
- * param in_fifo : fifo names of input FIFO
- * param out_fifo : fifo names of output FIFO
- * Returns false if the console FIFOs add failed, true if success
- */
+* console function
+* param name : name of container
+* param lcrpath : container path, set to NULL if you want use default lcrpath.
+* param in_fifo : fifo names of input FIFO
+* param out_fifo : fifo names of output FIFO
+* Returns false if the console FIFOs add failed, true if success
+*/
bool lcr_console(const char *name, const char *lcrpath, const char *in_fifo, const char *out_fifo,
const char *err_fifo);
/*
- * get container console configs
- * param name : name of container
- * param lcrpath : container path, set to NULL if you want use default lcrpath.
- * param config : use to store container console configs, cannot be NULL
- */
+* get container console configs
+* param name : name of container
+* param lcrpath : container path, set to NULL if you want use default lcrpath.
+* param config : use to store container console configs, cannot be NULL
+*/
bool lcr_get_console_config(const char *name, const char *lcrpath, struct lcr_console_config *config);
void lcr_free_console_config(struct lcr_console_config *config);
int lcr_log_init(const char *name, const char *file, const char *priority,
- const char *prefix, int quiet, const char *lcrpath);
+ const char *prefix, int quiet, const char *lcrpath);
struct lcr_exec_request {
const char *name;
@@ -295,8 +296,8 @@ struct lcr_exec_request {
bool open_stdin;
};
/*
- * Execute process inside a container
- */
+* Execute process inside a container
+*/
bool lcr_exec(const struct lcr_exec_request *request, int *exit_code);
bool lcr_update(const char *name, const char *lcrpath, const struct lcr_cgroup_resources *cr);
diff --git a/src/lcrcontainer_execute.c b/src/lcrcontainer_execute.c
index 3a9e2de..a2a4bed 100644
--- a/src/lcrcontainer_execute.c
+++ b/src/lcrcontainer_execute.c
@@ -46,6 +46,8 @@
#define CGROUP_CPU_SHARES "cpu.shares"
#define CGROUP_CPU_PERIOD "cpu.cfs_period_us"
#define CGROUP_CPU_QUOTA "cpu.cfs_quota_us"
+#define CGROUP_CPU_RT_PERIOD "cpu.rt_period_us"
+#define CGROUP_CPU_RT_RUNTIME "cpu.rt_runtime_us"
#define CGROUP_CPUSET_CPUS "cpuset.cpus"
#define CGROUP_CPUSET_MEMS "cpuset.mems"
#define CGROUP_MEMORY_LIMIT "memory.limit_in_bytes"
@@ -53,7 +55,8 @@
#define CGROUP_MEMORY_RESERVATION "memory.soft_limit_in_bytes"
#define REPORT_SET_CGROUP_ERROR(item, value) \
- do { \
+ do \
+ { \
SYSERROR("Error updating cgroup %s to %s", (item), (value)); \
lcr_set_error_message(LCR_ERR_RUNTIME, "Error updating cgroup %s to %s: %s", (item), (value), \
strerror(errno)); \
@@ -79,7 +82,7 @@ static inline void add_array_kv(char **array, size_t total, size_t *pos, const c
static uint64_t stat_get_ull(struct lxc_container *c, const char *item)
{
- char buf[80] = { 0 };
+ char buf[80] = {0};
int len = 0;
uint64_t val = 0;
@@ -126,7 +129,7 @@ err_out:
static int update_resources_cpu_shares(struct lxc_container *c, const struct lcr_cgroup_resources *cr)
{
int ret = 0;
- char numstr[128] = { 0 }; /* max buffer */
+ char numstr[128] = {0}; /* max buffer */
if (cr->cpu_shares != 0) {
int num = snprintf(numstr, sizeof(numstr), "%llu", (unsigned long long)(cr->cpu_shares));
@@ -149,7 +152,7 @@ out:
static int update_resources_cpu_period(struct lxc_container *c, const struct lcr_cgroup_resources *cr)
{
int ret = 0;
- char numstr[128] = { 0 }; /* max buffer */
+ char numstr[128] = {0}; /* max buffer */
if (cr->cpu_period != 0) {
int num = snprintf(numstr, sizeof(numstr), "%llu", (unsigned long long)(cr->cpu_period));
@@ -169,10 +172,56 @@ out:
return ret;
}
+static int update_resources_cpu_rt_period(struct lxc_container *c, const struct lcr_cgroup_resources *cr)
+{
+ int ret = 0;
+ char numstr[LCR_NUMSTRLEN64] = {0}; /* max buffer */
+
+ if (cr->cpurt_period != 0) {
+ int num = snprintf(numstr, sizeof(numstr), "%lld", (long long)(cr->cpurt_period));
+ if (num < 0 || (size_t)num >= sizeof(numstr)) {
+ ret = -1;
+ goto out;
+ }
+
+ if (!c->set_cgroup_item(c, CGROUP_CPU_RT_PERIOD, numstr)) {
+ REPORT_SET_CGROUP_ERROR(CGROUP_CPU_RT_PERIOD, numstr);
+ ret = -1;
+ goto out;
+ }
+ }
+
+out:
+ return ret;
+}
+
+static int update_resources_cpu_rt_runtime(struct lxc_container *c, const struct lcr_cgroup_resources *cr)
+{
+ int ret = 0;
+ char numstr[LCR_NUMSTRLEN64] = {0}; /* max buffer */
+
+ if (cr->cpurt_runtime != 0) {
+ int num = snprintf(numstr, sizeof(numstr), "%lld", (long long)(cr->cpurt_runtime));
+ if (num < 0 || (size_t)num >= sizeof(numstr)) {
+ ret = -1;
+ goto out;
+ }
+
+ if (!c->set_cgroup_item(c, CGROUP_CPU_RT_RUNTIME, numstr)) {
+ REPORT_SET_CGROUP_ERROR(CGROUP_CPU_RT_RUNTIME, numstr);
+ ret = -1;
+ goto out;
+ }
+ }
+
+out:
+ return ret;
+}
+
static int update_resources_cpu_quota(struct lxc_container *c, const struct lcr_cgroup_resources *cr)
{
int ret = 0;
- char numstr[128] = { 0 }; /* max buffer */
+ char numstr[128] = {0}; /* max buffer */
if (cr->cpu_quota != 0) {
int num = snprintf(numstr, sizeof(numstr), "%llu", (unsigned long long)(cr->cpu_quota));
@@ -216,6 +265,13 @@ static bool update_resources_cpu(struct lxc_container *c, const struct lcr_cgrou
goto err_out;
}
+ if (update_resources_cpu_rt_period(c, cr) != 0) {
+ goto err_out;
+ }
+ if (update_resources_cpu_rt_runtime(c, cr) != 0) {
+ goto err_out;
+ }
+
ret = true;
err_out:
return ret;
@@ -224,7 +280,7 @@ err_out:
static int update_resources_memory_limit(struct lxc_container *c, const struct lcr_cgroup_resources *cr)
{
int ret = 0;
- char numstr[128] = { 0 }; /* max buffer */
+ char numstr[128] = {0}; /* max buffer */
if (cr->memory_limit != 0) {
int num = snprintf(numstr, sizeof(numstr), "%llu", (unsigned long long)(cr->memory_limit));
@@ -247,7 +303,7 @@ out:
static int update_resources_memory_swap(struct lxc_container *c, const struct lcr_cgroup_resources *cr)
{
int ret = 0;
- char numstr[128] = { 0 }; /* max buffer */
+ char numstr[128] = {0}; /* max buffer */
if (cr->memory_swap != 0) {
int num = snprintf(numstr, sizeof(numstr), "%llu", (unsigned long long)(cr->memory_swap));
@@ -270,7 +326,7 @@ out:
static int update_resources_memory_reservation(struct lxc_container *c, const struct lcr_cgroup_resources *cr)
{
int ret = 0;
- char numstr[128] = { 0 }; /* max buffer */
+ char numstr[128] = {0}; /* max buffer */
if (cr->memory_reservation != 0) {
int num = snprintf(numstr, sizeof(numstr), "%llu", (unsigned long long)(cr->memory_reservation));
@@ -337,7 +393,7 @@ err_out:
static int update_resources_blkio_weight(struct lxc_container *c, const struct lcr_cgroup_resources *cr)
{
int ret = 0;
- char numstr[128] = { 0 }; /* max buffer */
+ char numstr[128] = {0}; /* max buffer */
if (cr->blkio_weight != 0) {
int num = snprintf(numstr, sizeof(numstr), "%llu", (unsigned long long)(cr->blkio_weight));
@@ -422,7 +478,7 @@ static inline bool is_blk_stat_total(const char *value)
static void stat_get_blk_stats(struct lxc_container *c, const char *item, struct blkio_stats *stats)
{
- char buf[BUFSIZE] = { 0 };
+ char buf[BUFSIZE] = {0};
int i = 0;
size_t len = 0;
char **lines = NULL;
@@ -464,7 +520,7 @@ err_out:
static uint64_t stat_match_get_ull(struct lxc_container *c, const char *item, const char *match, int column)
{
- char buf[BUFSIZE] = { 0 };
+ char buf[BUFSIZE] = {0};
int i = 0;
int j = 0;
int len = 0;
@@ -595,7 +651,7 @@ static void execute_lxc_attach(const char *name, const char *path, const struct
}
if (request->timeout != 0) {
- char timeout_str[LCR_NUMSTRLEN64] = { 0 };
+ char timeout_str[LCR_NUMSTRLEN64] = {0};
add_array_elem(params, args_len, &i, "--timeout");
int num = snprintf(timeout_str, LCR_NUMSTRLEN64, "%lld", (long long)request->timeout);
if (num < 0 || num >= LCR_NUMSTRLEN64) {
@@ -655,8 +711,8 @@ bool do_attach(const char *name, const char *path, const struct lcr_exec_request
bool ret = false;
pid_t pid = 0;
ssize_t size_read = 0;
- char buffer[BUFSIZ] = { 0 };
- int pipefd[2] = { -1, -1 };
+ char buffer[BUFSIZ] = {0};
+ int pipefd[2] = {-1, -1};
int status = 0;
if (pipe(pipefd) != 0) {
@@ -717,7 +773,7 @@ out:
void execute_lxc_start(const char *name, const char *path, const struct lcr_start_request *request)
{
// should check the size of params when add new params.
- char *params[PARAM_NUM] = { NULL };
+ char *params[PARAM_NUM] = {NULL};
size_t i = 0;
if (lcr_util_check_inherited(true, -1) != 0) {
@@ -746,7 +802,7 @@ void execute_lxc_start(const char *name, const char *path, const struct lcr_star
add_array_kv(params, PARAM_NUM, &i, "--exit-fifo", request->exit_fifo);
if (request->start_timeout != 0) {
- char start_timeout_str[LCR_NUMSTRLEN64] = { 0 };
+ char start_timeout_str[LCR_NUMSTRLEN64] = {0};
add_array_elem(params, PARAM_NUM, &i, "--start-timeout");
int num = snprintf(start_timeout_str, LCR_NUMSTRLEN64, "%u", request->start_timeout);
if (num < 0 || num >= LCR_NUMSTRLEN64) {
--
2.20.1