The patch titled Memory controller: accounting setup has been added to the -mm tree. Its filename is memory-controller-accounting-setup-v7.patch *** Remember to use Documentation/SubmitChecklist when testing your code *** See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: Memory controller: accounting setup From: Pavel Emelianov <xemul@xxxxxxxxxx> Basic setup routines, the mm_struct has a pointer to the container that it belongs to and the the page has a page_container associated with it. Signed-off-by: Pavel Emelianov <xemul@xxxxxxxxxx> Signed-off-by: Balbir Singh <balbir@xxxxxxxxxxxxxxxxxx> Cc: Paul Menage <menage@xxxxxxxxxx> Cc: Peter Zijlstra <a.p.zijlstra@xxxxxxxxx> Cc: "Eric W. Biederman" <ebiederm@xxxxxxxxxxxx> Cc: Nick Piggin <nickpiggin@xxxxxxxxxxxx> Cc: Kirill Korotaev <dev@xxxxx> Cc: Herbert Poetzl <herbert@xxxxxxxxxxxx> Cc: David Rientjes <rientjes@xxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- include/linux/memcontrol.h | 36 ++++++++++++++++++++++ include/linux/mm_types.h | 6 +++ include/linux/sched.h | 1 kernel/fork.c | 11 ++++-- mm/memcontrol.c | 57 ++++++++++++++++++++++++++++++++--- 5 files changed, 104 insertions(+), 7 deletions(-) diff -puN include/linux/memcontrol.h~memory-controller-accounting-setup-v7 include/linux/memcontrol.h --- a/include/linux/memcontrol.h~memory-controller-accounting-setup-v7 +++ a/include/linux/memcontrol.h @@ -3,6 +3,9 @@ * Copyright IBM Corporation, 2007 * Author Balbir Singh <balbir@xxxxxxxxxxxxxxxxxx> * + * Copyright 2007 OpenVZ SWsoft Inc + * Author: Pavel Emelianov <xemul@xxxxxxxxxx> + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -17,5 +20,38 @@ #ifndef _LINUX_MEMCONTROL_H #define _LINUX_MEMCONTROL_H +struct mem_container; +struct page_container; + +#ifdef CONFIG_CONTAINER_MEM_CONT + +extern void mm_init_container(struct mm_struct *mm, struct task_struct *p); +extern void mm_free_container(struct mm_struct *mm); +extern void page_assign_page_container(struct page *page, + struct page_container *pc); +extern struct page_container *page_get_page_container(struct page *page); + +#else /* CONFIG_CONTAINER_MEM_CONT */ +static inline void mm_init_container(struct mm_struct *mm, + struct task_struct *p) +{ +} + +static inline void mm_free_container(struct mm_struct *mm) +{ +} + +static inline void page_assign_page_container(struct page *page, + struct page_container *pc) +{ +} + +static inline struct page_container *page_get_page_container(struct page *page) +{ + return NULL; +} + +#endif /* CONFIG_CONTAINER_MEM_CONT */ + #endif /* _LINUX_MEMCONTROL_H */ diff -puN include/linux/mm_types.h~memory-controller-accounting-setup-v7 include/linux/mm_types.h --- a/include/linux/mm_types.h~memory-controller-accounting-setup-v7 +++ a/include/linux/mm_types.h @@ -146,6 +146,9 @@ struct vm_area_struct { #ifdef CONFIG_NUMA struct mempolicy *vm_policy; /* NUMA policy for the VMA */ #endif +#ifdef CONFIG_CONTAINER_MEM_CONT + unsigned long page_container; +#endif }; struct mm_struct { @@ -214,6 +217,9 @@ struct mm_struct { /* aio bits */ rwlock_t ioctx_list_lock; struct kioctx *ioctx_list; +#ifdef CONFIG_CONTAINER_MEM_CONT + struct mem_container *mem_container; +#endif }; #endif /* _LINUX_MM_TYPES_H */ diff -puN include/linux/sched.h~memory-controller-accounting-setup-v7 include/linux/sched.h --- a/include/linux/sched.h~memory-controller-accounting-setup-v7 +++ a/include/linux/sched.h @@ -88,6 +88,7 @@ struct sched_param { #include <asm/processor.h> +struct mem_container; struct exec_domain; struct futex_pi_state; struct bio; diff -puN kernel/fork.c~memory-controller-accounting-setup-v7 kernel/fork.c --- a/kernel/fork.c~memory-controller-accounting-setup-v7 +++ a/kernel/fork.c @@ -51,6 +51,7 @@ #include <linux/random.h> #include <linux/tty.h> #include <linux/proc_fs.h> +#include <linux/memcontrol.h> #include <asm/pgtable.h> #include <asm/pgalloc.h> @@ -329,7 +330,7 @@ __cacheline_aligned_in_smp DEFINE_SPINLO #include <linux/init_task.h> -static struct mm_struct * mm_init(struct mm_struct * mm) +static struct mm_struct * mm_init(struct mm_struct * mm, struct task_struct *p) { atomic_set(&mm->mm_users, 1); atomic_set(&mm->mm_count, 1); @@ -346,11 +347,14 @@ static struct mm_struct * mm_init(struct mm->ioctx_list = NULL; mm->free_area_cache = TASK_UNMAPPED_BASE; mm->cached_hole_size = ~0UL; + mm_init_container(mm, p); if (likely(!mm_alloc_pgd(mm))) { mm->def_flags = 0; return mm; } + + mm_free_container(mm); free_mm(mm); return NULL; } @@ -365,7 +369,7 @@ struct mm_struct * mm_alloc(void) mm = allocate_mm(); if (mm) { memset(mm, 0, sizeof(*mm)); - mm = mm_init(mm); + mm = mm_init(mm, current); } return mm; } @@ -379,6 +383,7 @@ void fastcall __mmdrop(struct mm_struct { BUG_ON(mm == &init_mm); mm_free_pgd(mm); + mm_free_container(mm); destroy_context(mm); free_mm(mm); } @@ -499,7 +504,7 @@ static struct mm_struct *dup_mm(struct t mm->token_priority = 0; mm->last_interval = 0; - if (!mm_init(mm)) + if (!mm_init(mm, tsk)) goto fail_nomem; if (init_new_context(tsk, mm)) diff -puN mm/memcontrol.c~memory-controller-accounting-setup-v7 mm/memcontrol.c --- a/mm/memcontrol.c~memory-controller-accounting-setup-v7 +++ a/mm/memcontrol.c @@ -3,6 +3,9 @@ * Copyright IBM Corporation, 2007 * Author Balbir Singh <balbir@xxxxxxxxxxxxxxxxxx> * + * Copyright 2007 OpenVZ SWsoft Inc + * Author: Pavel Emelianov <xemul@xxxxxxxxxx> + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -17,6 +20,7 @@ #include <linux/res_counter.h> #include <linux/memcontrol.h> #include <linux/container.h> +#include <linux/mm.h> struct container_subsys mem_container_subsys; @@ -35,6 +39,13 @@ struct mem_container { * the counter to account for memory usage */ struct res_counter res; + /* + * Per container active and inactive list, similar to the + * per zone LRU lists. + * TODO: Consider making these lists per zone + */ + struct list_head active_list; + struct list_head inactive_list; }; /* @@ -56,6 +67,37 @@ struct mem_container *mem_container_from css); } +static inline +struct mem_container *mem_container_from_task(struct task_struct *p) +{ + return container_of(task_subsys_state(p, mem_container_subsys_id), + struct mem_container, css); +} + +void mm_init_container(struct mm_struct *mm, struct task_struct *p) +{ + struct mem_container *mem; + + mem = mem_container_from_task(p); + css_get(&mem->css); + mm->mem_container = mem; +} + +void mm_free_container(struct mm_struct *mm) +{ + css_put(&mm->mem_container->css); +} + +void page_assign_page_container(struct page *page, struct page_container *pc) +{ + page->page_container = (unsigned long)pc; +} + +struct page_container *page_get_page_container(struct page *page) +{ + return page->page_container; +} + static ssize_t mem_container_read(struct container *cont, struct cftype *cft, struct file *file, char __user *userbuf, size_t nbytes, loff_t *ppos) @@ -91,14 +133,21 @@ static struct cftype mem_container_files }, }; +static struct mem_container init_mem_container; + static struct container_subsys_state * mem_container_create(struct container_subsys *ss, struct container *cont) { struct mem_container *mem; - mem = kzalloc(sizeof(struct mem_container), GFP_KERNEL); - if (!mem) - return -ENOMEM; + if (unlikely((cont->parent) == NULL)) { + mem = &init_mem_container; + init_mm.mem_container = mem; + } else + mem = kzalloc(sizeof(struct mem_container), GFP_KERNEL); + + if (mem == NULL) + return NULL; res_counter_init(&mem->res); return &mem->css; @@ -123,5 +172,5 @@ struct container_subsys mem_container_su .create = mem_container_create, .destroy = mem_container_destroy, .populate = mem_container_populate, - .early_init = 0, + .early_init = 1, }; _ Patches currently in -mm which might be from xemul@xxxxxxxxxx are git-net.patch pid-namespaces-round-up-the-api.patch pid-namespaces-make-get_pid_ns-return-the-namespace-itself.patch pid-namespaces-dynamic-kmem-cache-allocator-for-pid-namespaces.patch pid-namespaces-dynamic-kmem-cache-allocator-for-pid-namespaces-fix.patch pid-namespaces-define-and-use-task_active_pid_ns-wrapper.patch pid-namespaces-rename-child_reaper-function.patch pid-namespaces-use-task_pid-to-find-leaders-pid.patch pid-namespaces-define-is_global_init-and-is_container_init.patch pid-namespaces-define-is_global_init-and-is_container_init-fix-capabilityc-to-work-with-threaded-init.patch pid-namespaces-define-is_global_init-and-is_container_init-versus-x86_64-mm-i386-show-unhandled-signals-v3.patch pid-namespaces-move-alloc_pid-to-copy_process.patch make-access-to-tasks-nsproxy-lighter.patch pid-namespaces-rework-forget_original_parent.patch pid-namespaces-move-exit_task_namespaces.patch pid-namespaces-introduce-ms_kernmount-flag.patch pid-namespaces-prepare-proc_flust_task-to-flush-entries-from-multiple-proc-trees.patch pid-namespaces-introduce-struct-upid.patch pid-namespaces-add-support-for-pid-namespaces-hierarchy.patch pid-namespaces-make-alloc_pid-free_pid-and-put_pid-work-with-struct-upid.patch pid-namespaces-helpers-to-obtain-pid-numbers.patch pid-namespaces-helpers-to-find-the-task-by-its-numerical-ids.patch pid-namespaces-helpers-to-find-the-task-by-its-numerical-ids-fix.patch pid-namespaces-move-alloc_pid-lower-in-copy_process.patch pid-namespaces-make-proc-have-multiple-superblocks-one-for-each-namespace.patch pid-namespaces-miscelaneous-preparations-for-pid-namespaces.patch pid-namespaces-allow-cloning-of-new-namespace.patch pid-namespaces-allow-cloning-of-new-namespace-fix-check-for-return-value-of-create_pid_namespace.patch pid-namespaces-make-proc_flush_task-actually-from-entries-from-multiple-namespaces.patch pid-namespaces-initialize-the-namespaces-proc_mnt.patch pid-namespaces-allow-signalling-container-init.patch pid-namespaces-destroy-pid-namespace-on-inits-death.patch pid-namespaces-changes-to-show-virtual-ids-to-user.patch pid-namespaces-changes-to-show-virtual-ids-to-user-fix-the-return-value-of-sys_set_tid_address.patch pid-namespaces-changes-to-show-virtual-ids-to-user-use-find_task_by_pid_ns-in-places-that-operate-with-virtual.patch pid-namespaces-changes-to-show-virtual-ids-to-user-use-find_task_by_pid_ns-in-places-that-operate-with-virtual-fix.patch pid-namespaces-changes-to-show-virtual-ids-to-user-use-find_task_by_pid_ns-in-places-that-operate-with-virtual-fix-2.patch pid-namespaces-changes-to-show-virtual-ids-to-user-use-find_task_by_pid_ns-in-places-that-operate-with-virtual-fix-3.patch pid-namespaces-changes-to-show-virtual-ids-to-user-sys_getsid-sys_getpgid-return-wrong-id-for-task-from-another.patch pid-namespaces-changes-to-show-virtual-ids-to-user-fix-the-sys_setpgrp-to-work-between-namespaces.patch pid-namespaces-changes-to-show-virtual-ids-to-user-fix.patch pid-namespaces-remove-the-struct-pid-unneeded-fields.patch isolate-some-explicit-usage-of-task-tgid.patch memory-controller-add-documentation.patch memory-controller-resource-counters-v7.patch memory-controller-containers-setup-v7.patch memory-controller-accounting-setup-v7.patch memory-controller-memory-accounting-v7.patch memory-controller-task-migration-v7.patch memory-controller-add-per-container-lru-and-reclaim-v7.patch memory-controller-oom-handling-v7.patch memory-controller-add-switch-to-control-what-type-of-pages-to-limit-v7.patch memory-controller-make-page_referenced-container-aware-v7.patch isolate-the-explicit-usage-of-signal-pgrp.patch use-helpers-to-obtain-task-pid-in-printks.patch remove-unused-variables-from-fs-proc-basec.patch reiser4-use-helpers-to-obtain-task-pid-in-printks.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html