Nick Piggin
362a61ad61
fix SMP data race in pagetable setup vs walking
...
There is a possible data race in the page table walking code. After the split
ptlock patches, it actually seems to have been introduced to the core code, but
even before that I think it would have impacted some architectures (powerpc
and sparc64, at least, walk the page tables without taking locks eg. see
find_linux_pte()).
The race is as follows:
The pte page is allocated, zeroed, and its struct page gets its spinlock
initialized. The mm-wide ptl is then taken, and then the pte page is inserted
into the pagetables.
At this point, the spinlock is not guaranteed to have ordered the previous
stores to initialize the pte page with the subsequent store to put it in the
page tables. So another Linux page table walker might be walking down (without
any locks, because we have split-leaf-ptls), and find that new pte we've
inserted. It might try to take the spinlock before the store from the other
CPU initializes it. And subsequently it might read a pte_t out before stores
from the other CPU have cleared the memory.
There are also similar races in higher levels of the page tables. They
obviously don't involve the spinlock, but could see uninitialized memory.
Arch code and hardware pagetable walkers that walk the pagetables without
locks could see similar uninitialized memory problems, regardless of whether
split ptes are enabled or not.
I prefer to put the barriers in core code, because that's where the higher
level logic happens, but the page table accessors are per-arch, and open-coding
them everywhere I don't think is an option. I'll put the read-side barriers
in alpha arch code for now (other architectures perform data-dependent loads
in order).
Signed-off-by: Nick Piggin <npiggin@suse.de>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-05-14 10:05:18 -07:00
..
8253pit.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
a.out-core.h
aout: suppress A.OUT library support if !CONFIG_ARCH_SUPPORTS_AOUT
2008-02-08 09:22:30 -08:00
a.out.h
aout: move STACK_TOP[_MAX] to asm/processor.h
2008-02-08 09:22:29 -08:00
agp.h
x86: remove flush_agp_mappings()
2008-01-30 13:34:07 +01:00
agp_backend.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
atomic.h
alpha: atomic_add_return() should return int
2008-02-05 09:44:21 -08:00
auxvec.h
[PATCH] auxiliary vector cleanups
2005-09-07 16:57:21 -07:00
barrier.h
read_barrier_depends arch fixlets
2008-05-14 10:05:18 -07:00
bitops.h
generic: implement __fls on all 64-bit archs
2008-04-26 19:21:16 +02:00
bug.h
alpha: teach the compiler that BUG doesn't return
2008-04-28 08:58:27 -07:00
bugs.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
byteorder.h
alpha: replace __inline with inline
2008-04-28 08:58:27 -07:00
cache.h
Don't include linux/config.h from anywhere else in include/
2006-04-26 12:56:16 +01:00
cacheflush.h
[PATCH] Optimize D-cache alias handling on fork
2006-12-13 09:27:08 -08:00
checksum.h
[NET]: Alpha checksum annotations and cleanups.
2006-12-02 21:23:01 -08:00
compiler.h
alpha: build fixes - force architecture
2007-04-17 16:36:27 -07:00
console.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
core_apecs.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
core_cia.h
Don't include linux/config.h from anywhere else in include/
2006-04-26 12:56:16 +01:00
core_irongate.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
core_lca.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
core_marvel.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
core_mcpcia.h
alpha: fixes for specific machine types
2007-04-17 16:36:27 -07:00
core_polaris.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
core_t2.h
ALPHA: correct low-level I/O routines for sable-lynx
2007-06-01 08:18:29 -07:00
core_titan.h
ALPHA: support graphics on non-zero PCI domains
2007-06-01 08:18:29 -07:00
core_tsunami.h
ALPHA: support graphics on non-zero PCI domains
2007-06-01 08:18:29 -07:00
core_wildfire.h
ALPHA: misc fixes
2007-06-01 08:18:29 -07:00
cputime.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
current.h
alpha: get_current(): don't add zero to current_thread_info()->task
2008-04-02 15:28:20 -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
alpha: fix ALSA DMA mmap crash
2008-04-02 15:28:19 -07:00
dma.h
Don't include linux/config.h from anywhere else in include/
2006-04-26 12:56:16 +01:00
elf.h
Cleanup asm/{elf,page,user}.h: #ifdef __KERNEL__ is no longer needed
2008-02-07 08:42:30 -08:00
emergency-restart.h
[PATCH] Add emergency_restart()
2005-07-26 14:35:41 -07:00
err_common.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
err_ev6.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
err_ev7.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
errno.h
[PATCH] add EOWNERDEAD and ENOTRECOVERABLE version 2
2005-05-01 08:59:06 -07:00
fb.h
fbdev: detect primary display device
2007-07-17 10:23:11 -07:00
fcntl.h
Fix Alpha O_CLOEXEC definition
2007-08-09 08:39:22 -07:00
floppy.h
cleanup floppy.h
2007-10-17 08:42:55 -07:00
fpu.h
[PATCH] bitops: alpha: use config options instead of __alpha_fix__ and __alpha_cix__
2006-03-26 08:57:09 -08:00
futex.h
[PATCH] consolidate asm/futex.h
2006-01-08 20:13:39 -08:00
gct.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
gentrap.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
hardirq.h
Don't include linux/config.h from anywhere else in include/
2006-04-26 12:56:16 +01:00
hw_irq.h
[PATCH] genirq: add ->retrigger() irq op to consolidate hw_irq_resend()
2006-06-29 10:26:23 -07:00
hwrpb.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
ide.h
ide: remove ide_init_default_irq() macro
2008-04-18 00:46:35 +02:00
io.h
Remove dma_cache_(wback|inv|wback_inv) functions
2007-10-17 08:42:57 -07:00
io_trivial.h
alpha: build fixes
2007-12-17 19:28:16 -08:00
ioctl.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
ioctls.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
take declarations of enable_irq() et.al. to linux/interrupt.h
2007-07-22 11:44:00 -07:00
irq_regs.h
[PATCH] minimal alpha pt_regs fixes
2006-10-07 10:51:14 -07:00
jensen.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
Kbuild
[HEADERS] One line per header in Kbuild files to reduce conflicts
2006-09-19 12:43:58 +01:00
kdebug.h
move die notifier handling to common code
2007-05-08 11:15:04 -07:00
kmap_types.h
Don't include linux/config.h from anywhere else in include/
2006-04-26 12:56:16 +01:00
kvm.h
kvm: provide kvm.h for all architecture: fixes headers_install
2008-04-02 15:28:18 -07:00
linkage.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
local.h
local_t: alpha extension
2007-05-08 11:15:20 -07:00
machvec.h
[PATCH] alpha pt_regs cleanups: machine_check()
2006-10-08 12:32:36 -07:00
mc146818rtc.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
md.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
mman.h
[PATCH] Remove final references to deprecated "MAP_ANON" page protection flag
2007-02-11 10:51:17 -08:00
mmu.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
mmu_context.h
alpha: fix hard_smp_processor_id compile error
2007-05-15 08:54:00 -07:00
mmzone.h
[PATCH] Standardize pxx_page macros
2006-09-26 08:48:51 -07: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
CONFIG_HIGHPTE vs. sub-page page tables.
2008-02-08 09:22:42 -08:00
pal.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
param.h
avoid overflows in kernel/time.c
2008-02-08 09:22:39 -08:00
parport.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
pci.h
alpha: fix ALSA DMA mmap crash
2008-04-02 15:28:19 -07:00
percpu.h
[PATCH] x86-64: Account for module percpu space separately from kernel percpu
2007-05-02 19:27:11 +02:00
pgalloc.h
CONFIG_HIGHPTE vs. sub-page page tables.
2008-02-08 09:22:42 -08:00
pgtable.h
fix SMP data race in pagetable setup vs walking
2008-05-14 10:05:18 -07:00
poll.h
Consolidate asm/poll.h
2007-05-11 08:29:34 -07:00
posix_types.h
[PATCH] FD_ZERO build fix
2007-01-11 18:18:22 -08:00
processor.h
aout: move STACK_TOP[_MAX] to asm/processor.h
2008-02-08 09:22:29 -08:00
ptrace.h
alpha: convert to generic sys_ptrace
2007-10-16 09:43:03 -07:00
reg.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
regdef.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
resource.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
rtc.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
rwsem.h
[PATCH] lockdep: remove RWSEM_DEBUG remnants
2006-07-03 15:27:01 -07:00
scatterlist.h
Add CONFIG_DEBUG_SG sg validation
2007-10-22 21:20:03 +02: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.h
Generic semaphore implementation
2008-04-17 10:42:34 -04: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
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
sfp-machine.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
shmparam.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
sigcontext.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
siginfo.h
[PATCH] consolidate SIGEV_PAD_SIZE
2005-05-01 08:59:08 -07:00
signal.h
[PATCH] irq-flags: ALPHA: Use the new IRQF_ constants
2006-07-02 13:58:46 -07:00
smp.h
Remove hardcoding of hard_smp_processor_id on UP systems
2007-05-09 12:30:48 -07:00
socket.h
[NET]: Introducing socket mark socket option.
2008-01-31 19:27:19 -08:00
sockios.h
[NET]: Introduce SIOCGSTAMPNS ioctl to get timestamps with nanosec resolution
2007-04-25 22:24:04 -07:00
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
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
statfs.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
string.h
[STRING]: Move strcasecmp/strncasecmp to lib/string.c
2007-04-26 01:54:39 -07:00
suspend.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
sysinfo.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
system.h
Add cmpxchg64 and cmpxchg64_local to alpha
2008-02-07 08:42:30 -08:00
termbits.h
[PATCH] tty: preparatory structures for termios revamp
2006-12-08 08:28:56 -08:00
termios.h
alpha termios.h hadn't been updated
2007-07-17 11:01:07 -07:00
thread_info.h
remove unused TIF_NOTIFY_RESUME flag
2007-07-31 15:39:38 -07:00
timex.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
tlb.h
add mm argument to pte/pmd/pud/pgd_free
2008-02-05 09:44:18 -08:00
tlbflush.h
alpha: fix warning by fixing flush_tlb_kernel_range()
2008-02-05 09:44:22 -08:00
topology.h
asm-generic: add node_to_cpumask_ptr macro
2008-04-19 19:44:58 +02:00
types.h
fix asm-alpha/types.h breakage
2008-05-04 14:45:55 -07:00
uaccess.h
[PATCH] remove verify_area(): remove verify_area() from various uaccess.h headers
2005-09-07 16:57:35 -07:00
ucontext.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
unaligned.h
kernel: Move arches to use common unaligned access
2008-04-29 08:06:27 -07:00
unistd.h
Alpha doesn't use socketcall
2008-02-05 09:44:21 -08:00
user.h
Sanitize the type of struct user.u_ar0
2008-02-07 08:42:30 -08:00
vga.h
ALPHA: support graphics on non-zero PCI domains
2007-06-01 08:18:29 -07:00
xor.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00