Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 83765
b: refs/heads/master
c: c7ba5c9
h: refs/heads/master
i:
  83763: 153803a
v: v3
  • Loading branch information
Pavel Emelianov authored and Linus Torvalds committed Feb 7, 2008
1 parent de60004 commit 023543d
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 5 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 0eea10301708c64a6b793894c156e21ddd15eb64
refs/heads/master: c7ba5c9e8176704bfac0729875fa62798037584d
1 change: 1 addition & 0 deletions trunk/include/linux/memcontrol.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ extern unsigned long mem_cgroup_isolate_pages(unsigned long nr_to_scan,
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)
{
Expand Down
1 change: 1 addition & 0 deletions trunk/mm/memcontrol.c
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,7 @@ int mem_cgroup_charge(struct page *page, struct mm_struct *mm)
}

css_put(&mem->css);
mem_cgroup_out_of_memory(mem, GFP_KERNEL);
goto free_pc;
}

Expand Down
43 changes: 39 additions & 4 deletions trunk/mm/oom_kill.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -63,6 +65,13 @@ unsigned long badness(struct task_struct *p, unsigned long uptime)
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.
*/
Expand Down Expand Up @@ -193,7 +202,8 @@ static inline enum oom_constraint constrained_alloc(struct zonelist *zonelist,
*
* (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;
Expand Down Expand Up @@ -247,7 +257,7 @@ static struct task_struct *select_bad_process(unsigned long *ppoints)
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;
Expand Down Expand Up @@ -368,6 +378,31 @@ static int oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order,
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)
Expand Down Expand Up @@ -484,7 +519,7 @@ void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order)
* 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;
Expand Down

0 comments on commit 023543d

Please sign in to comment.