diff --git a/mm/memcontrol.c b/mm/memcontrol.c index daa104384e10c720b3ffb4481e8231c5a7b13fbb..d02e9166255fbe78393138b98d53d3e4d799f0fe 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -1202,6 +1202,7 @@ int mem_cgroup_scan_tasks(struct mem_cgroup *memcg, { struct mem_cgroup *iter; int ret = 0; + int i = 0; BUG_ON(memcg == root_mem_cgroup); @@ -1210,8 +1211,12 @@ int mem_cgroup_scan_tasks(struct mem_cgroup *memcg, struct task_struct *task; css_task_iter_start(&iter->css, CSS_TASK_ITER_PROCS, &it); - while (!ret && (task = css_task_iter_next(&it))) + while (!ret && (task = css_task_iter_next(&it))) { + /* Avoid potential softlockup warning */ + if ((++i & 1023) == 0) + cond_resched(); ret = fn(task, arg); + } css_task_iter_end(&it); if (ret) { mem_cgroup_iter_break(memcg, iter); diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 9d595265bbf5abdcb2884185c6eeeab464b4be84..fe5f4f20c5c88901d6db4059b00704bc0800362c 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -43,6 +43,7 @@ #include #include #include +#include #include #include "internal.h" @@ -479,10 +480,15 @@ static void dump_tasks(struct oom_control *oc) memcg_print_bad_task(oc); } else { struct task_struct *p; + int i = 0; rcu_read_lock(); - for_each_process(p) + for_each_process(p) { + /* Avoid potential softlockup warning */ + if ((++i & 1023) == 0) + touch_softlockup_watchdog(); dump_task(p, oc); + } rcu_read_unlock(); } }