mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-08-14 04:56:31 +00:00
Merge pull request #486 from dikei/master
Sort the cgroup memory settings before applying.
This commit is contained in:
commit
e7831129a2
@ -1886,14 +1886,19 @@ static int do_cgroup_set(const char *cgroup_path, const char *sub_filename,
|
||||
static int do_setup_cgroup_limits(struct cgfs_data *d,
|
||||
struct lxc_list *cgroup_settings, bool do_devices)
|
||||
{
|
||||
struct lxc_list *iterator;
|
||||
struct lxc_list *iterator, *sorted_cgroup_settings, *next;
|
||||
struct lxc_cgroup *cg;
|
||||
int ret = -1;
|
||||
|
||||
if (lxc_list_empty(cgroup_settings))
|
||||
return 0;
|
||||
|
||||
lxc_list_for_each(iterator, cgroup_settings) {
|
||||
sorted_cgroup_settings = sort_cgroup_settings(cgroup_settings);
|
||||
if (!sorted_cgroup_settings) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
lxc_list_for_each(iterator, sorted_cgroup_settings) {
|
||||
cg = iterator->elem;
|
||||
|
||||
if (do_devices == !strncmp("devices", cg->subsystem, 7)) {
|
||||
@ -1916,6 +1921,11 @@ static int do_setup_cgroup_limits(struct cgfs_data *d,
|
||||
ret = 0;
|
||||
INFO("cgroup has been setup");
|
||||
out:
|
||||
lxc_list_for_each_safe(iterator, sorted_cgroup_settings, next) {
|
||||
lxc_list_del(iterator);
|
||||
free(iterator);
|
||||
}
|
||||
free(sorted_cgroup_settings);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1218,7 +1218,7 @@ static bool cgm_unfreeze(void *hdata)
|
||||
static bool cgm_setup_limits(void *hdata, struct lxc_list *cgroup_settings, bool do_devices)
|
||||
{
|
||||
struct cgm_data *d = hdata;
|
||||
struct lxc_list *iterator;
|
||||
struct lxc_list *iterator, *sorted_cgroup_settings, *next;
|
||||
struct lxc_cgroup *cg;
|
||||
bool ret = false;
|
||||
|
||||
@ -1233,7 +1233,12 @@ static bool cgm_setup_limits(void *hdata, struct lxc_list *cgroup_settings, bool
|
||||
return false;
|
||||
}
|
||||
|
||||
lxc_list_for_each(iterator, cgroup_settings) {
|
||||
sorted_cgroup_settings = sort_cgroup_settings(cgroup_settings);
|
||||
if (!sorted_cgroup_settings) {
|
||||
return false;
|
||||
}
|
||||
|
||||
lxc_list_for_each(iterator, sorted_cgroup_settings) {
|
||||
char controller[100], *p;
|
||||
cg = iterator->elem;
|
||||
if (do_devices != !strncmp("devices", cg->subsystem, 7))
|
||||
@ -1261,6 +1266,11 @@ static bool cgm_setup_limits(void *hdata, struct lxc_list *cgroup_settings, bool
|
||||
ret = true;
|
||||
INFO("cgroup limits have been setup");
|
||||
out:
|
||||
lxc_list_for_each_safe(iterator, sorted_cgroup_settings, next) {
|
||||
lxc_list_del(iterator);
|
||||
free(iterator);
|
||||
}
|
||||
free(sorted_cgroup_settings);
|
||||
cgm_dbus_disconnect();
|
||||
return ret;
|
||||
}
|
||||
|
@ -4563,3 +4563,46 @@ void suggest_default_idmap(void)
|
||||
free(gname);
|
||||
free(uname);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the list of cgroup_settings sorted according to the following rules
|
||||
* 1. Put memory.limit_in_bytes before memory.memsw.limit_in_bytes
|
||||
*/
|
||||
struct lxc_list *sort_cgroup_settings(struct lxc_list* cgroup_settings)
|
||||
{
|
||||
struct lxc_list *result;
|
||||
struct lxc_list *memsw_limit = NULL;
|
||||
struct lxc_list *it = NULL;
|
||||
struct lxc_cgroup *cg = NULL;
|
||||
struct lxc_list *item = NULL;
|
||||
|
||||
result = malloc(sizeof(*result));
|
||||
if (!result) {
|
||||
ERROR("failed to allocate memory to sort cgroup settings");
|
||||
return NULL;
|
||||
}
|
||||
lxc_list_init(result);
|
||||
|
||||
/*Iterate over the cgroup settings and copy them to the output list*/
|
||||
lxc_list_for_each(it, cgroup_settings) {
|
||||
item = malloc(sizeof(*item));
|
||||
if (!item) {
|
||||
ERROR("failed to allocate memory to sort cgroup settings");
|
||||
return NULL;
|
||||
}
|
||||
item->elem = it->elem;
|
||||
cg = it->elem;
|
||||
if (strcmp(cg->subsystem, "memory.memsw.limit_in_bytes") == 0) {
|
||||
/* Store the memsw_limit location */
|
||||
memsw_limit = item;
|
||||
} else if (strcmp(cg->subsystem, "memory.limit_in_bytes") == 0 && memsw_limit != NULL) {
|
||||
/* lxc.cgroup.memory.memsw.limit_in_bytes is found before
|
||||
* lxc.cgroup.memory.limit_in_bytes, swap these two items */
|
||||
item->elem = memsw_limit->elem;
|
||||
memsw_limit->elem = it->elem;
|
||||
}
|
||||
lxc_list_add_tail(result, item);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
@ -431,4 +431,5 @@ extern void tmp_proc_unmount(struct lxc_conf *lxc_conf);
|
||||
void remount_all_slave(void);
|
||||
extern void suggest_default_idmap(void);
|
||||
FILE *write_mount_file(struct lxc_list *mount);
|
||||
struct lxc_list *sort_cgroup_settings(struct lxc_list* cgroup_settings);
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user