alistair23-linux/include/asm-alpha
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
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
atomic.h alpha: atomic_add_return() should return int 2008-02-05 09:44:21 -08:00
auxvec.h
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
byteorder.h alpha: replace __inline with inline 2008-04-28 08:58:27 -07:00
cache.h
cacheflush.h
checksum.h
compiler.h alpha: build fixes - force architecture 2007-04-17 16:36:27 -07:00
console.h
core_apecs.h
core_cia.h
core_irongate.h
core_lca.h
core_marvel.h
core_mcpcia.h alpha: fixes for specific machine types 2007-04-17 16:36:27 -07:00
core_polaris.h
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
current.h alpha: get_current(): don't add zero to current_thread_info()->task 2008-04-02 15:28:20 -07:00
delay.h
device.h
div64.h
dma-mapping.h alpha: fix ALSA DMA mmap crash 2008-04-02 15:28:19 -07:00
dma.h
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
err_common.h
err_ev6.h
err_ev7.h
errno.h
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
futex.h
gct.h
gentrap.h
hardirq.h
hw_irq.h
hwrpb.h
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
ioctls.h
ipcbuf.h
irq.h take declarations of enable_irq() et.al. to linux/interrupt.h 2007-07-22 11:44:00 -07:00
irq_regs.h
jensen.h
Kbuild
kdebug.h move die notifier handling to common code 2007-05-08 11:15:04 -07:00
kmap_types.h
kvm.h kvm: provide kvm.h for all architecture: fixes headers_install 2008-04-02 15:28:18 -07:00
linkage.h
local.h local_t: alpha extension 2007-05-08 11:15:20 -07:00
machvec.h
mc146818rtc.h
md.h
mman.h
mmu.h
mmu_context.h alpha: fix hard_smp_processor_id compile error 2007-05-15 08:54:00 -07:00
mmzone.h
module.h
msgbuf.h
mutex.h
namei.h
page.h CONFIG_HIGHPTE vs. sub-page page tables. 2008-02-08 09:22:42 -08:00
pal.h
param.h avoid overflows in kernel/time.c 2008-02-08 09:22:39 -08:00
parport.h
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
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
regdef.h
resource.h
rtc.h
rwsem.h
scatterlist.h Add CONFIG_DEBUG_SG sg validation 2007-10-22 21:20:03 +02:00
sections.h
segment.h
semaphore.h Generic semaphore implementation 2008-04-17 10:42:34 -04:00
sembuf.h
serial.h
setup.h
sfp-machine.h
shmbuf.h
shmparam.h
sigcontext.h
siginfo.h
signal.h
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
spinlock_types.h
stat.h
statfs.h
string.h [STRING]: Move strcasecmp/strncasecmp to lib/string.c 2007-04-26 01:54:39 -07:00
suspend.h
sysinfo.h
system.h Add cmpxchg64 and cmpxchg64_local to alpha 2008-02-07 08:42:30 -08:00
termbits.h
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
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
ucontext.h
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