|
@@ -44,48 +44,6 @@ int sysctl_oom_kill_allocating_task;
|
|
|
int sysctl_oom_dump_tasks = 1;
|
|
|
static DEFINE_SPINLOCK(zone_scan_lock);
|
|
|
|
|
|
-/*
|
|
|
- * compare_swap_oom_score_adj() - compare and swap current's oom_score_adj
|
|
|
- * @old_val: old oom_score_adj for compare
|
|
|
- * @new_val: new oom_score_adj for swap
|
|
|
- *
|
|
|
- * Sets the oom_score_adj value for current to @new_val iff its present value is
|
|
|
- * @old_val. Usually used to reinstate a previous value to prevent racing with
|
|
|
- * userspacing tuning the value in the interim.
|
|
|
- */
|
|
|
-void compare_swap_oom_score_adj(short old_val, short new_val)
|
|
|
-{
|
|
|
- struct sighand_struct *sighand = current->sighand;
|
|
|
-
|
|
|
- spin_lock_irq(&sighand->siglock);
|
|
|
- if (current->signal->oom_score_adj == old_val)
|
|
|
- current->signal->oom_score_adj = new_val;
|
|
|
- trace_oom_score_adj_update(current);
|
|
|
- spin_unlock_irq(&sighand->siglock);
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * test_set_oom_score_adj() - set current's oom_score_adj and return old value
|
|
|
- * @new_val: new oom_score_adj value
|
|
|
- *
|
|
|
- * Sets the oom_score_adj value for current to @new_val with proper
|
|
|
- * synchronization and returns the old value. Usually used to temporarily
|
|
|
- * set a value, save the old value in the caller, and then reinstate it later.
|
|
|
- */
|
|
|
-short test_set_oom_score_adj(short new_val)
|
|
|
-{
|
|
|
- struct sighand_struct *sighand = current->sighand;
|
|
|
- int old_val;
|
|
|
-
|
|
|
- spin_lock_irq(&sighand->siglock);
|
|
|
- old_val = current->signal->oom_score_adj;
|
|
|
- current->signal->oom_score_adj = new_val;
|
|
|
- trace_oom_score_adj_update(current);
|
|
|
- spin_unlock_irq(&sighand->siglock);
|
|
|
-
|
|
|
- return old_val;
|
|
|
-}
|
|
|
-
|
|
|
#ifdef CONFIG_NUMA
|
|
|
/**
|
|
|
* has_intersects_mems_allowed() - check task eligiblity for kill
|
|
@@ -310,6 +268,13 @@ enum oom_scan_t oom_scan_process_thread(struct task_struct *task,
|
|
|
if (!task->mm)
|
|
|
return OOM_SCAN_CONTINUE;
|
|
|
|
|
|
+ /*
|
|
|
+ * If task is allocating a lot of memory and has been marked to be
|
|
|
+ * killed first if it triggers an oom, then select it.
|
|
|
+ */
|
|
|
+ if (oom_task_origin(task))
|
|
|
+ return OOM_SCAN_SELECT;
|
|
|
+
|
|
|
if (task->flags & PF_EXITING && !force_kill) {
|
|
|
/*
|
|
|
* If this task is not being ptraced on exit, then wait for it
|