aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorGlauber Costa <glommer@parallels.com>2011-12-21 20:02:27 -0500
committerDavid S. Miller <davem@davemloft.net>2011-12-22 22:37:18 -0500
commit65c64ce8ee642eb330a4c4d94b664725f2902b44 (patch)
treec4ad98c2a7f839f3b968fae6eddeec8b5752ce49 /mm
parent7d6c429b263c2f735f3df8c282cc77a8659e5d74 (diff)
Partial revert "Basic kernel memory functionality for the Memory Controller"
This reverts commit e5671dfae59b165e2adfd4dfbdeab11ac8db5bda. After a follow up discussion with Michal, it was agreed it would be better to leave the kmem controller with just the tcp files, deferring the behavior of the other general memory.kmem.* files for a later time, when more caches are controlled. This is because generic kmem files are not used by tcp accounting and it is not clear how other slab caches would fit into the scheme. We are reverting the original commit so we can track the reference. Part of the patch is kept, because it was used by the later tcp code. Conflicts are shown in the bottom. init/Kconfig is removed from the revert entirely. Signed-off-by: Glauber Costa <glommer@parallels.com> Acked-by: Michal Hocko <mhocko@suse.cz> CC: Kirill A. Shutemov <kirill@shutemov.name> CC: Paul Menage <paul@paulmenage.org> CC: Greg Thelen <gthelen@google.com> CC: Johannes Weiner <jweiner@redhat.com> CC: David S. Miller <davem@davemloft.net> Conflicts: Documentation/cgroups/memory.txt mm/memcontrol.c Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'mm')
-rw-r--r--mm/memcontrol.c93
1 files changed, 6 insertions, 87 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 7266202fa7cf..8cdc9156455c 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -229,10 +229,6 @@ struct mem_cgroup {
229 */ 229 */
230 struct res_counter memsw; 230 struct res_counter memsw;
231 /* 231 /*
232 * the counter to account for kmem usage.
233 */
234 struct res_counter kmem;
235 /*
236 * Per cgroup active and inactive list, similar to the 232 * Per cgroup active and inactive list, similar to the
237 * per zone LRU lists. 233 * per zone LRU lists.
238 */ 234 */
@@ -283,11 +279,6 @@ struct mem_cgroup {
283 */ 279 */
284 unsigned long move_charge_at_immigrate; 280 unsigned long move_charge_at_immigrate;
285 /* 281 /*
286 * Should kernel memory limits be stabilished independently
287 * from user memory ?
288 */
289 int kmem_independent_accounting;
290 /*
291 * percpu counter. 282 * percpu counter.
292 */ 283 */
293 struct mem_cgroup_stat_cpu *stat; 284 struct mem_cgroup_stat_cpu *stat;
@@ -359,14 +350,9 @@ enum charge_type {
359}; 350};
360 351
361/* for encoding cft->private value on file */ 352/* for encoding cft->private value on file */
362 353#define _MEM (0)
363enum mem_type { 354#define _MEMSWAP (1)
364 _MEM = 0, 355#define _OOM_TYPE (2)
365 _MEMSWAP,
366 _OOM_TYPE,
367 _KMEM,
368};
369
370#define MEMFILE_PRIVATE(x, val) (((x) << 16) | (val)) 356#define MEMFILE_PRIVATE(x, val) (((x) << 16) | (val))
371#define MEMFILE_TYPE(val) (((val) >> 16) & 0xffff) 357#define MEMFILE_TYPE(val) (((val) >> 16) & 0xffff)
372#define MEMFILE_ATTR(val) ((val) & 0xffff) 358#define MEMFILE_ATTR(val) ((val) & 0xffff)
@@ -3919,17 +3905,10 @@ static inline u64 mem_cgroup_usage(struct mem_cgroup *memcg, bool swap)
3919 u64 val; 3905 u64 val;
3920 3906
3921 if (!mem_cgroup_is_root(memcg)) { 3907 if (!mem_cgroup_is_root(memcg)) {
3922 val = 0;
3923#ifdef CONFIG_CGROUP_MEM_RES_CTLR_KMEM
3924 if (!memcg->kmem_independent_accounting)
3925 val = res_counter_read_u64(&memcg->kmem, RES_USAGE);
3926#endif
3927 if (!swap) 3908 if (!swap)
3928 val += res_counter_read_u64(&memcg->res, RES_USAGE); 3909 return res_counter_read_u64(&memcg->res, RES_USAGE);
3929 else 3910 else
3930 val += res_counter_read_u64(&memcg->memsw, RES_USAGE); 3911 return res_counter_read_u64(&memcg->memsw, RES_USAGE);
3931
3932 return val;
3933 } 3912 }
3934 3913
3935 val = mem_cgroup_recursive_stat(memcg, MEM_CGROUP_STAT_CACHE); 3914 val = mem_cgroup_recursive_stat(memcg, MEM_CGROUP_STAT_CACHE);
@@ -3962,11 +3941,6 @@ static u64 mem_cgroup_read(struct cgroup *cont, struct cftype *cft)
3962 else 3941 else
3963 val = res_counter_read_u64(&memcg->memsw, name); 3942 val = res_counter_read_u64(&memcg->memsw, name);
3964 break; 3943 break;
3965#ifdef CONFIG_CGROUP_MEM_RES_CTLR_KMEM
3966 case _KMEM:
3967 val = res_counter_read_u64(&memcg->kmem, name);
3968 break;
3969#endif
3970 default: 3944 default:
3971 BUG(); 3945 BUG();
3972 break; 3946 break;
@@ -4696,59 +4670,8 @@ static int mem_control_numa_stat_open(struct inode *unused, struct file *file)
4696#endif /* CONFIG_NUMA */ 4670#endif /* CONFIG_NUMA */
4697 4671
4698#ifdef CONFIG_CGROUP_MEM_RES_CTLR_KMEM 4672#ifdef CONFIG_CGROUP_MEM_RES_CTLR_KMEM
4699static u64 kmem_limit_independent_read(struct cgroup *cgroup, struct cftype *cft)
4700{
4701 return mem_cgroup_from_cont(cgroup)->kmem_independent_accounting;
4702}
4703
4704static int kmem_limit_independent_write(struct cgroup *cgroup, struct cftype *cft,
4705 u64 val)
4706{
4707 struct mem_cgroup *memcg = mem_cgroup_from_cont(cgroup);
4708 struct mem_cgroup *parent = parent_mem_cgroup(memcg);
4709
4710 val = !!val;
4711
4712 /*
4713 * This follows the same hierarchy restrictions than
4714 * mem_cgroup_hierarchy_write()
4715 */
4716 if (!parent || !parent->use_hierarchy) {
4717 if (list_empty(&cgroup->children))
4718 memcg->kmem_independent_accounting = val;
4719 else
4720 return -EBUSY;
4721 }
4722 else
4723 return -EINVAL;
4724
4725 return 0;
4726}
4727static struct cftype kmem_cgroup_files[] = {
4728 {
4729 .name = "independent_kmem_limit",
4730 .read_u64 = kmem_limit_independent_read,
4731 .write_u64 = kmem_limit_independent_write,
4732 },
4733 {
4734 .name = "kmem.usage_in_bytes",
4735 .private = MEMFILE_PRIVATE(_KMEM, RES_USAGE),
4736 .read_u64 = mem_cgroup_read,
4737 },
4738 {
4739 .name = "kmem.limit_in_bytes",
4740 .private = MEMFILE_PRIVATE(_KMEM, RES_LIMIT),
4741 .read_u64 = mem_cgroup_read,
4742 },
4743};
4744
4745static int register_kmem_files(struct cgroup *cont, struct cgroup_subsys *ss) 4673static int register_kmem_files(struct cgroup *cont, struct cgroup_subsys *ss)
4746{ 4674{
4747 int ret = 0;
4748
4749 ret = cgroup_add_files(cont, ss, kmem_cgroup_files,
4750 ARRAY_SIZE(kmem_cgroup_files));
4751
4752 /* 4675 /*
4753 * Part of this would be better living in a separate allocation 4676 * Part of this would be better living in a separate allocation
4754 * function, leaving us with just the cgroup tree population work. 4677 * function, leaving us with just the cgroup tree population work.
@@ -4756,9 +4679,7 @@ static int register_kmem_files(struct cgroup *cont, struct cgroup_subsys *ss)
4756 * is only initialized after cgroup creation. I found the less 4679 * is only initialized after cgroup creation. I found the less
4757 * cumbersome way to deal with it to defer it all to populate time 4680 * cumbersome way to deal with it to defer it all to populate time
4758 */ 4681 */
4759 if (!ret) 4682 return mem_cgroup_sockets_init(cont, ss);
4760 ret = mem_cgroup_sockets_init(cont, ss);
4761 return ret;
4762}; 4683};
4763 4684
4764static void kmem_cgroup_destroy(struct cgroup_subsys *ss, 4685static void kmem_cgroup_destroy(struct cgroup_subsys *ss,
@@ -5092,7 +5013,6 @@ mem_cgroup_create(struct cgroup_subsys *ss, struct cgroup *cont)
5092 if (parent && parent->use_hierarchy) { 5013 if (parent && parent->use_hierarchy) {
5093 res_counter_init(&memcg->res, &parent->res); 5014 res_counter_init(&memcg->res, &parent->res);
5094 res_counter_init(&memcg->memsw, &parent->memsw); 5015 res_counter_init(&memcg->memsw, &parent->memsw);
5095 res_counter_init(&memcg->kmem, &parent->kmem);
5096 /* 5016 /*
5097 * We increment refcnt of the parent to ensure that we can 5017 * We increment refcnt of the parent to ensure that we can
5098 * safely access it on res_counter_charge/uncharge. 5018 * safely access it on res_counter_charge/uncharge.
@@ -5103,7 +5023,6 @@ mem_cgroup_create(struct cgroup_subsys *ss, struct cgroup *cont)
5103 } else { 5023 } else {
5104 res_counter_init(&memcg->res, NULL); 5024 res_counter_init(&memcg->res, NULL);
5105 res_counter_init(&memcg->memsw, NULL); 5025 res_counter_init(&memcg->memsw, NULL);
5106 res_counter_init(&memcg->kmem, NULL);
5107 } 5026 }
5108 memcg->last_scanned_child = 0; 5027 memcg->last_scanned_child = 0;
5109 memcg->last_scanned_node = MAX_NUMNODES; 5028 memcg->last_scanned_node = MAX_NUMNODES;