kernel-ark/include/asm-arm
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
..
arch-aaec2000 [ARM] Clean up discontigmem support 2006-11-30 22:52:28 +00:00
arch-at91rm9200 [ARM] 3977/1: AT91: remove loop waiting for reset 2006-12-04 14:37:42 +00:00
arch-cl7500
arch-clps711x [ARM] Clean up discontigmem support 2006-11-30 22:52:28 +00:00
arch-ebsa110 [ARM] ebsa110: fix warnings generated by asm/arch/io.h 2006-11-20 15:59:10 +00:00
arch-ebsa285 fix file specification in comments 2006-10-03 23:01:26 +02:00
arch-ep93xx [PATCH] Cirrus Logic ep93xx ethernet driver 2006-09-22 20:13:23 -04:00
arch-h720x fix file specification in comments 2006-10-03 23:01:26 +02:00
arch-imx [ARM] 3991/1: i.MX/MX1 high resolution time source 2006-12-07 16:24:16 +00:00
arch-integrator [ARM] 3631/1: Remove legacy __mem_isa() definitions 2006-06-24 10:34:48 +01:00
arch-iop13xx [ARM] 3995/1: iop13xx: add iop13xx support 2006-12-07 17:20:21 +00:00
arch-iop32x [ARM] 3851/1: iop3xx: add io-data glantank support 2006-09-25 10:34:02 +01:00
arch-iop33x [ARM] 3832/1: iop3xx: coding style cleanup 2006-09-25 10:25:53 +01:00
arch-ixp4xx Merge branch 'for-linus' of master.kernel.org:/home/rmk/linux-2.6-arm 2006-12-07 15:40:39 -08:00
arch-ixp23xx [ARM] 3662/1: ixp23xx: don't include asm/hardware.h in uncompress.h 2006-06-28 17:54:56 +01:00
arch-ixp2000
arch-l7200 [ARM] Remove "translated" io macros 2006-11-30 14:39:14 +00:00
arch-lh7a40x [ARM] Clean up discontigmem support 2006-11-30 22:52:28 +00:00
arch-netx [ARM] 3631/1: Remove legacy __mem_isa() definitions 2006-06-24 10:34:48 +01:00
arch-omap WorkQueue: Fix up arch-specific work items where possible 2006-12-05 19:36:26 +00:00
arch-pnx4008 i2c: New Philips PNX bus driver 2006-12-10 21:21:29 +01:00
arch-pxa [PATCH] spi: stabilize PIO mode transfers on PXA2xx systems 2006-12-10 09:55:40 -08:00
arch-realview [ARM] 3631/1: Remove legacy __mem_isa() definitions 2006-06-24 10:34:48 +01:00
arch-rpc
arch-s3c2410 [PATCH] s3c2410fb: Add support for STN displays 2006-12-08 08:29:05 -08:00
arch-sa1100 [ARM] Merge individual ARM sub-trees 2006-12-07 23:07:26 +00:00
arch-shark fix file specification in comments 2006-10-03 23:01:26 +02:00
arch-versatile [PATCH] arm-versatile iomem annotations 2006-10-11 11:17:06 -07:00
hardware Initial blind fixup for arm for irq changes 2006-10-06 10:59:54 -07:00
mach [ARM] Remove compatibility layer for ARM irqs 2006-11-30 12:24:47 +00:00
a.out.h
apm.h
assembler.h [ARM] Remove MODE_(SVC|IRQ|FIQ|USR) and DEFAULT_FIQ 2006-06-25 12:01:48 +01:00
atomic.h [ARM] 3810/1: switch atomic helpers over to raw_local_irq_{save,restore} 2006-09-25 10:25:24 +01:00
auxvec.h
bitops.h [ARM] 3852/1: convert atomic bitops and __xchg over to raw_local_irq_{save,restore} 2006-09-25 10:34:03 +01:00
bug.h [ARM] 3983/2: remove unused argument to __bug() 2006-12-07 22:38:09 +00:00
bugs.h [ARM] nommu: adjust headers for !MMU ARM systems 2006-06-28 17:59:45 +01:00
byteorder.h [ARM] Fix byte order macros for Thumb 2006-06-19 15:35:36 +01:00
cache.h
cacheflush.h [ARM] Use CPU_CACHE_* where possible in asm/cacheflush.h 2006-09-27 18:00:35 +01:00
checksum.h [NET]: ARM checksum annotations and cleanups. 2006-12-02 21:23:15 -08:00
cnt32_to_63.h [ARM] 3978/1: macro to provide a 63-bit value from a 32-bit hardware counter 2006-12-07 16:06:45 +00:00
cpu-multi32.h
cpu-single.h
cpu.h
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 [ARM] 3611/4: optimize do_div() when divisor is constant 2006-12-07 16:06:09 +00:00
dma-mapping.h [PATCH] Add struct dev pointer to dma_is_consistent() 2006-12-07 08:39:41 -08:00
dma.h
domain.h [ARM] nommu: adjust headers for !MMU ARM systems 2006-06-28 17:59:45 +01:00
dyntick.h [ARM] 3692/1: ARM: coswitch irq handling to the generic implementation 2006-07-01 22:30:09 +01:00
ecard.h
elf.h [ARM] 3881/4: xscale: clean up cp0/cp1 handling 2006-12-03 17:52:22 +00:00
emergency-restart.h
errno.h
fcntl.h
fiq.h
flat.h [ARM] nommu: create flat.h to support uClinux flat binaries 2006-09-20 14:58:35 +01:00
floppy.h [PATCH] ARM: fixup irqflags breakage after ARM genirq merge 2006-07-02 17:29:22 -07:00
fpstate.h [ARM] 3370/2: ep93xx: add crunch support 2006-06-28 17:55:01 +01:00
futex.h
glue.h
hardirq.h
hardware.h
hw_irq.h [PATCH] misc arm pt_regs fixes 2006-10-08 12:32:36 -07:00
ide.h
io.h [ARM] Remove warnings for __io_pci and __arch_(get|put)* 2006-11-30 14:36:29 +00:00
ioctl.h
ioctls.h
ipc.h
ipcbuf.h
irq_regs.h Initial blind fixup for arm for irq changes 2006-10-06 10:59:54 -07:00
irq.h [ARM] 3692/1: ARM: coswitch irq handling to the generic implementation 2006-07-01 22:30:09 +01:00
irqflags.h [ARM] Add ARM irqtrace support 2006-09-20 14:58:35 +01:00
Kbuild Add empty Kbuild files for 'make headers_install' in remaining arches. 2006-06-18 12:58:53 +01:00
kmap_types.h
leds.h
limits.h
linkage.h
local.h
locks.h
mc146818rtc.h
memory.h [ARM] Clean up discontigmem support 2006-11-30 22:52:28 +00:00
mman.h
mmu_context.h [ARM] Add section support to ioremap 2006-06-29 22:14:30 +01:00
mmu.h [ARM] Add section support to ioremap 2006-06-29 22:14:30 +01:00
mmzone.h
module.h
msgbuf.h
mtd-xip.h
mutex.h
namei.h
nwflash.h
page-nommu.h [ARM] nommu: adjust headers for !MMU ARM systems 2006-06-28 17:59:45 +01:00
page.h Merge master.kernel.org:/pub/scm/linux/kernel/git/tmlind/linux-omap-upstream into devel 2006-09-27 19:57:54 +01:00
param.h
parport.h
pci.h
percpu.h
pgalloc.h [ARM] nommu: adjust headers for !MMU ARM systems 2006-06-28 17:59:45 +01:00
pgtable-hwdef.h [ARM] Set bit 4 on section mappings correctly depending on CPU 2006-06-29 18:24:21 +01:00
pgtable-nommu.h [ARM] Fix nommu build 2006-11-30 13:53:54 +00:00
pgtable.h [ARM] 3971/1: xsc3: get rid of L_PTE_COHERENT 2006-12-01 23:40:23 +00:00
poll.h
posix_types.h
proc-fns.h [ARM] nommu: add ARM946E-S core support 2006-09-27 17:39:19 +01:00
processor.h [ARM] Include asm/elf.h instead of asm/procinfo.h 2006-11-30 12:24:46 +00:00
procinfo.h [ARM] Move HWCAP_* definitions to asm/elf.h 2006-11-30 12:24:46 +00:00
ptrace.h [ARM] 3665/1: crunch: add ptrace support 2006-06-28 17:55:00 +01:00
resource.h
rtc.h
scatterlist.h
sections.h
segment.h
semaphore-helper.h
semaphore.h
sembuf.h
serial.h
setup.h [PATCH] cleanup asm/setup.h userspace visibility 2006-12-07 08:39:46 -08:00
shmbuf.h
shmparam.h
sigcontext.h
siginfo.h
signal.h [PATCH] ARM: fixup irqflags breakage after ARM genirq merge 2006-07-02 17:29:22 -07:00
sizes.h
smp.h
socket.h [AF_UNIX]: Datagram getpeersec 2006-06-29 16:58:06 -07:00
sockios.h
spinlock_types.h
spinlock.h [PATCH] Directed yield: cpu_relax variants for spinlocks and rw-locks 2006-10-01 00:39:21 -07:00
stat.h
statfs.h
string.h
suspend.h
system.h [ARM] nommu: manage the CP15 things 2006-09-27 17:34:30 +01:00
termbits.h [PATCH] tty: preparatory structures for termios revamp 2006-12-08 08:28:56 -08:00
termios.h
therm.h
thread_info.h [PATCH] PM: Fix SMP races in the freezer 2006-12-13 09:05:49 -08:00
thread_notify.h [ARM] Add thread_notify infrastructure 2006-06-22 10:24:18 +01:00
timex.h
tlb.h
tlbflush.h [ARM] 3759/2: Remove uses of %? 2006-09-20 14:58:35 +01:00
topology.h
traps.h
types.h
uaccess.h [ARM] Add __must_check to uaccess functions 2006-10-28 10:15:31 +01:00
ucontext.h [ARM] 3664/1: crunch: add signal frame save/restore 2006-06-28 17:54:59 +01:00
unaligned.h [ARM] 3849/1: fix get_unaligned() for gcc >= 4.1 2006-09-25 10:34:00 +01:00
unistd.h [PATCH] remove kernel syscalls 2006-12-07 08:39:37 -08:00
user.h
vfp.h
vfpmacros.h
vga.h [PATCH] vgacon: make VGA_MAP_MEM take size, remove extra use 2006-06-22 15:05:58 -07:00
xor.h