linux/include
Rafael J. Wysocki 0c1eecfb34 Freezer: avoid freezing kernel threads prematurely
Kernel threads should not have TIF_FREEZE set when user space processes are
being frozen, since otherwise some of them might be frozen prematurely.
To prevent this from happening we can (1) make exit_mm() unset TIF_FREEZE
unconditionally just after clearing tsk->mm and (2) make try_to_freeze_tasks()
check if p->mm is different from zero and PF_BORROWED_MM is unset in p->flags
when user space processes are to be frozen.

Namely, when user space processes are being frozen, we only should set
TIF_FREEZE for tasks that have p->mm different from NULL and don't have
PF_BORROWED_MM set in p->flags.  For this reason task_lock() must be used to
prevent try_to_freeze_tasks() from racing with use_mm()/unuse_mm(), in which
p->mm and p->flags.PF_BORROWED_MM are changed under task_lock(p).  Also, we
need to prevent the following scenario from happening:

* daemonize() is called by a task spawned from a user space code path
* freezer checks if the task has p->mm set and the result is positive
* task enters exit_mm() and clears its TIF_FREEZE
* freezer sets TIF_FREEZE for the task
* task calls try_to_freeze() and goes to the refrigerator, which is wrong at
  that point

This requires us to acquire task_lock(p) before p->flags.PF_BORROWED_MM and
p->mm are examined and release it after TIF_FREEZE is set for p (or it turns
out that TIF_FREEZE should not be set).

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Cc: Gautham R Shenoy <ego@in.ibm.com>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: Nigel Cunningham <nigel@nigel.suspend2.net>
Cc: Oleg Nesterov <oleg@tv-sign.ru>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-07-19 10:04:42 -07:00
..
acpi Pull osi-now into release branch 2007-06-02 01:02:09 -04:00
asm-alpha alpha termios.h hadn't been updated 2007-07-17 11:01:07 -07:00
asm-arm fbdev: detect primary display device 2007-07-17 10:23:11 -07:00
asm-arm26 fbdev: detect primary display device 2007-07-17 10:23:11 -07:00
asm-avr32 [AVR32] Fix atomic_add_unless() and atomic_sub_unless() 2007-07-18 20:47:04 +02:00
asm-blackfin fbdev: detect primary display device 2007-07-17 10:23:11 -07:00
asm-cris fbdev: detect primary display device 2007-07-17 10:23:11 -07:00
asm-frv fbdev: detect primary display device 2007-07-17 10:23:11 -07:00
asm-generic saner typechecking in generic unaligned.h 2007-07-17 11:01:07 -07:00
asm-h8300 fbdev: detect primary display device 2007-07-17 10:23:11 -07:00
asm-i386 Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4 2007-07-18 10:32:00 -07:00
asm-ia64 Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6 2007-07-17 11:31:57 -07:00
asm-m32r fbdev: detect primary display device 2007-07-17 10:23:11 -07:00
asm-m68k fbdev: detect primary display device 2007-07-17 10:23:11 -07:00
asm-m68knommu fbdev: detect primary display device 2007-07-17 10:23:11 -07:00
asm-mips zs: move to the serial subsystem 2007-07-18 08:38:22 -07:00
asm-parisc fbdev: detect primary display device 2007-07-17 10:23:11 -07:00
asm-powerpc sys_fallocate() implementation on i386, x86_64 and powerpc 2007-07-17 21:42:44 -04:00
asm-ppc mm: remove ptep_test_and_clear_dirty and ptep_clear_flush_dirty 2007-07-17 10:22:59 -07:00
asm-s390 fbdev: detect primary display device 2007-07-17 10:23:11 -07:00
asm-sh fbdev: detect primary display device 2007-07-17 10:23:11 -07:00
asm-sh64 fbdev: detect primary display device 2007-07-17 10:23:11 -07:00
asm-sparc fbdev: detect primary display device 2007-07-17 10:23:11 -07:00
asm-sparc64 [SPARC]: Mark sparc and sparc64 as not having virt_to_bus 2007-07-18 01:20:22 -07:00
asm-um Add generic exit-time stack-depth checking to CONFIG_DEBUG_STACK_USAGE 2007-07-16 09:05:38 -07:00
asm-v850 fbdev: detect primary display device 2007-07-17 10:23:11 -07:00
asm-x86_64 sys_fallocate() implementation on i386, x86_64 and powerpc 2007-07-17 21:42:44 -04:00
asm-xtensa fbdev: detect primary display device 2007-07-17 10:23:11 -07:00
crypto
keys
linux Freezer: avoid freezing kernel threads prematurely 2007-07-19 10:04:42 -07:00
math-emu
media V4L/DVB (5835): saa7146/dvb-ttpci: Fix signedness warnings (gcc 4.1.1, kernel 2.6.22) 2007-07-18 14:24:44 -03:00
mtd UBI: kill homegrown endian macros 2007-07-18 16:53:49 +03:00
net [XFRM]: Fix crash introduced by struct dst_entry reordering 2007-07-18 01:55:52 -07:00
pcmcia PCMCIA-NETDEV : add new ID of lan&modem multifunction card 2007-07-08 22:16:39 -04:00
rdma IB/cm: Include HCA ACK delay in local ACK timeout 2007-07-10 21:50:05 -07:00
rxrpc
scsi [SCSI] Remove unused method scsi_device_cancel 2007-07-14 16:01:16 -05:00
sound [ALSA] version 1.0.14 2007-05-31 11:03:27 +02:00
video tgafb: actually allocate memory for the pseudo_palette 2007-07-17 10:23:12 -07:00
xen xen: Place vcpu_info structure into per-cpu memory 2007-07-18 08:47:45 -07:00
Kbuild