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

Commit 3e1d1d28 authored by Christoph Lameter's avatar Christoph Lameter Committed by Linus Torvalds
Browse files

[PATCH] Cleanup patch for process freezing



1. Establish a simple API for process freezing defined in linux/include/sched.h:

   frozen(process)		Check for frozen process
   freezing(process)		Check if a process is being frozen
   freeze(process)		Tell a process to freeze (go to refrigerator)
   thaw_process(process)	Restart process
   frozen_process(process)	Process is frozen now

2. Remove all references to PF_FREEZE and PF_FROZEN from all
   kernel sources except sched.h

3. Fix numerous locations where try_to_freeze is manually done by a driver

4. Remove the argument that is no longer necessary from two function calls.

5. Some whitespace cleanup

6. Clear potential race in refrigerator (provides an open window of PF_FREEZE
   cleared before setting PF_FROZEN, recalc_sigpending does not check
   PF_FROZEN).

This patch does not address the problem of freeze_processes() violating the rule
that a task may only modify its own flags by setting PF_FREEZE. This is not clean
in an SMP environment. freeze(process) is therefore not SMP safe!

Signed-off-by: default avatarChristoph Lameter <christoph@lameter.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent b3e112bc
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -12,8 +12,7 @@ refrigerator. Code to do this looks like this:
	do {
		hub_events();
		wait_event_interruptible(khubd_wait, !list_empty(&hub_event_list));
		if (current->flags & PF_FREEZE)
			refrigerator(PF_FREEZE);
		try_to_freeze();
	} while (!signal_pending(current));

from drivers/usb/core/hub.c::hub_thread()
+1 −2
Original line number Diff line number Diff line
@@ -164,8 +164,7 @@ place where the thread is safe to be frozen (no kernel semaphores
should be held at that point and it must be safe to sleep there), and
add:

            if (current->flags & PF_FREEZE)
                    refrigerator(PF_FREEZE);
            try_to_freeze();

If the thread is needed for writing the image to storage, you should
instead set the PF_NOFREEZE process flag when creating the thread.
+1 −3
Original line number Diff line number Diff line
@@ -536,10 +536,8 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset)
	if (!user_mode(regs))
		return 1;

	if (current->flags & PF_FREEZE) {
		refrigerator(0);
	if (try_to_freeze())
		goto no_signal;
	}

	if (!oldset)
		oldset = &current->blocked;
+1 −3
Original line number Diff line number Diff line
@@ -517,10 +517,8 @@ asmlinkage int do_signal(struct pt_regs *regs, sigset_t *oldset)
	if ((regs->ccr & 0x10))
		return 1;

	if (current->flags & PF_FREEZE) {
		refrigerator(0);
	if (try_to_freeze())
		goto no_signal;
	}

	current->thread.esp0 = (unsigned long) regs;

+1 −1
Original line number Diff line number Diff line
@@ -573,7 +573,7 @@ static int balanced_irq(void *unused)
	for ( ; ; ) {
		set_current_state(TASK_INTERRUPTIBLE);
		time_remaining = schedule_timeout(time_remaining);
		try_to_freeze(PF_FREEZE);
		try_to_freeze();
		if (time_after(jiffies,
				prev_balance_time+balanced_irq_interval)) {
			do_irq_balance();
Loading