Nick Piggin
7e675137a8
mm: introduce pte_special pte bit
...
s390 for one, cannot implement VM_MIXEDMAP with pfn_valid, due to their memory
model (which is more dynamic than most). Instead, they had proposed to
implement it with an additional path through vm_normal_page(), using a bit in
the pte to determine whether or not the page should be refcounted:
vm_normal_page()
{
...
if (unlikely(vma->vm_flags & (VM_PFNMAP|VM_MIXEDMAP))) {
if (vma->vm_flags & VM_MIXEDMAP) {
#ifdef s390
if (!mixedmap_refcount_pte(pte))
return NULL;
#else
if (!pfn_valid(pfn))
return NULL;
#endif
goto out;
}
...
}
This is fine, however if we are allowed to use a bit in the pte to determine
refcountedness, we can use that to _completely_ replace all the vma based
schemes. So instead of adding more cases to the already complex vma-based
scheme, we can have a clearly seperate and simple pte-based scheme (and get
slightly better code generation in the process):
vm_normal_page()
{
#ifdef s390
if (!mixedmap_refcount_pte(pte))
return NULL;
return pte_page(pte);
#else
...
#endif
}
And finally, we may rather make this concept usable by any architecture rather
than making it s390 only, so implement a new type of pte state for this.
Unfortunately the old vma based code must stay, because some architectures may
not be able to spare pte bits. This makes vm_normal_page a little bit more
ugly than we would like, but the 2 cases are clearly seperate.
So introduce a pte_special pte state, and use it in mm/memory.c. It is
currently a noop for all architectures, so this doesn't actually result in any
compiled code changes to mm/memory.o.
BTW:
I haven't put vm_normal_page() into arch code as-per an earlier suggestion.
The reason is that, regardless of where vm_normal_page is actually
implemented, the *abstraction* is still exactly the same. Also, while it
depends on whether the architecture has pte_special or not, that is the
only two possible cases, and it really isn't an arch specific function --
the role of the arch code should be to provide primitive functions and
accessors with which to build the core code; pte_special does that. We do
not want architectures to know or care about vm_normal_page itself, and
we definitely don't want them being able to invent something new there
out of sight of mm/ code. If we made vm_normal_page an arch function, then
we have to make vm_insert_mixed (next patch) an arch function too. So I
don't think moving it to arch code fundamentally improves any abstractions,
while it does practically make the code more difficult to follow, for both
mm and arch developers, and easier to misuse.
[akpm@linux-foundation.org: build fix]
Signed-off-by: Nick Piggin <npiggin@suse.de>
Acked-by: Carsten Otte <cotte@de.ibm.com>
Cc: Jared Hulbert <jaredeh@gmail.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-04-28 08:58:23 -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
alternative-asm.h
x86: rename .i assembler includes to .h
2007-10-17 20:16:29 +02:00
alternative.h
[PATCH] x86: SMP alternatives
2006-03-23 07:38:04 -08:00
apic.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
archparam-i386.h
[PATCH] uml: s390 preparation, elf.h
2005-05-05 16:36:37 -07:00
archparam-ppc.h
[PATCH] uml: remove some leftover PPC code
2006-10-20 10:26:36 -07:00
archparam-x86_64.h
[PATCH] uml: s390 preparation, elf.h
2005-05-05 16:36:37 -07:00
asm.h
uml: add asm-um/asm.h
2008-01-30 13:31:17 +01:00
atomic.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07: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
boot.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
bug.h
uml: use generic BUG
2007-06-24 08:59:11 -07:00
bugs.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
byteorder.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -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
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
calling.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
checksum.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
cmpxchg.h
x86: create asm/cmpxchg.h
2007-05-08 11:15:20 -07:00
cobalt.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
common.lds.S
uml: fix linker script alignment bugs
2007-08-31 01:42:22 -07:00
cpufeature.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
cputime.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
current.h
uml: current.h cleanup
2008-02-05 09:44:28 -08:00
delay.h
[PATCH] uml: fix unreasonably long udelay
2007-04-02 10:06:08 -07:00
desc.h
[PATCH] uml: implement {get,set}_thread_area for i386
2006-03-31 12:18:52 -08:00
device.h
Driver core: add dev_archdata to struct device
2006-12-01 14:52:01 -08:00
div64.h
[NET]: div64_64 consolidate (rev3)
2007-04-25 22:23:33 -07:00
dma-mapping.h
[PATCH] Pass struct dev pointer to dma_cache_sync()
2006-12-07 08:39:41 -08:00
dma.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
dwarf2.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
elf-i386.h
uml: style cleanup
2008-02-05 09:44:28 -08:00
elf-ppc.h
[PATCH] uml: fix apparent "CONFIG_64_BIT" typo.
2007-02-11 10:51:23 -08:00
elf-x86_64.h
uml: header untangling
2008-02-05 09:44:28 -08: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
fcntl.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
fixmap.h
uml: runtime host VMSPLIT detection
2008-02-08 09:22:42 -08:00
floppy.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
frame.h
x86: rename .i assembler includes to .h
2007-10-17 20:16:29 +02:00
futex.h
[PATCH] consolidate asm/futex.h
2006-01-08 20:13:39 -08:00
hardirq.h
Don't include linux/config.h from anywhere else in include/
2006-04-26 12:56:16 +01:00
highmem.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
host_ldt-i386.h
[PATCH] uml: split ldt.h in arch-independent and arch-dependant code
2006-03-31 12:18:51 -08:00
host_ldt-x86_64.h
[PATCH] uml: split ldt.h in arch-independent and arch-dependant code
2006-03-31 12:18:51 -08:00
hw_irq.h
[PATCH] genirq: add ->retrigger() irq op to consolidate hw_irq_resend()
2006-06-29 10:26:23 -07:00
ide.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
io.h
[PATCH] uml: add __raw_writeq definition
2006-06-30 11:25:38 -07: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
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
irq_regs.h
[PATCH] um: irq changes break build
2006-10-06 08:53:42 -07:00
irq_vectors.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
irqflags.h
[PATCH] uml: add asm/irqflags.h
2006-06-05 12:29:17 -07:00
kdebug.h
move die notifier handling to common code
2007-05-08 11:15:04 -07:00
keyboard.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
kmap_types.h
[PATCH] uml: make copy_*_user atomic
2006-07-01 09:56:03 -07:00
kvm.h
kvm: provide kvm.h for all architecture: fixes headers_install
2008-04-02 15:28:18 -07:00
ldt.h
uml: LDT mutex conversion
2008-02-05 09:44:31 -08:00
linkage.h
uml: get rid of asmlinkage
2008-02-05 09:44:25 -08:00
local.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
locks.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
mca_dma.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
mman.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
mmu.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
mmu_context.h
uml: cover stubs with a VMA
2008-02-05 09:44:29 -08:00
module-generic.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
module-i386.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
module-x86_64.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
mtrr.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
nops.h
git-x86: unbreak UML
2008-01-30 13:32:38 +01:00
page.h
CONFIG_HIGHPTE vs. sub-page page tables.
2008-02-08 09:22:42 -08:00
page_offset.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
param.h
uml: add back CONFIG_HZ
2008-02-05 09:44:31 -08:00
paravirt.h
uml: add asm/paravirt.h
2007-06-24 08:59:11 -07:00
pci.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
pda.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
percpu.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
pgalloc.h
CONFIG_HIGHPTE vs. sub-page page tables.
2008-02-08 09:22:42 -08:00
pgtable-2level.h
uml: 64-bit tlb fixes
2008-02-05 09:44:29 -08:00
pgtable-3level.h
uml: 64-bit tlb fixes
2008-02-05 09:44:29 -08:00
pgtable.h
mm: introduce pte_special pte bit
2008-04-28 08:58:23 -07:00
poll.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
posix_types.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
prctl.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
processor-generic.h
uml: runtime host VMSPLIT detection
2008-02-08 09:22:42 -08:00
processor-i386.h
uml: remove xmm checking on x86
2008-02-05 09:44:24 -08:00
processor-ppc.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
processor-x86_64.h
uml: x86_64 should copy %fs during fork
2008-02-08 09:22:43 -08:00
ptrace-generic.h
uml: ptrace floating point fixes
2007-10-16 09:43:07 -07:00
ptrace-i386.h
uml: ptrace floating point fixes
2007-10-16 09:43:07 -07:00
ptrace-x86_64.h
uml: remove code made redundant by CHOOSE_MODE removal
2007-10-16 09:43:05 -07:00
required-features.h
uml: fix build breakage
2007-05-09 12:30:48 -07:00
resource.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
rwlock.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
rwsem.h
[PATCH] remove gcc-2 checks
2006-01-08 20:14:02 -08:00
scatterlist.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
sections.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
segment.h
[PATCH] uml: check for differences in host support
2006-03-31 12:18:52 -08: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
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
setup.h
[PATCH] uml: command line handling cleanup
2005-05-06 22:09:29 -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-generic.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
sigcontext-i386.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
sigcontext-ppc.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
sigcontext-x86_64.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
siginfo.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
signal.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
smp.h
uml: fix inlines
2007-10-16 09:43:06 -07:00
socket.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
sockios.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
spinlock.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
spinlock_types.h
[PATCH] uml spinlock breakage
2005-09-10 16:50:01 -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
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
suspend.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
system-generic.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
system-i386.h
[PATCH] uml: UML/i386 cmpxchg fix
2005-09-17 11:50:01 -07:00
system-ppc.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
system-x86_64.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
termbits.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
termios.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
thread_info.h
uml: current.h cleanup
2008-02-05 09:44:28 -08:00
timex.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
tlb.h
uml: compile error fix
2008-04-15 19:35:40 -07:00
tlbflush.h
remove unused flush_tlb_pgtables
2007-10-19 11:53:34 -07:00
topology.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
types.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
uaccess.h
uml: header untangling
2008-02-05 09:44:28 -08: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
x86 merge fallout: uml
2007-10-29 07:41:32 -07:00
user.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
vga.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
vm-flags-i386.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
vm-flags-x86_64.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00
vm86.h
[PATCH] uml: vm86 compile fix
2005-07-28 21:46:03 -07:00
xor.h
Linux-2.6.12-rc2
2005-04-16 15:20:36 -07:00