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
..
mach-bigsmp
mach-default
[PATCH] paravirt: header and stubs for paravirtualisation
2006-12-07 02:14:07 +01:00
mach-es7000
[PATCH] i386: Allow to use GENERICARCH for UP kernels
2006-09-26 10:52:26 +02:00
mach-generic
mach-numaq
mach-summit
[PATCH] i386: Fix compilation with UP genericarch
2006-11-28 20:12:59 +01:00
mach-visws
[PATCH] visws build fix
2006-10-28 11:30:52 -07:00
mach-voyager
IRQ: Maintain regs pointer globally rather than passing to IRQ handlers
2006-10-05 15:10:12 +01:00
8253pit.h
a.out.h
acpi.h
[PATCH] x86: Add acpi_user_timer_override option for Asus boards
2006-11-14 16:57:46 +01:00
agp.h
alternative-asm.i
Remove all inclusions of <linux/config.h>
2006-10-04 03:38:54 -04:00
alternative.h
[PATCH] paravirt: Patch inline replacements for paravirt intercepts
2006-12-07 02:14:08 +01:00
apic.h
[PATCH] paravirt: Add APIC accessors to paravirt-ops.
2006-12-07 02:14:08 +01:00
apicdef.h
x86_64: Remove stale lapic definition from apicdef.h
2006-04-01 22:50:03 -05:00
arch_hooks.h
IRQ: Maintain regs pointer globally rather than passing to IRQ handlers
2006-10-05 15:10:12 +01:00
atomic.h
Merge branch 'for-linus' of git://one.firstfloor.org/home/andi/git/linux-2.6
2006-12-07 08:59:11 -08:00
auxvec.h
bitops.h
Don't include linux/config.h from anywhere else in include/
2006-04-26 12:56:16 +01:00
boot.h
[PATCH] i386: Implement CONFIG_PHYSICAL_ALIGN
2006-12-07 02:14:04 +01:00
bug.h
[PATCH] Generic BUG for i386
2006-12-08 08:28:39 -08:00
bugs.h
[PATCH] paravirt: Allow selected bug checks to be
2006-12-07 02:14:08 +01:00
byteorder.h
Don't include linux/config.h from anywhere else in include/
2006-04-26 12:56:16 +01:00
cache.h
Don't include linux/config.h from anywhere else in include/
2006-04-26 12:56:16 +01:00
cacheflush.h
checksum.h
[NET]: I386 checksum annotations and cleanups.
2006-12-02 21:23:19 -08:00
cpu.h
[PATCH] i386: introduce the mechanism of disabling cpu hotplug control
2006-12-07 02:14:10 +01:00
cpufeature.h
[PATCH] i386: i386 add Intel BTS cpufeature bit and detection (take 2)
2006-12-07 02:14:11 +01:00
cputime.h
current.h
[PATCH] i386: Implement "current" with the PDA
2006-12-07 02:14:03 +01:00
debugreg.h
delay.h
[PATCH] paravirt: header and stubs for paravirtualisation
2006-12-07 02:14:07 +01:00
desc.h
[PATCH] paravirt: Patch inline replacements for paravirt intercepts
2006-12-07 02:14:08 +01:00
device.h
ACPI: Change ACPI to use dev_archdata instead of firmware_data
2006-12-01 14:52:01 -08:00
div64.h
dma-mapping.h
[PATCH] Pass struct dev pointer to dma_cache_sync()
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
dmi.h
dwarf2.h
[PATCH] i386/x86-64: Work around gcc bug with noreturn functions in unwinder
2006-09-26 10:52:41 +02:00
e820.h
[PATCH] i386: Move memory map printing and other code to e820.c
2006-12-07 02:14:06 +01:00
edac.h
elf.h
[PATCH] i386: Fix places where using %gs changes the usermode ABI
2006-12-07 02:14:02 +01:00
emergency-restart.h
errno.h
fcntl.h
fixmap.h
[PATCH] x86: make __FIXADDR_TOP variable to allow it to make space for a hypervisor
2006-09-26 08:48:55 -07:00
floppy.h
IRQ: Maintain regs pointer globally rather than passing to IRQ handlers
2006-10-05 15:10:12 +01:00
frame.i
Remove all inclusions of <linux/config.h>
2006-10-04 03:38:54 -04:00
futex.h
[PATCH] mm: pagefault_{disable,enable}()
2006-12-07 08:39:21 -08:00
genapic.h
[PATCH] x86: fix the irqbalance quirk for E7320/E7520/E7525
2006-12-07 02:14:10 +01:00
hardirq.h
Don't include linux/config.h from anywhere else in include/
2006-04-26 12:56:16 +01:00
highmem.h
Don't include linux/config.h from anywhere else in include/
2006-04-26 12:56:16 +01:00
hpet.h
IRQ: Maintain regs pointer globally rather than passing to IRQ handlers
2006-10-05 15:10:12 +01:00
hw_irq.h
[PATCH] i386/x86_64: Remove global IO_APIC_VECTOR
2006-10-08 12:24:02 -07:00
hypertransport.h
[PATCH] Initial generic hypertransport interrupt support
2006-10-04 07:55:29 -07:00
i387.h
[PATCH] i386: add sleazy FPU optimization
2006-12-07 02:14:01 +01:00
i8253.h
i8259.h
ide.h
[PATCH] ide: more conversion to pci_get APIs
2006-12-08 08:29:03 -08:00
intel_arch_perfmon.h
[PATCH] x86: i386/x86-64 Add nmi watchdog support for new Intel CPUs
2006-09-26 10:52:27 +02:00
io.h
[PATCH] paravirt: header and stubs for paravirtualisation
2006-12-07 02:14:07 +01:00
io_apic.h
i386: clean up io-apic accesses
2006-11-01 09:11:00 -08:00
ioctl.h
ioctls.h
ipc.h
ipcbuf.h
irq.h
[PATCH] x86: fix the irqbalance quirk for E7320/E7520/E7525
2006-12-07 02:14:10 +01:00
irq_regs.h
[PATCH] i386: Store the interrupt regs pointer in the PDA
2006-12-07 02:14:03 +01:00
irqflags.h
[PATCH] paravirt: Patch inline replacements for paravirt intercepts
2006-12-07 02:14:08 +01:00
ist.h
k8.h
[PATCH] x86_64: Clean and enhance up K8 northbridge access code
2006-06-26 10:48:15 -07:00
Kbuild
[PATCH] cleanup asm/setup.h userspace visibility
2006-12-07 08:39:46 -08:00
kdebug.h
[PATCH] Notify page fault call chain for i386
2006-06-26 09:58:22 -07:00
kexec.h
[PATCH] i386: Avoid overwriting the current pgd (V4, i386)
2006-09-26 10:52:38 +02:00
kmap_types.h
Don't include linux/config.h from anywhere else in include/
2006-04-26 12:56:16 +01:00
kprobes.h
[PATCH] IA64: kprobe invalidate icache of jump buffer
2006-07-31 13:28:38 -07:00
ldt.h
linkage.h
local.h
i386: improve and correct inline asm memory constraints
2006-07-08 15:24:18 -07:00
math_emu.h
[PATCH] i386: PDA: Fix math emulator for new pt_regs
2006-12-07 02:14:03 +01:00
mc146818rtc.h
mca.h
mca_dma.h
[PATCH] kernel-doc for kernel/dma.c
2006-10-03 08:03:41 -07:00
mce.h
[PATCH] Don't trigger full rebuild via CONFIG_X86_MCE
2006-06-23 07:42:56 -07:00
mman.h
mmu.h
[PATCH] vdso: randomize the i386 vDSO by moving it into a vma
2006-06-27 17:32:38 -07:00
mmu_context.h
[PATCH] i386: Use %gs as the PDA base-segment in the kernel
2006-12-07 02:14:02 +01:00
mmx.h
mmzone.h
[PATCH] silence unused pgdat warning from alloc_bootmem_node and friends
2006-12-07 08:39:23 -08:00
module.h
[PATCH] i386: always enable regparm
2006-12-07 02:14:12 +01:00
mpspec.h
[PATCH] mptspec: remove duplicate #include
2006-04-11 06:18:34 -07:00
mpspec_def.h
[PATCH] x86-64: remove remaining pc98 code
2006-12-07 02:14:19 +01:00
msgbuf.h
msidef.h
[PATCH] genirq: i386 irq: Move msi message composition into io_apic.c
2006-10-04 07:55:28 -07:00
msr.h
Merge ../linus
2006-12-12 17:41:41 -05:00
mtrr.h
[PATCH] Don't trigger full rebuild via CONFIG_MTRR
2006-06-23 07:42:56 -07:00
mutex.h
[PATCH] i386: Remove lock section support in mutex.h
2006-09-26 10:52:31 +02:00
namei.h
nmi.h
[PATCH] x86: all cpu backtrace
2006-12-07 02:14:01 +01:00
numa.h
numaq.h
page.h
[PATCH] paravirt: Preparatory mmu header movement
2006-12-07 02:14:08 +01:00
param.h
[PATCH] cleanup asm/setup.h userspace visibility
2006-12-07 08:39:46 -08:00
paravirt.h
[PATCH] paravirt: Add MMU virtualization to paravirt_ops
2006-12-07 02:14:08 +01:00
parport.h
pci-direct.h
pci.h
Don't include linux/config.h from anywhere else in include/
2006-04-26 12:56:16 +01:00
pda.h
[PATCH] i386: Store the interrupt regs pointer in the PDA
2006-12-07 02:14:03 +01:00
percpu.h
[PATCH] i386: espfix cleanup
2006-12-07 02:14:01 +01:00
pgalloc.h
Don't include linux/config.h from anywhere else in include/
2006-04-26 12:56:16 +01:00
pgtable-2level-defs.h
pgtable-2level.h
[PATCH] paravirt: fix missing pte update
2006-12-07 02:14:09 +01:00
pgtable-3level-defs.h
pgtable-3level.h
[PATCH] paravirt: fix missing pte update
2006-12-07 02:14:09 +01:00
pgtable.h
Merge branch 'for-linus' of git://one.firstfloor.org/home/andi/git/linux-2.6
2006-12-07 08:59:11 -08:00
poll.h
posix_types.h
i386: improve and correct inline asm memory constraints
2006-07-08 15:24:18 -07:00
processor.h
[PATCH] i386: cpu_detect extraction
2006-12-07 02:14:08 +01:00
ptrace-abi.h
[PATCH] Split i386 and x86_64 ptrace.h
2006-09-26 08:49:10 -07:00
ptrace.h
[PATCH] i386: Use %gs as the PDA base-segment in the kernel
2006-12-07 02:14:02 +01:00
resource.h
rtc.h
rwlock.h
[PATCH] i386: Clean up spin/rwlocks
2006-09-26 10:52:32 +02:00
rwsem.h
[PATCH] lockdep: name some old style locks
2006-12-07 08:39:36 -08:00
scatterlist.h
seccomp.h
sections.h
segment.h
[PATCH] paravirt: header and stubs for paravirtualisation
2006-12-07 02:14:07 +01:00
semaphore.h
[PATCH] i386: Use early clobbers for semaphores now
2006-09-27 14:39:51 -07: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
Merge branch 'for-linus' of git://one.firstfloor.org/home/andi/git/linux-2.6
2006-12-07 08:59:11 -08:00
shmbuf.h
shmparam.h
sigcontext.h
siginfo.h
signal.h
[PATCH] headers_check: move inclusion of <linux/linkage.h> in <asm-i386/signal.h>
2006-09-13 07:32:15 -07:00
smp.h
[PATCH] i386: Implement smp_processor_id() with the PDA
2006-12-07 02:14:03 +01:00
socket.h
[AF_UNIX]: Datagram getpeersec
2006-06-29 16:58:06 -07:00
sockios.h
sparsemem.h
spinlock.h
[PATCH] paravirt: Patch inline replacements for paravirt intercepts
2006-12-07 02:14:08 +01:00
spinlock_types.h
[PATCH] Remove 'volatile' from spinlock_types
2006-12-06 14:39:53 -08:00
srat.h
stacktrace.h
[PATCH] i386: Do stacktracer conversion too
2006-09-26 10:52:34 +02:00
stat.h
statfs.h
string.h
Don't include linux/config.h from anywhere else in include/
2006-04-26 12:56:16 +01:00
suspend.h
Merge branch 'for-linus' of git://one.firstfloor.org/home/andi/git/linux-2.6
2006-12-07 08:59:11 -08:00
sync_bitops.h
[PATCH] x86: implement always-locked bit ops, for memory shared with an SMP hypervisor
2006-09-26 08:48:55 -07:00
system.h
[PATCH] paravirt: header and stubs for paravirtualisation
2006-12-07 02:14:07 +01:00
termbits.h
[PATCH] tty: preparatory structures for termios revamp
2006-12-08 08:28:56 -08:00
termios.h
therm_throt.h
[PATCH] x86: Add a cumulative thermal throttle event counter.
2006-09-26 10:52:42 +02:00
thread_info.h
[PATCH] PM: Fix SMP races in the freezer
2006-12-13 09:05:49 -08:00
time.h
[PATCH] paravirt: header and stubs for paravirtualisation
2006-12-07 02:14:07 +01:00
timer.h
[PATCH] Time: i386 Conversion - part 3: Enable Generic Timekeeping
2006-06-26 09:58:21 -07:00
timex.h
[PATCH] Time: i386 Conversion - part 2: Rework TSC Support
2006-06-26 09:58:21 -07:00
tlb.h
tlbflush.h
[PATCH] paravirt: Add MMU virtualization to paravirt_ops
2006-12-07 02:14:08 +01:00
topology.h
[PATCH] sched: add option to serialize load balancing
2006-12-10 09:55:43 -08:00
tsc.h
[PATCH] x86: remove config.h includes from asm-i386 & asm-x86_64
2006-09-26 10:52:36 +02:00
types.h
[PATCH] Centralise definitions of sector_t and blkcnt_t
2006-12-04 19:41:15 -08:00
uaccess.h
[PATCH] uaccess.h: match kernel-doc and function names
2006-10-11 11:14:24 -07:00
ucontext.h
unaligned.h
unistd.h
[PATCH] remove kernel syscalls
2006-12-07 08:39:37 -08:00
unwind.h
[PATCH] unwinder: more sanity checks in Dwarf2 unwinder
2006-12-07 02:14:13 +01:00
user.h
vga.h
[PATCH] vgacon: make VGA_MAP_MEM take size, remove extra use
2006-06-22 15:05:58 -07:00
vic.h
[VOYAGER] fix up ptregs removal mess
2006-10-12 22:25:03 -05:00
vm86.h
[PATCH] i386: Update sys_vm86 to cope with changed pt_regs and %gs usage
2006-12-07 02:14:03 +01:00
voyager.h
[VOYAGER] fix up attribute packed specifiers in voyager.h
2006-10-12 22:23:18 -05:00
xor.h