From 5aded01acbe8fc11fdcf58bd13e721ea0f014df5 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Fri, 17 Jul 2009 14:15:47 +0200 Subject: [PATCH] --- yaml --- r: 155690 b: refs/heads/master c: 6301cb95c119ebf324bb96ee226fa9ddffad80a7 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/include/linux/sched.h | 3 ++- trunk/kernel/freezer.c | 7 +++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 3dab12af8548..bede82edcb9f 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a468d389349a7560249b355cdb6d2097ea1616c9 +refs/heads/master: 6301cb95c119ebf324bb96ee226fa9ddffad80a7 diff --git a/trunk/include/linux/sched.h b/trunk/include/linux/sched.h index 16a982e389fb..3ab08e4bb6b8 100644 --- a/trunk/include/linux/sched.h +++ b/trunk/include/linux/sched.h @@ -209,7 +209,7 @@ extern unsigned long long time_sync_thresh; ((task->state & (__TASK_STOPPED | __TASK_TRACED)) != 0) #define task_contributes_to_load(task) \ ((task->state & TASK_UNINTERRUPTIBLE) != 0 && \ - (task->flags & PF_FROZEN) == 0) + (task->flags & PF_FREEZING) == 0) #define __set_task_state(tsk, state_value) \ do { (tsk)->state = (state_value); } while (0) @@ -1680,6 +1680,7 @@ extern cputime_t task_gtime(struct task_struct *p); #define PF_MEMALLOC 0x00000800 /* Allocating memory */ #define PF_FLUSHER 0x00001000 /* responsible for disk writeback */ #define PF_USED_MATH 0x00002000 /* if unset the fpu must be initialized before use */ +#define PF_FREEZING 0x00004000 /* freeze in progress. do not account to load */ #define PF_NOFREEZE 0x00008000 /* this thread should not be frozen */ #define PF_FROZEN 0x00010000 /* frozen for system suspend */ #define PF_FSTRANS 0x00020000 /* inside a filesystem transaction */ diff --git a/trunk/kernel/freezer.c b/trunk/kernel/freezer.c index 2f4936cf7083..bd1d42b17cb2 100644 --- a/trunk/kernel/freezer.c +++ b/trunk/kernel/freezer.c @@ -44,12 +44,19 @@ void refrigerator(void) recalc_sigpending(); /* We sent fake signal, clean it up */ spin_unlock_irq(¤t->sighand->siglock); + /* prevent accounting of that task to load */ + current->flags |= PF_FREEZING; + for (;;) { set_current_state(TASK_UNINTERRUPTIBLE); if (!frozen(current)) break; schedule(); } + + /* Remove the accounting blocker */ + current->flags &= ~PF_FREEZING; + pr_debug("%s left refrigerator\n", current->comm); __set_current_state(save); }