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
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
a.out.h
adc.h
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
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
current.h
delay.h
device.h Driver core: add dev_archdata to struct device 2006-12-01 14:52:01 -08:00
div64.h
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
entry-macros.S sh: Fixup various PAGE_SIZE == 4096 assumptions. 2006-12-06 10:45:39 +09:00
errno.h
fcntl.h
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_generic.h [PATCH] sh: I/O routine cleanups and ioremap() overhaul 2006-01-16 23:15:28 -08:00
io.h [PATCH] Consolidate check_signature 2006-10-11 11:14:23 -07: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
ipcbuf.h
irq_regs.h sh: Updates for IRQ handler changes. 2006-10-06 15:31:16 +09:00
irq.h sh: SH-MobileR SH7722 CPU support. 2006-12-12 08:42:09 +09:00
irqflags.h sh: stacktrace/lockdep/irqflags tracing support. 2006-12-06 10:45:40 +09:00
Kbuild Add empty Kbuild files for 'make headers_install' in remaining arches. 2006-06-18 12:58:53 +01: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
local.h
machvec_init.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
machvec.h sh: machvec rework. 2006-09-27 18:17:31 +09: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_context.h sh: Use MMU.TTB register as pointer to current pgd. 2006-12-06 10:45:38 +09:00
mmu.h sh: Initial vsyscall page support. 2006-09-27 18:33:49 +09:00
module.h
msgbuf.h
mutex.h [PATCH] mutex subsystem, add default include/asm-*/mutex.h files 2006-01-09 15:59:19 -08:00
namei.h
page.h sh: Preliminary support for SH-X2 MMU. 2006-12-06 10:45:37 +09:00
param.h
pci.h sh: Consolidated SH7751/SH7780 PCI support. 2006-09-27 16:43:28 +09:00
percpu.h
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
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
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
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
se.h sh: Board updates for I/O routine rework. 2006-09-27 15:41:24 +09:00
sections.h
segment.h
semaphore-helper.h
semaphore.h [PATCH] semaphore: Remove __MUTEX_INITIALIZER() 2005-10-30 17:37:27 -08:00
sembuf.h
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
shmbuf.h
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
siginfo.h
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
spinlock_types.h
spinlock.h sh: Fixup __raw_read_trylock(). 2006-10-03 14:13:09 +09:00
stat.h [PATCH] 2TB files: st_blocks is invalid when calling stat64 2006-03-26 08:57:00 -08:00
statfs.h
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
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
titan.h sh: sh775x/titan fixes for irq header changes. 2006-12-06 12:05:02 +09:00
tlb.h
tlbflush.h
topology.h
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
ucontext.h
unaligned.h
unistd.h [PATCH] remove kernel syscalls 2006-12-07 08:39:37 -08:00
user.h
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