linux/include/asm-sh
Rafael J. Wysocki 8a102eed9c [PATCH] PM: Fix SMP races in the freezer
Currently, to tell a task that it should go to the refrigerator, we set the
PF_FREEZE flag for it and send a fake signal to it.  Unfortunately there
are two SMP-related problems with this approach.  First, a task running on
another CPU may be updating its flags while the freezer attempts to set
PF_FREEZE for it and this may leave the task's flags in an inconsistent
state.  Second, there is a potential race between freeze_process() and
refrigerator() in which freeze_process() running on one CPU is reading a
task's PF_FREEZE flag while refrigerator() running on another CPU has just
set PF_FROZEN for the same task and attempts to reset PF_FREEZE for it.  If
the refrigerator wins the race, freeze_process() will state that PF_FREEZE
hasn't been set for the task and will set it unnecessarily, so the task
will go to the refrigerator once again after it's been thawed.

To solve first of these problems we need to stop using PF_FREEZE to tell
tasks that they should go to the refrigerator.  Instead, we can introduce a
special TIF_*** flag and use it for this purpose, since it is allowed to
change the other tasks' TIF_*** flags and there are special calls for it.

To avoid the freeze_process()-refrigerator() race we can make
freeze_process() to always check the task's PF_FROZEN flag after it's read
its "freeze" flag.  We should also make sure that refrigerator() will
always reset the task's "freeze" flag after it's set PF_FROZEN for it.

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Acked-by: Pavel Machek <pavel@ucw.cz>
Cc: Russell King <rmk@arm.linux.org.uk>
Cc: David Howells <dhowells@redhat.com>
Cc: Andi Kleen <ak@muc.de>
Cc: "Luck, Tony" <tony.luck@intel.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Paul Mundt <lethal@linux-sh.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-12-13 09:05:49 -08:00
..
bigsur fix file specification in comments 2006-10-03 23:01:26 +02:00
cpu-sh2 sh: Drop CPU subtype IRQ headers. 2006-12-06 10:45:37 +09:00
cpu-sh2a sh: Drop CPU subtype IRQ headers. 2006-12-06 10:45:37 +09:00
cpu-sh3 sh: Kill off more dead headers. 2006-10-03 13:12:38 +09:00
cpu-sh4 sh: SH-MobileR SH7722 CPU support. 2006-12-12 08:42:09 +09:00
dreamcast fix file specification in comments 2006-10-03 23:01:26 +02:00
ec3104 [PATCH] remove SYSRQ_KEY and related defines from ppc/sh/h8300 2006-10-01 00:39:22 -07:00
hd64465 fix file specification in comments 2006-10-03 23:01:26 +02:00
landisk sh: Remove board-specific ide.h headers. 2006-10-19 16:30:32 +09:00
mpc1211 fix file specification in comments 2006-10-03 23:01:26 +02:00
saturn Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
sh03 sh: Remove board-specific ide.h headers. 2006-10-19 16:30:32 +09:00
.gitignore sh: Initial gitignore list 2006-10-03 13:16:15 +09:00
Kbuild Add empty Kbuild files for 'make headers_install' in remaining arches. 2006-06-18 12:58:53 +01:00
a.out.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
adc.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
addrspace.h sh: __addr_ok() and other misc nommu fixups. 2006-09-27 17:25:07 +09:00
apm.h sh: APM/PM support. 2006-09-27 16:20:22 +09:00
atomic-irq.h sh: Split out atomic ops logically. 2006-12-12 08:42:08 +09:00
atomic-llsc.h sh: Split out atomic ops logically. 2006-12-12 08:42:08 +09:00
atomic.h sh: Split out atomic ops logically. 2006-12-12 08:42:08 +09:00
auxvec.h sh: Initial vsyscall page support. 2006-09-27 18:33:49 +09:00
bitops.h sh: Various cosmetic cleanups. 2006-09-27 12:31:01 +09:00
bug.h sh: BUG() handling through trapa vector. 2006-12-12 08:42:08 +09:00
bugs.h sh: SH-MobileR SH7722 CPU support. 2006-12-12 08:42:09 +09:00
byteorder.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
cache.h sh: page table alloc cleanups and page fault optimizations. 2006-09-27 15:13:36 +09:00
cacheflush.h sh: Calculate shm alignment at runtime. 2006-09-27 18:36:17 +09:00
checksum.h sh: Shut up csum_ipv6_magic() warnings. 2006-12-12 08:42:07 +09:00
clock.h sh: Clock framework tidying. 2006-12-06 10:45:40 +09:00
cpu-features.h sh: Support for L2 cache on newer SH-4A CPUs. 2006-09-27 18:27:43 +09:00
cputime.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
current.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
delay.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
device.h Driver core: add dev_archdata to struct device 2006-12-01 14:52:01 -08:00
div64.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
dma-mapping.h sh: Fixup dma_cache_sync() callers. 2006-12-12 08:42:09 +09:00
dma.h sh: dma-api channel capability extensions. 2006-12-06 10:45:39 +09:00
edosk7705.h sh: Add some missing board headers. 2006-10-19 17:31:22 +09:00
elf.h sh: Preliminary support for SH-X2 MMU. 2006-12-06 10:45:37 +09:00
emergency-restart.h [PATCH] Add emergency_restart() 2005-07-26 14:35:41 -07:00
entry-macros.S sh: Fixup various PAGE_SIZE == 4096 assumptions. 2006-12-06 10:45:39 +09:00
errno.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
fcntl.h [PATCH] Clean up struct flock64 definitions 2005-09-07 16:57:38 -07:00
fixmap.h sh: Various cosmetic cleanups. 2006-09-27 12:31:01 +09:00
flat.h sh: Various nommu fixes. 2006-09-27 17:21:02 +09:00
floppy.h [PATCH] irq-flags: SH: Use the new IRQF_ constants 2006-07-02 13:58:48 -07:00
freq.h [PATCH] sh: Simplistic clock framework 2006-01-16 23:15:28 -08:00
futex.h [PATCH] consolidate asm/futex.h 2006-01-08 20:13:39 -08:00
hardirq.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
hd64461.h sh: APM/PM support. 2006-09-27 16:20:22 +09:00
hp6xx.h sh: Add some missing board headers. 2006-10-19 17:31:22 +09:00
hs7751rvoip.h sh: Add some missing board headers. 2006-10-19 17:31:22 +09:00
hw_irq.h sh: Updates for IRQ handler changes. 2006-10-06 15:31:16 +09:00
ide.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
io.h [PATCH] Consolidate check_signature 2006-10-11 11:14:23 -07:00
io_generic.h [PATCH] sh: I/O routine cleanups and ioremap() overhaul 2006-01-16 23:15:28 -08:00
ioctl.h [PATCH] Generic ioctl.h 2006-01-10 08:01:34 -08:00
ioctls.h [PATCH] sh/sh64: Fix bogus TIOCGICOUNT definitions 2006-02-01 08:53:20 -08:00
ipc.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
ipcbuf.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
irq.h sh: SH-MobileR SH7722 CPU support. 2006-12-12 08:42:09 +09:00
irq_regs.h sh: Updates for IRQ handler changes. 2006-10-06 15:31:16 +09:00
irqflags.h sh: stacktrace/lockdep/irqflags tracing support. 2006-12-06 10:45:40 +09:00
kexec.h sh: Update kexec support for API changes. 2006-09-27 18:26:05 +09:00
keyboard.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
kgdb.h sh: kgdb stub cleanups. 2006-09-27 16:24:55 +09:00
kmap_types.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
linkage.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
local.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
machvec.h sh: machvec rework. 2006-09-27 18:17:31 +09:00
machvec_init.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
mc146818rtc.h sh: Kill off the rest of the legacy rtc mess. 2006-09-27 17:45:01 +09:00
microdev.h [PATCH] sh: SH4-202 microdev updates 2006-02-01 08:53:19 -08:00
mman.h [PATCH] add asm-generic/mman.h 2006-02-15 15:32:22 -08:00
mmu.h sh: Initial vsyscall page support. 2006-09-27 18:33:49 +09:00
mmu_context.h sh: Use MMU.TTB register as pointer to current pgd. 2006-12-06 10:45:38 +09:00
module.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
msgbuf.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
mutex.h [PATCH] mutex subsystem, add default include/asm-*/mutex.h files 2006-01-09 15:59:19 -08:00
namei.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
page.h sh: Preliminary support for SH-X2 MMU. 2006-12-06 10:45:37 +09:00
param.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
pci.h sh: Consolidated SH7751/SH7780 PCI support. 2006-09-27 16:43:28 +09:00
percpu.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
pgalloc.h sh: pmd rework. 2006-12-06 10:45:38 +09:00
pgtable.h sh: landisk board build fixes. 2006-12-12 08:42:07 +09:00
pm.h sh: APM/PM support. 2006-09-27 16:20:22 +09:00
poll.h [PATCH] POLLRDHUP/EPOLLRDHUP handling for half-closed devices notifications 2006-03-25 08:22:56 -08:00
posix_types.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
processor.h sh: SH-MobileR SH7722 CPU support. 2006-12-12 08:42:09 +09:00
ptrace.h Fix 'make headers_check' on sh 2006-09-21 08:36:50 +01:00
push-switch.h sh: push-switch fixups for work_struct API damage. 2006-12-12 08:42:07 +09:00
r7780rp.h sh: Convert INTC2 to IRQ table registration. 2006-10-20 15:30:55 +09:00
resource.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
rtc.h sh: Kill off the rest of the legacy rtc mess. 2006-09-27 17:45:01 +09:00
rts7751r2d.h sh: Add some missing board headers. 2006-10-19 17:31:22 +09:00
rwsem.h sh: stacktrace/lockdep/irqflags tracing support. 2006-12-06 10:45:40 +09:00
scatterlist.h sh: Fix libata build. 2006-09-27 14:48:09 +09:00
sci.h serial: Add SERIAL_SH_SCI_NR_UARTS for sh-sci. 2006-09-27 17:32:30 +09:00
se.h sh: Board updates for I/O routine rework. 2006-09-27 15:41:24 +09:00
se7206.h sh: SE7206 build fixes. 2006-12-06 10:45:37 +09:00
se7300.h sh: Board updates for I/O routine rework. 2006-09-27 15:41:24 +09:00
se7343.h sh: Solution Engine SH7343 board support. 2006-09-27 18:09:34 +09:00
se7751.h sh: Board updates for I/O routine rework. 2006-09-27 15:41:24 +09:00
se73180.h sh: Board updates for I/O routine rework. 2006-09-27 15:41:24 +09:00
sections.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
segment.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
semaphore-helper.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
semaphore.h [PATCH] semaphore: Remove __MUTEX_INITIALIZER() 2005-10-30 17:37:27 -08:00
sembuf.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
serial.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
setup.h [PATCH] cleanup asm/setup.h userspace visibility 2006-12-07 08:39:46 -08:00
sfp-machine.h sh: Kill off remaining config.h references. 2006-10-03 13:19:02 +09:00
sh_bios.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
shmbuf.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
shmin.h sh: Add some missing board headers. 2006-10-19 17:31:22 +09:00
shmparam.h sh: Fixup SHMLBA definition for SH7705. 2006-09-27 15:29:18 +09:00
sigcontext.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
siginfo.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
signal.h [PATCH] irq-flags: SH: Use the new IRQF_ constants 2006-07-02 13:58:48 -07:00
smc37c93x.h sh: Move smc37c93x.h for SystemH board use. 2006-09-27 11:16:20 +09:00
smp.h sh: remove cpu_online() definition from <asm/smp.h> 2006-09-27 14:32:57 +09:00
snapgear.h sh: Board updates for I/O routine rework. 2006-09-27 15:41:24 +09:00
socket.h [AF_UNIX]: Datagram getpeersec 2006-06-29 16:58:06 -07:00
sockios.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
spinlock.h sh: Fixup __raw_read_trylock(). 2006-10-03 14:13:09 +09:00
spinlock_types.h [PATCH] spinlock consolidation 2005-09-10 10:06:21 -07:00
stat.h [PATCH] 2TB files: st_blocks is invalid when calling stat64 2006-03-26 08:57:00 -08:00
statfs.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
string.h sh: build fixes for defconfigs. 2006-10-03 13:14:04 +09:00
system.h sh: stacktrace/lockdep/irqflags tracing support. 2006-12-06 10:45:40 +09:00
systemh7751.h sh: Board updates for I/O routine rework. 2006-09-27 15:41:24 +09:00
termbits.h [PATCH] tty: preparatory structures for termios revamp 2006-12-08 08:28:56 -08:00
termios.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
thread_info.h [PATCH] PM: Fix SMP races in the freezer 2006-12-13 09:05:49 -08:00
timer.h sh: dyntick infrastructure. 2006-12-06 10:45:40 +09:00
timex.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
titan.h sh: sh775x/titan fixes for irq header changes. 2006-12-06 12:05:02 +09:00
tlb.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
tlbflush.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
topology.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
types.h [PATCH] Centralise definitions of sector_t and blkcnt_t 2006-12-04 19:41:15 -08:00
uaccess.h sh: __addr_ok() and other misc nommu fixups. 2006-09-27 17:25:07 +09:00
ubc.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
ucontext.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
unaligned.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
unistd.h [PATCH] remove kernel syscalls 2006-12-07 08:39:37 -08:00
user.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
voyagergx.h sh: Move voyagergx_reg.h to a more sensible place. 2006-09-27 17:17:27 +09:00
watchdog.h sh: Various cosmetic cleanups. 2006-09-27 12:31:01 +09:00
xor.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00