kernel-fxtec-pro1x/include/asm-s390
Martin Schwidefsky ba8a9229ab [S390] tlb flush fix.
The current tlb flushing code for page table entries violates the
s390 architecture in a small detail. The relevant section from the
principles of operation (SA22-7832-02 page 3-47):

   "A valid table entry must not be changed while it is attached
   to any CPU and may be used for translation by that CPU except to
   (1) invalidate the entry by using INVALIDATE PAGE TABLE ENTRY or
   INVALIDATE DAT TABLE ENTRY, (2) alter bits 56-63 of a page-table
   entry, or (3) make a change by means of a COMPARE AND SWAP AND
   PURGE instruction that purges the TLB."

That means if one thread of a multithreaded applciation uses a vma
while another thread does an unmap on it, the page table entries of
that vma needs to get removed with IPTE, IDTE or CSP. In some strange
and rare situations a cpu could check-stop (die) because a entry has
been pushed out of the TLB that is still needed to complete a
(milli-coded) instruction. I've never seen it happen with the current
code on any of the supported machines, so right now this is a
theoretical problem. But I want to fix it nevertheless, to avoid
headaches in the futures.

To get this implemented correctly without changing common code the
primitives ptep_get_and_clear, ptep_get_and_clear_full and
ptep_set_wrprotect need to use the IPTE instruction to invalidate the
pte before the new pte value gets stored. If IPTE is always used for
the three primitives three important operations will have a performace
hit: fork, mprotect and exit_mmap. Time for some workarounds:

* 1: ptep_get_and_clear_full is used in unmap_vmas to remove page
tables entries in a batched tlb gather operation. If the mmu_gather
context passed to unmap_vmas has been started with full_mm_flush==1
or if only one cpu is online or if the only user of a mm_struct is the
current process then the fullmm indication in the mmu_gather context is
set to one. All TLBs for mm_struct are flushed by the tlb_gather_mmu
call. No new TLBs can be created while the unmap is in progress. In
this case ptep_get_and_clear_full clears the ptes with a simple store.

* 2: ptep_get_and_clear is used in change_protection to clear the
ptes from the page tables before they are reentered with the new
access flags. At the end of the update flush_tlb_range clears the
remaining TLBs. In general the ptep_get_and_clear has to issue IPTE
for each pte and flush_tlb_range is a nop. But if there is only one
user of the mm_struct then ptep_get_and_clear uses simple stores
to do the update and flush_tlb_range will flush the TLBs.

* 3: Similar to 2, ptep_set_wrprotect is used in copy_page_range
for a fork to make all ptes of a cow mapping read-only. At the end of
of copy_page_range dup_mmap will flush the TLBs with a call to
flush_tlb_mm.  Check for mm->mm_users and if there is only one user
avoid using IPTE in ptep_set_wrprotect and let flush_tlb_mm clear the
TLBs.

Overall for single threaded programs the tlb flush code now performs
better, for multi threaded programs it is slightly worse. In particular
exit_mmap() now does a single IDTE for the mm and then just frees every
page cache reference and every page table page directly without a delay
over the mmu_gather structure.

Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
2007-10-22 12:52:48 +02:00
..
a.out.h arch: personality independent stack top 2007-07-19 10:04:45 -07:00
appldata.h [S390] Inline assembly cleanup. 2006-09-28 16:56:43 +02:00
atomic.h [S390] Change atomic_read/set to inline functions with barrier semantics. 2007-08-22 13:51:49 +02:00
auxvec.h [PATCH] auxiliary vector cleanups 2005-09-07 16:57:21 -07:00
bitops.h forbid asm/bitops.h direct inclusion 2007-10-19 11:53:41 -07:00
bug.h Fix WARN_ON() on bitfield ops for all other archs 2007-08-01 20:45:38 -07:00
bugs.h [S390] check_bugs() should be inline. 2007-03-05 23:35:50 +01:00
byteorder.h [S390] Inline assembly cleanup. 2006-09-28 16:56:43 +02:00
cache.h [S390] Get rid of ARCH_KMALLOC_MINALIGN. 2007-10-12 16:13:07 +02:00
cacheflush.h [PATCH] Optimize D-cache alias handling on fork 2006-12-13 09:27:08 -08:00
ccwdev.h [S390] cio: Introduce ccw_bus_type.shutdown. 2007-10-12 16:13:01 +02:00
ccwgroup.h [S390] cio: Add docbook comments. 2007-10-12 16:12:59 +02:00
checksum.h [S390] Fix TCP/UDP pseudo header checksum computation. 2007-03-26 20:43:46 +02:00
chpid.h [S390] cio: Channel-path configure function. 2007-04-27 16:01:39 +02:00
cio.h [S390] cio: Add docbook comments. 2007-10-12 16:12:59 +02:00
cmb.h [S390] cio: Kerneldoc comments for cmf. 2007-10-12 16:12:59 +02:00
compat.h Introduce compat_u64 and compat_s64 types 2007-07-16 09:05:48 -07:00
cpcmd.h [S390] cpcmd <-> __cpcmd calling issues 2006-12-04 15:40:30 +01:00
cpu.h [S390] Add per-cpu idle time / idle count sysfs attributes. 2007-10-22 12:52:47 +02:00
cputime.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
current.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
dasd.h [S390] New DASD feature for ERP related logging 2006-12-08 15:54:15 +01:00
debug.h [PATCH] Fix 'make headers_check' on s390 2006-09-16 12:54:31 -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
diag.h [S390] vmur: fix diag14 exceptions with addresses > 2GB. 2007-08-22 13:51:47 +02:00
div64.h [S390] __div64_32 for 31 bit. 2006-09-28 16:55:39 +02:00
dma.h [S390] empty function defines. 2006-09-20 15:58:51 +02:00
ebcdic.h [S390] Inline assembly cleanup. 2006-09-28 16:56:43 +02:00
elf.h [S390] add hardware capability support (ELF_HWCAP). 2007-05-04 18:48:35 +02:00
emergency-restart.h [PATCH] Add emergency_restart() 2005-07-26 14:35:41 -07:00
errno.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
etr.h [S390] ETR support. 2007-02-05 21:18:19 +01:00
extmem.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
fb.h fbdev: detect primary display device 2007-07-17 10:23:11 -07:00
fcntl.h [PATCH] Clean up struct flock64 definitions 2005-09-07 16:57:38 -07:00
futex.h [S390] don't call handle_mm_fault() if in an atomic context. 2007-01-09 10:18:50 +01:00
hardirq.h [S390] ETR support. 2007-02-05 21:18:19 +01:00
idals.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
io.h [S390] remove __io_virt and mmiowb. 2007-02-12 15:49:57 +01:00
ioctl.h [PATCH] Generic ioctl.h 2006-01-10 08:01:34 -08: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
ipl.h [S390] Avoid sparse warnings. 2007-05-10 15:45:52 +02:00
irq.h [PATCH] Make touch_nmi_watchdog imply touch_softlockup_watchdog on all archs 2006-09-29 09:18:05 -07:00
irq_regs.h [S390] irq change build fixes. 2006-10-06 16:38:35 +02:00
irqflags.h [S390] Inline assembly cleanup. 2006-09-28 16:56:43 +02:00
Kbuild [S390] Unexport <asm/z90crypt.h>, export <asm/zcrypt.h> in its place. 2006-09-24 22:07:25 +01:00
kdebug.h x86: optimize page faults like all other achitectures and kill notifier cruft 2007-10-16 09:42:50 -07:00
kexec.h kdump/kexec: calculate note size at compile time 2007-05-08 11:15:07 -07:00
kmap_types.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
kprobes.h kprobes: support kretprobe blacklist 2007-10-16 09:43:10 -07:00
linkage.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
local.h [S390] local_t cleanup : use asm-generic/local.h. 2007-02-21 10:55:55 +01:00
lowcore.h [S390] add hardware capability support (ELF_HWCAP). 2007-05-04 18:48:35 +02:00
mathemu.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
mman.h [PATCH] add asm-generic/mman.h 2006-02-15 15:32:22 -08:00
mmu.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
mmu_context.h [PATCH] x86: PARAVIRT: add hooks to intercept mm creation and destruction 2007-05-02 19:27:14 +02:00
module.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
monwriter.h [S390] Linux API for writing z/VM APPLDATA Monitor records. 2006-09-20 15:59:34 +02: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 [S390] s390: use PAGE_SIZE in vmlinux.lds 2007-10-12 16:13:10 +02:00
param.h [S390] Kconfig: use common Kconfig files for s390. 2007-05-10 15:46:08 +02:00
pci.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
percpu.h define new percpu interface for shared data 2007-07-19 10:04:44 -07:00
pgalloc.h [S390] tlb flush fix. 2007-10-22 12:52:48 +02:00
pgtable.h [S390] tlb flush fix. 2007-10-22 12:52:48 +02: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 [S390] s390: rename CPU_IDLE to S390_CPU_IDLE 2007-07-10 11:24:53 +02:00
ptrace.h [S390] Move psw_set_key. 2007-06-19 13:10:20 +02:00
qdio.h s390: free skbs in finite amount of time in qeth 2007-05-08 01:16:23 -04:00
qeth.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
reset.h [S390] Convert memory detection into C code. 2007-02-05 21:18:37 +01:00
resource.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
rwsem.h [S390] Inline assembly cleanup. 2006-09-28 16:56:43 +02:00
s390_ext.h [S390] remove packed attribute from ext_int_info_t. 2007-10-12 16:13:07 +02:00
s390_rdev.h [PATCH] s390: email-address change 2006-01-14 18:27:10 -08:00
scatterlist.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
sclp.h [S390] sclp: Test facility list before executing a service call. 2007-07-10 11:24:43 +02:00
sections.h [S390] nss: Free unused memory in kernel image. 2007-02-21 10:55:37 +01:00
segment.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
semaphore.h kill DECLARE_MUTEX_LOCKED 2007-10-17 08:42:47 -07:00
sembuf.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
setup.h [S390] zfcpdump support. 2007-04-27 16:01:44 +02:00
sfp-machine.h [S390] Bogomips calculation for 64 bit. 2007-07-10 11:24:47 +02:00
sfp-util.h [S390] Bogomips calculation for 64 bit. 2007-07-10 11:24:47 +02: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 [PATCH] s390: sigcontext.h vs __user 2006-01-14 18:27:08 -08:00
siginfo.h [PATCH] consolidate SIGEV_PAD_SIZE 2005-05-01 08:59:08 -07:00
signal.h [PATCH] irq-flags: S390: Use the new IRQF_ constants 2006-07-02 13:58:48 -07:00
sigp.h [S390] Inline assembly cleanup. 2006-09-28 16:56:43 +02:00
smp.h [S390] Convert to smp_call_function_single. 2007-07-27 12:29:17 +02:00
socket.h [NET]: Adding SO_TIMESTAMPNS / SCM_TIMESTAMPNS support 2007-04-25 22:24:21 -07:00
sockios.h [NET]: Introduce SIOCGSTAMPNS ioctl to get timestamps with nanosec resolution 2007-04-25 22:24:04 -07:00
spinlock.h [S390] incorrect placement of include. 2006-10-04 20:02:12 +02:00
spinlock_types.h [PATCH] Directed yield: direct yield of spinlocks for s390. 2006-10-01 00:39:22 -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 [S390] Inline assembly cleanup. 2006-09-28 16:56:43 +02:00
suspend.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
system.h [S390] Force link error if xchg/cmpxchg gets called with unsupported size. 2007-10-12 16:13:08 +02:00
tape390.h [S390] Add crypto support for 3592 tape devices 2007-02-05 21:18:26 +01:00
termbits.h lots-of-architectures: enable arbitary speed tty support 2007-07-10 17:51:13 -07:00
termios.h [PATCH] consolidate line discipline number definitions 2007-02-11 10:51:26 -08:00
thread_info.h [S390] preempt_count initialization. 2006-06-29 15:02:47 +02:00
timer.h [S390] Get rid of a lot of sparse warnings. 2007-02-05 21:16:47 +01:00
timex.h [S390] Support for s390 Pseudo Random Number Generator 2007-02-05 21:18:22 +01:00
tlb.h [S390] tlb flush fix. 2007-10-22 12:52:48 +02:00
tlbflush.h [S390] tlb flush fix. 2007-10-22 12:52:48 +02:00
todclk.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
topology.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
types.h remove strict ansi check from __u64 in asm/types.h 2007-10-17 08:42:53 -07:00
uaccess.h [S390] noexec protection 2007-02-05 21:18:17 +01:00
ucontext.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
unaligned.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
unistd.h [S390] Wire up sys_fallocate. 2007-07-27 12:29:19 +02:00
user.h [PATCH] s390: uml ptrace fixes 2005-06-04 17:13:00 -07:00
vtoc.h Use __uXX types for S390 DASD volume label definitions which are user-visible 2006-05-04 01:18:33 +01:00
xor.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
zcrypt.h [S390] zcrypt: remove duplicated struct CPRBX definition 2007-10-12 16:13:04 +02:00