|
@@ -419,7 +419,7 @@ bool oom_killer_disabled __read_mostly;
|
|
*/
|
|
*/
|
|
static struct task_struct *oom_reaper_th;
|
|
static struct task_struct *oom_reaper_th;
|
|
static DECLARE_WAIT_QUEUE_HEAD(oom_reaper_wait);
|
|
static DECLARE_WAIT_QUEUE_HEAD(oom_reaper_wait);
|
|
-static LIST_HEAD(oom_reaper_list);
|
|
|
|
|
|
+static struct task_struct *oom_reaper_list;
|
|
static DEFINE_SPINLOCK(oom_reaper_lock);
|
|
static DEFINE_SPINLOCK(oom_reaper_lock);
|
|
|
|
|
|
|
|
|
|
@@ -528,13 +528,11 @@ static int oom_reaper(void *unused)
|
|
while (true) {
|
|
while (true) {
|
|
struct task_struct *tsk = NULL;
|
|
struct task_struct *tsk = NULL;
|
|
|
|
|
|
- wait_event_freezable(oom_reaper_wait,
|
|
|
|
- (!list_empty(&oom_reaper_list)));
|
|
|
|
|
|
+ wait_event_freezable(oom_reaper_wait, oom_reaper_list != NULL);
|
|
spin_lock(&oom_reaper_lock);
|
|
spin_lock(&oom_reaper_lock);
|
|
- if (!list_empty(&oom_reaper_list)) {
|
|
|
|
- tsk = list_first_entry(&oom_reaper_list,
|
|
|
|
- struct task_struct, oom_reaper_list);
|
|
|
|
- list_del(&tsk->oom_reaper_list);
|
|
|
|
|
|
+ if (oom_reaper_list != NULL) {
|
|
|
|
+ tsk = oom_reaper_list;
|
|
|
|
+ oom_reaper_list = tsk->oom_reaper_list;
|
|
}
|
|
}
|
|
spin_unlock(&oom_reaper_lock);
|
|
spin_unlock(&oom_reaper_lock);
|
|
|
|
|
|
@@ -553,7 +551,8 @@ static void wake_oom_reaper(struct task_struct *tsk)
|
|
get_task_struct(tsk);
|
|
get_task_struct(tsk);
|
|
|
|
|
|
spin_lock(&oom_reaper_lock);
|
|
spin_lock(&oom_reaper_lock);
|
|
- list_add(&tsk->oom_reaper_list, &oom_reaper_list);
|
|
|
|
|
|
+ tsk->oom_reaper_list = oom_reaper_list;
|
|
|
|
+ oom_reaper_list = tsk;
|
|
spin_unlock(&oom_reaper_lock);
|
|
spin_unlock(&oom_reaper_lock);
|
|
wake_up(&oom_reaper_wait);
|
|
wake_up(&oom_reaper_wait);
|
|
}
|
|
}
|