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

Commit a9b6f562 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki Committed by Linus Torvalds
Browse files

[PATCH] swsusp: Untangle thaw_processes



Move the loop from thaw_processes() to a separate function and call it
independently for kernel threads and user space processes so that the order
of thawing tasks is clearly visible.

Drop thaw_kernel_threads() which is never used.

Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: Nigel Cunningham <nigel@suspend2.net>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent a6d70980
Loading
Loading
Loading
Loading
+1 −5
Original line number Diff line number Diff line
/* Freezer declarations */

#define FREEZER_KERNEL_THREADS 0
#define FREEZER_ALL_THREADS 1

#ifdef CONFIG_PM
/*
 * Check if a process has been frozen
@@ -60,8 +57,7 @@ static inline void frozen_process(struct task_struct *p)

extern void refrigerator(void);
extern int freeze_processes(void);
#define thaw_processes() do { thaw_some_processes(FREEZER_ALL_THREADS); } while(0)
#define thaw_kernel_threads() do { thaw_some_processes(FREEZER_KERNEL_THREADS); } while(0)
extern void thaw_processes(void);

static inline int try_to_freeze(void)
{
+27 −22
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@
 */
#define TIMEOUT	(20 * HZ)

#define FREEZER_KERNEL_THREADS 0
#define FREEZER_USER_SPACE 1

static inline int freezeable(struct task_struct * p)
{
@@ -79,6 +81,11 @@ static void cancel_freezing(struct task_struct *p)
	}
}

static inline int is_user_space(struct task_struct *p)
{
	return p->mm && !(p->flags & PF_BORROWED_MM);
}

/* 0 = success, else # of processes that we failed to stop */
int freeze_processes(void)
{
@@ -103,10 +110,9 @@ int freeze_processes(void)
				cancel_freezing(p);
				continue;
			}
			if (p->mm && !(p->flags & PF_BORROWED_MM)) {
				/* The task is a user-space one.
				 * Freeze it unless there's a vfork completion
				 * pending
			if (is_user_space(p)) {
				/* Freeze the task unless there is a vfork
				 * completion pending
				 */
				if (!p->vfork_done)
					freeze_process(p);
@@ -155,31 +161,30 @@ int freeze_processes(void)
	return 0;
}

void thaw_some_processes(int all)
static void thaw_tasks(int thaw_user_space)
{
	struct task_struct *g, *p;
	int pass = 0; /* Pass 0 = Kernel space, 1 = Userspace */

	printk("Restarting tasks... ");
	read_lock(&tasklist_lock);
	do {
	do_each_thread(g, p) {
			/*
			 * is_user = 0 if kernel thread or borrowed mm,
			 * 1 otherwise.
			 */
			int is_user = !!(p->mm && !(p->flags & PF_BORROWED_MM));
			if (!freezeable(p) || (is_user != pass))
		if (!freezeable(p))
			continue;
			if (!thaw_process(p))
				printk(KERN_INFO
					"Strange, %s not stopped\n", p->comm);
		} while_each_thread(g, p);

		pass++;
	} while (pass < 2 && all);
		if (is_user_space(p) == !thaw_user_space)
			continue;

		if (!thaw_process(p))
			printk(KERN_WARNING " Strange, %s not stopped\n",
				p->comm );
	} while_each_thread(g, p);
	read_unlock(&tasklist_lock);
}

void thaw_processes(void)
{
	printk("Restarting tasks ... ");
	thaw_tasks(FREEZER_KERNEL_THREADS);
	thaw_tasks(FREEZER_USER_SPACE);
	schedule();
	printk("done.\n");
}