mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-13 08:07:32 -04:00
mm: oom-kill: Add lmk_kill possible for ULMK
While ULMK is active, prevent OOM for order <= COSTLY_ORDER pages. No special actions are taken for larger orders. Change-Id: I4ccba1b71155947569acc3d88ae2027e3b2e0620 Signed-off-by: Patrick Daly <pdaly@codeaurora.org> Signed-off-by: Chris Goldsworthy <cgoldswo@codeaurora.org>
This commit is contained in:
parent
c5d20367bc
commit
de77105488
5 changed files with 50 additions and 1 deletions
|
|
@ -122,6 +122,17 @@ extern void oom_killer_enable(void);
|
|||
|
||||
extern struct task_struct *find_lock_task_mm(struct task_struct *p);
|
||||
|
||||
#ifdef CONFIG_HAVE_USERSPACE_LOW_MEMORY_KILLER
|
||||
extern bool should_ulmk_retry(void);
|
||||
extern void ulmk_update_last_kill(void);
|
||||
#else
|
||||
static inline bool should_ulmk_retry(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
static inline void ulmk_update_last_kill(void) {}
|
||||
#endif
|
||||
|
||||
/* sysctls */
|
||||
extern int sysctl_oom_dump_tasks;
|
||||
extern int sysctl_oom_kill_allocating_task;
|
||||
|
|
|
|||
|
|
@ -1407,8 +1407,10 @@ int group_send_sig_info(int sig, struct kernel_siginfo *info,
|
|||
|
||||
if (!ret && sig) {
|
||||
ret = do_send_sig_info(sig, info, p, type);
|
||||
if (capable(CAP_KILL) && sig == SIGKILL)
|
||||
if (capable(CAP_KILL) && sig == SIGKILL) {
|
||||
add_to_oom_reaper(p);
|
||||
ulmk_update_last_kill();
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
|
|||
11
mm/Kconfig
11
mm/Kconfig
|
|
@ -759,6 +759,17 @@ config PERCPU_STATS
|
|||
information includes global and per chunk statistics, which can
|
||||
be used to help understand percpu memory usage.
|
||||
|
||||
|
||||
config HAVE_USERSPACE_LOW_MEMORY_KILLER
|
||||
bool "Have userspace low memory killer"
|
||||
default n
|
||||
help
|
||||
The page allocator cannot directly call into a
|
||||
userspace low memory killer as it can call into the OOM killer.
|
||||
Therefore, add a timeout mechanism to give the userspace
|
||||
low memory killer a chance to run.
|
||||
|
||||
|
||||
config GUP_BENCHMARK
|
||||
bool "Enable infrastructure for get_user_pages_fast() benchmarking"
|
||||
help
|
||||
|
|
|
|||
|
|
@ -72,6 +72,28 @@ static inline bool is_memcg_oom(struct oom_control *oc)
|
|||
return oc->memcg != NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* If ULMK has killed a process recently,
|
||||
* we are making progress.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_HAVE_USERSPACE_LOW_MEMORY_KILLER
|
||||
static atomic64_t ulmk_kill_jiffies = ATOMIC64_INIT(INITIAL_JIFFIES);
|
||||
|
||||
|
||||
bool should_ulmk_retry(void)
|
||||
{
|
||||
unsigned long j = atomic64_read(&ulmk_kill_jiffies);
|
||||
|
||||
return time_before(jiffies, j + 2 * HZ);
|
||||
}
|
||||
|
||||
void ulmk_update_last_kill(void)
|
||||
{
|
||||
atomic64_set(&ulmk_kill_jiffies, jiffies);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
/**
|
||||
* oom_cpuset_eligible() - check task eligiblity for kill
|
||||
|
|
|
|||
|
|
@ -4680,6 +4680,9 @@ retry:
|
|||
if (costly_order && !(gfp_mask & __GFP_RETRY_MAYFAIL))
|
||||
goto nopage;
|
||||
|
||||
if (order <= PAGE_ALLOC_COSTLY_ORDER && should_ulmk_retry())
|
||||
goto retry;
|
||||
|
||||
if (should_reclaim_retry(gfp_mask, order, ac, alloc_flags,
|
||||
did_some_progress > 0, &no_progress_loops))
|
||||
goto retry;
|
||||
|
|
|
|||
Loading…
Reference in a new issue