Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aa9e75a9 authored by Patrick Daly's avatar Patrick Daly
Browse files

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: default avatarPatrick Daly <pdaly@codeaurora.org>
parent 1d45792c
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -115,6 +115,18 @@ extern struct task_struct *find_lock_task_mm(struct task_struct *p);

extern void dump_tasks(struct mem_cgroup *memcg,
		       const nodemask_t *nodemask);

#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;
+3 −1
Original line number Diff line number Diff line
@@ -1370,8 +1370,10 @@ int group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p,

	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;
+9 −0
Original line number Diff line number Diff line
@@ -803,6 +803,15 @@ config SPECULATIVE_PAGE_FAULT
	 allocating, it is failing its processing and a classic page fault
	 is then tried.

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"
	default n
+22 −0
Original line number Diff line number Diff line
@@ -66,6 +66,28 @@ int sysctl_reap_mem_on_sigkill;
 */
DEFINE_MUTEX(oom_lock);

/*
 * 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
/**
 * has_intersects_mems_allowed() - check task eligiblity for kill
+3 −0
Original line number Diff line number Diff line
@@ -4365,6 +4365,9 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
	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;