From c40fc4dfb139a0449a3b4387664f0a5bb5c4cbb8 Mon Sep 17 00:00:00 2001 From: Petr Baudis Date: Fri, 16 Mar 2012 01:13:35 +0100 Subject: [PATCH] Add support for the memsw limits that limit memory+swap Can be disabled in common.h in case your kernel does not support it. --- cgroup.c | 28 ++++++++++++++++++++++++---- common.h | 4 ++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/cgroup.c b/cgroup.c index 6fe4bdb..882fa6a 100644 --- a/cgroup.c +++ b/cgroup.c @@ -7,6 +7,13 @@ #include #include "cgroup.h" +#include "common.h" + +#if SWAP_LIMIT +#define MEMSW ".memsw" +#else +#define MEMSW +#endif void (*cgroup_perror)(const char *s) = perror; static const char cgroupfs[] = "/sys/fs/cgroup/"; @@ -115,7 +122,7 @@ size_t cgroup_get_mem_limit(const char *chier, const char *cgroup) { char limitfile[PATH_MAX]; - snprintf(limitfile, sizeof(limitfile), "%s%s/%s/memory.limit_in_bytes", cgroupfs, chier, cgroup); + snprintf(limitfile, sizeof(limitfile), "%s%s/%s/memory"MEMSW".limit_in_bytes", cgroupfs, chier, cgroup); FILE *limit = fopen(limitfile, "r"); if (!limit) { cgroup_perror(limitfile); @@ -128,10 +135,10 @@ cgroup_get_mem_limit(const char *chier, const char *cgroup) } int -cgroup_set_mem_limit(const char *chier, const char *cgroup, size_t nlimit) +cgroup_set_mem_limit_do(const char *chier, const char *cgroup, size_t nlimit, char *memsw) { char limitfile[PATH_MAX]; - snprintf(limitfile, sizeof(limitfile), "%s%s/%s/memory.limit_in_bytes", cgroupfs, chier, cgroup); + snprintf(limitfile, sizeof(limitfile), "%s%s/%s/memory%s.limit_in_bytes", cgroupfs, chier, cgroup, memsw); FILE *limit = fopen(limitfile, "w"); if (!limit) { cgroup_perror(limitfile); @@ -142,11 +149,24 @@ cgroup_set_mem_limit(const char *chier, const char *cgroup, size_t nlimit) return 1; } +int +cgroup_set_mem_limit(const char *chier, const char *cgroup, size_t nlimit) +{ + /* We need to set both the "normal" and memsw limits, normal first, + * since normal <= memsw must hold. */ + int ret = cgroup_set_mem_limit_do(chier, cgroup, nlimit, ""); +#if SWAP_LIMIT + if (ret >= 0) + ret |= cgroup_set_mem_limit_do(chier, cgroup, nlimit, MEMSW); +#endif + return ret; +} + size_t cgroup_get_mem_usage(const char *chier, const char *cgroup) { char usagefile[PATH_MAX]; - snprintf(usagefile, sizeof(usagefile), "%s%s/%s/memory.usage_in_bytes", cgroupfs, chier, cgroup); + snprintf(usagefile, sizeof(usagefile), "%s%s/%s/memory"MEMSW".usage_in_bytes", cgroupfs, chier, cgroup); FILE *usage = fopen(usagefile, "r"); if (!usage) { cgroup_perror(usagefile); diff --git a/common.h b/common.h index 69d2047..402be1e 100644 --- a/common.h +++ b/common.h @@ -18,6 +18,10 @@ /* Default nice value for processes started using compctl --run. */ #define COMPNICE 12 +/* Comment out if swap memory resource accounting is disabled + * and only RAM memory should be limited. */ +#define SWAP_LIMIT 1 + /* Other common definitions. */ /* See README for the high-level protocol description. */ -- 2.11.4.GIT