|
@@ -38,6 +38,33 @@ int sysctl_oom_kill_allocating_task;
|
|
|
int sysctl_oom_dump_tasks = 1;
|
|
|
static DEFINE_SPINLOCK(zone_scan_lock);
|
|
|
|
|
|
+/**
|
|
|
+ * 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.
|
|
|
+ */
|
|
|
+int test_set_oom_score_adj(int new_val)
|
|
|
+{
|
|
|
+ struct sighand_struct *sighand = current->sighand;
|
|
|
+ int old_val;
|
|
|
+
|
|
|
+ spin_lock_irq(&sighand->siglock);
|
|
|
+ old_val = current->signal->oom_score_adj;
|
|
|
+ if (new_val != old_val) {
|
|
|
+ if (new_val == OOM_SCORE_ADJ_MIN)
|
|
|
+ atomic_inc(¤t->mm->oom_disable_count);
|
|
|
+ else if (old_val == OOM_SCORE_ADJ_MIN)
|
|
|
+ atomic_dec(¤t->mm->oom_disable_count);
|
|
|
+ current->signal->oom_score_adj = new_val;
|
|
|
+ }
|
|
|
+ spin_unlock_irq(&sighand->siglock);
|
|
|
+
|
|
|
+ return old_val;
|
|
|
+}
|
|
|
+
|
|
|
#ifdef CONFIG_NUMA
|
|
|
/**
|
|
|
* has_intersects_mems_allowed() - check task eligiblity for kill
|
|
@@ -154,15 +181,6 @@ unsigned int oom_badness(struct task_struct *p, struct mem_cgroup *mem,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- /*
|
|
|
- * When the PF_OOM_ORIGIN bit is set, it indicates the task should have
|
|
|
- * priority for oom killing.
|
|
|
- */
|
|
|
- if (p->flags & PF_OOM_ORIGIN) {
|
|
|
- task_unlock(p);
|
|
|
- return 1000;
|
|
|
- }
|
|
|
-
|
|
|
/*
|
|
|
* The memory controller may have a limit of 0 bytes, so avoid a divide
|
|
|
* by zero, if necessary.
|