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
Don't include linux/config.h from anywhere else in include/
2006-04-26 12:56:16 +01:00
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
[ARM] Fix decompressor serial IO to give CRLF not LFCR
2006-03-28 10:24:33 +01:00
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
[ARM] Move FLUSH_BASE macros to asm/arch/memory.h
2006-04-07 13:22:21 +01:00
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
Don't include linux/config.h from anywhere else in include/
2006-04-26 12:56:16 +01:00
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
[PATCH] auxiliary vector cleanups
2005-09-07 16:57:21 -07:00
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
[PATCH] Kill L1_CACHE_SHIFT_MAX
2006-01-08 20:13:39 -08:00
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
Don't include linux/config.h from anywhere else in include/
2006-04-26 12:56:16 +01:00
cputime.h
current.h
delay.h
[ARM] 3346/1: Fix udelay() for HZ values different from 100
2006-03-21 22:06:07 +00:00
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
Don't include linux/config.h from anywhere else in include/
2006-04-26 12:56:16 +01:00
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
[PATCH] Clean up struct flock64 definitions
2005-09-07 16:57:38 -07:00
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
[PATCH] consolidate asm/futex.h
2006-01-08 20:13:39 -08:00
glue.h
Don't include linux/config.h from anywhere else in include/
2006-04-26 12:56:16 +01:00
hardirq.h
Don't include linux/config.h from anywhere else in include/
2006-04-26 12:56:16 +01:00
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
[PATCH] Generic ioctl.h
2006-01-10 08:01:34 -08:00
ioctls.h
ipc.h
ipcbuf.h
irq.h
[ARM] 3692/1: ARM: coswitch irq handling to the generic implementation
2006-07-01 22:30:09 +01:00
irq_regs.h
Initial blind fixup for arm for irq changes
2006-10-06 10:59:54 -07: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
Don't include linux/config.h from anywhere else in include/
2006-04-26 12:56:16 +01:00
limits.h
linkage.h
local.h
locks.h
[ARM] 3019/1: fix wrong comments
2005-10-18 07:51:34 +01:00
mc146818rtc.h
memory.h
[ARM] Clean up discontigmem support
2006-11-30 22:52:28 +00:00
mman.h
[PATCH] add asm-generic/mman.h
2006-02-15 15:32:22 -08:00
mmu.h
[ARM] Add section support to ioremap
2006-06-29 22:14:30 +01:00
mmu_context.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
[ARM] 3311/1: clean up include/asm-arm/mutex.h
2006-02-08 21:19:38 +00:00
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
[ARM] Move HZ definition into Kconfig
2006-03-21 22:05:45 +00:00
parport.h
pci.h
Don't include linux/config.h from anywhere else in include/
2006-04-26 12:56:16 +01:00
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
[PATCH] POLLRDHUP/EPOLLRDHUP handling for half-closed devices notifications
2006-03-25 08:22:56 -08:00
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
[PATCH] RTC subsystem: ARM cleanup
2006-03-27 08:44:50 -08:00
scatterlist.h
[ARM] Remove '__address' from scatterlist and convert to DMA API
2006-01-04 15:08:30 +00:00
sections.h
segment.h
semaphore-helper.h
semaphore.h
[ARM] sema_count() removal
2005-12-01 20:58:01 +00:00
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
Don't include linux/config.h from anywhere else in include/
2006-04-26 12:56:16 +01:00
socket.h
[AF_UNIX]: Datagram getpeersec
2006-06-29 16:58:06 -07:00
sockios.h
spinlock.h
[PATCH] Directed yield: cpu_relax variants for spinlocks and rw-locks
2006-10-01 00:39:21 -07:00
spinlock_types.h
[PATCH] spinlock consolidation
2005-09-10 10:06:21 -07:00
stat.h
[ARM] 3106/2: ARM EABI: some syscall adjustments
2006-01-14 16:32:12 +00:00
statfs.h
[ARM] 3108/2: old ABI compat: statfs64 and fstatfs64
2006-01-14 16:35:03 +00:00
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
[ARM] noMMU: removes TLB codes in nommu mode
2006-03-21 22:03:20 +00:00
tlbflush.h
[ARM] 3759/2: Remove uses of %?
2006-09-20 14:58:35 +01:00
topology.h
traps.h
types.h
[PATCH] sab: consolidate kmem_bufctl_t
2005-09-05 00:05:48 -07:00
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
[ARM] 3472/1: Use the D variants of FLDMIA/FSTMIA on ARMv6
2006-04-10 21:32:42 +01:00
vga.h
[PATCH] vgacon: make VGA_MAP_MEM take size, remove extra use
2006-06-22 15:05:58 -07:00
xor.h