The patch titled Memory controller: OOM handling has been removed from the -mm tree. Its filename was memory-controller-oom-handling-v7.patch This patch was dropped because it was merged into mainline or a subsystem tree The current -mm tree may be found at http://userweb.kernel.org/~akpm/mmotm/ ------------------------------------------------------ Subject: Memory controller: OOM handling From: Pavel Emelianov <xemul@xxxxxxxxxx> Out of memory handling for cgroups over their limit. A task from the cgroup over limit is chosen using the existing OOM logic and killed. TODO: 1. As discussed in the OLS BOF session, consider implementing a user space policy for OOM handling. [akpm@xxxxxxxxxxxxxxxxxxxx: fix build due to oom-killer changes] 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> Cc: Vaidyanathan Srinivasan <svaidy@xxxxxxxxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- include/linux/memcontrol.h | 1 mm/memcontrol.c | 1 mm/oom_kill.c | 43 +++++++++++++++++++++++++++++++---- 3 files changed, 41 insertions(+), 4 deletions(-) diff -puN include/linux/memcontrol.h~memory-controller-oom-handling-v7 include/linux/memcontrol.h --- a/include/linux/memcontrol.h~memory-controller-oom-handling-v7 +++ a/include/linux/memcontrol.h @@ -39,6 +39,7 @@ extern unsigned long mem_cgroup_isolate_ int mode, struct zone *z, struct mem_cgroup *mem_cont, int active); +extern void mem_cgroup_out_of_memory(struct mem_cgroup *mem, gfp_t gfp_mask); static inline void mem_cgroup_uncharge_page(struct page *page) { diff -puN mm/memcontrol.c~memory-controller-oom-handling-v7 mm/memcontrol.c --- a/mm/memcontrol.c~memory-controller-oom-handling-v7 +++ a/mm/memcontrol.c @@ -329,6 +329,7 @@ retry: } css_put(&mem->css); + mem_cgroup_out_of_memory(mem, GFP_KERNEL); goto free_pc; } diff -puN mm/oom_kill.c~memory-controller-oom-handling-v7 mm/oom_kill.c --- a/mm/oom_kill.c~memory-controller-oom-handling-v7 +++ a/mm/oom_kill.c @@ -25,6 +25,7 @@ #include <linux/cpuset.h> #include <linux/module.h> #include <linux/notifier.h> +#include <linux/memcontrol.h> int sysctl_panic_on_oom; int sysctl_oom_kill_allocating_task; @@ -50,7 +51,8 @@ static DEFINE_SPINLOCK(zone_scan_mutex); * of least surprise ... (be careful when you change it) */ -unsigned long badness(struct task_struct *p, unsigned long uptime) +unsigned long badness(struct task_struct *p, unsigned long uptime, + struct mem_cgroup *mem) { unsigned long points, cpu_time, run_time, s; struct mm_struct *mm; @@ -63,6 +65,13 @@ unsigned long badness(struct task_struct return 0; } +#ifdef CONFIG_CGROUP_MEM_CONT + if (mem != NULL && mm->mem_cgroup != mem) { + task_unlock(p); + return 0; + } +#endif + /* * The memory size of the process is the basis for the badness. */ @@ -193,7 +202,8 @@ static inline enum oom_constraint constr * * (not docbooked, we don't want this one cluttering up the manual) */ -static struct task_struct *select_bad_process(unsigned long *ppoints) +static struct task_struct *select_bad_process(unsigned long *ppoints, + struct mem_cgroup *mem) { struct task_struct *g, *p; struct task_struct *chosen = NULL; @@ -247,7 +257,7 @@ static struct task_struct *select_bad_pr if (p->oomkilladj == OOM_DISABLE) continue; - points = badness(p, uptime.tv_sec); + points = badness(p, uptime.tv_sec, mem); if (points > *ppoints || !chosen) { chosen = p; *ppoints = points; @@ -368,6 +378,31 @@ static int oom_kill_process(struct task_ return oom_kill_task(p); } +#ifdef CONFIG_CGROUP_MEM_CONT +void mem_cgroup_out_of_memory(struct mem_cgroup *mem, gfp_t gfp_mask) +{ + unsigned long points = 0; + struct task_struct *p; + + cgroup_lock(); + rcu_read_lock(); +retry: + p = select_bad_process(&points, mem); + if (PTR_ERR(p) == -1UL) + goto out; + + if (!p) + p = current; + + if (oom_kill_process(p, gfp_mask, 0, points, + "Memory cgroup out of memory")) + goto retry; +out: + rcu_read_unlock(); + cgroup_unlock(); +} +#endif + static BLOCKING_NOTIFIER_HEAD(oom_notify_list); int register_oom_notifier(struct notifier_block *nb) @@ -484,7 +519,7 @@ retry: * Rambo mode: Shoot down a process and hope it solves whatever * issues we may have. */ - p = select_bad_process(&points); + p = select_bad_process(&points, NULL); if (PTR_ERR(p) == -1UL) goto out; _ Patches currently in -mm which might be from xemul@xxxxxxxxxx are origin.patch use-find_task_by_vpid-in-audit-code.patch ia64-fix-ptrace-inside-a-namespace.patch mips-use-find_task_by_vpid-in-system-calls.patch deprecate-find_task_by_pid-kgdb.patch add-the-namespaces-config-option.patch move-the-uts-namespace-under-uts_ns-option.patch move-the-ipc-namespace-under-ipc_ns-option.patch cleanup-the-code-managed-with-the-user_ns-option.patch cleanup-the-code-managed-with-the-user_ns-option-checkpatch-fixes.patch cleanup-the-code-managed-with-pid_ns-option.patch cleanup-the-code-managed-with-pid_ns-option-checkpatch-fixes.patch mark-net_ns-with-depends-on-namespaces.patch proc-seqfile-convert-proc_pid_status-to-properly-handle-pid-namespaces.patch proc-seqfile-convert-proc_pid_status-to-properly-handle-pid-namespaces-checkpatch-fixes.patch proc-seqfile-convert-proc_pid_status-to-properly-handle-pid-namespaces-nommu-fix.patch proc-proper-pidns-handling-for-proc-self.patch proc-fix-the-threaded-proc-self.patch ipc-uninline-some-code-from-utilh.patch ipc-make-struct-ipc_ids-static-in-ipc_namespace.patch ipc-consolidate-sem_exit_ns-msg_exit_ns-and-shm_exit_ns.patch sys_setpgid-simplify-pid-ns-interaction.patch fix-setsid-for-sub-namespace-sbin-init.patch teach-set_special_pids-to-use-struct-pid.patch move-daemonized-kernel-threads-into-the-swappers-session.patch start-the-global-sbin-init-with-00-special-pids.patch pid-sys_wait-fixes-v2.patch pid-extend-fix-pid_vnr.patch sys_getsid-dont-use-nsproxy-directly.patch pid-fix-mips-irix-emulation-pid-usage.patch pid-fix-mips-irix-emulation-pid-usage-fix.patch pid-fix-solaris_procids.patch uglify-kill_pid_info-to-fix-kill-vs-exec-race.patch uglify-while_each_pid_task-to-make-sure-we-dont-count-the-execing-pricess-twice.patch itimer_real-convert-to-use-struct-pid.patch pidns-make-full-use-of-xxx_vnr-calls.patch pidns-fix-badly-converted-mqueues-pid-handling.patch clean-up-the-kill_something_info.patch get-rid-of-the-kill_pgrp_info-function.patch use-find_task_by_vpid-in-posix-timers.patch use-find_task_by_vpid-in-taskstats.patch dont-operate-with-pid_t-in-rtmutex-tester.patch deprecate-find_task_by_pid.patch reiser4.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