3e1d1d28d9
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: Christoph Lameter <christoph@lameter.com> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
40 lines
1.1 KiB
Text
40 lines
1.1 KiB
Text
KERNEL THREADS
|
|
|
|
|
|
Freezer
|
|
|
|
Upon entering a suspended state the system will freeze all
|
|
tasks. This is done by delivering pseudosignals. This affects
|
|
kernel threads, too. To successfully freeze a kernel thread
|
|
the thread has to check for the pseudosignal and enter the
|
|
refrigerator. Code to do this looks like this:
|
|
|
|
do {
|
|
hub_events();
|
|
wait_event_interruptible(khubd_wait, !list_empty(&hub_event_list));
|
|
try_to_freeze();
|
|
} while (!signal_pending(current));
|
|
|
|
from drivers/usb/core/hub.c::hub_thread()
|
|
|
|
|
|
The Unfreezable
|
|
|
|
Some kernel threads however, must not be frozen. The kernel must
|
|
be able to finish pending IO operations and later on be able to
|
|
write the memory image to disk. Kernel threads needed to do IO
|
|
must stay awake. Such threads must mark themselves unfreezable
|
|
like this:
|
|
|
|
/*
|
|
* This thread doesn't need any user-level access,
|
|
* so get rid of all our resources.
|
|
*/
|
|
daemonize("usb-storage");
|
|
|
|
current->flags |= PF_NOFREEZE;
|
|
|
|
from drivers/usb/storage/usb.c::usb_stor_control_thread()
|
|
|
|
Such drivers are themselves responsible for staying quiet during
|
|
the actual snapshotting.
|