linux/include/asm-sh
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
..
cpu-sh2 rtc: rtc-sh: Split out the CPU defs to asm/cpu/. 2008-01-28 13:18:58 +09:00
cpu-sh2a rtc: rtc-sh: Split out the CPU defs to asm/cpu/. 2008-01-28 13:18:58 +09:00
cpu-sh3 sh: Rename SH-3 CCR3 reg to avoid synclink_cs clash. 2008-02-25 18:49:44 +09:00
cpu-sh4 sh: Add support for SH7723 CPU subtype. 2008-04-18 09:50:07 -07:00
cpu-sh5 sh: Kill off more dead symbols. 2008-02-14 14:22:12 +09:00
dreamcast sh: Add maple bus support for the SEGA Dreamcast. 2007-09-21 15:55:55 +09:00
hd64465
landisk sh: landisk: Header cleanups. 2007-05-14 09:18:35 +09:00
mpc1211 PCI: remove initial bios sort of PCI devices on x86 2008-04-20 21:46:58 -07:00
sh03 sh: intc - remove redundant irq code for sh03, snapgear and titan 2007-09-21 11:57:47 +09:00
.gitignore
Kbuild sh: Fix posix_types.h userspace breakage from sh64 merge. 2008-01-28 13:19:02 +09:00
a.out.h aout: move STACK_TOP[_MAX] to asm/processor.h 2008-02-08 09:22:29 -08:00
adc.h
addrspace.h sh: Clean up places that make 29-bit physical assumptions. 2008-01-28 13:18:59 +09:00
atomic-grb.h sh: GUSA atomic rollback support. 2008-01-28 13:18:58 +09:00
atomic-irq.h sh: Split out atomic ops logically. 2006-12-12 08:42:08 +09:00
atomic-llsc.h sh: Split out atomic ops logically. 2006-12-12 08:42:08 +09:00
atomic.h sh: GUSA atomic rollback support. 2008-01-28 13:18:58 +09:00
auxvec.h sh: Provide the FPSCR init through AT_FPUCW. 2008-01-28 13:19:00 +09:00
bitops-grb.h sh: GUSA atomic rollback support. 2008-01-28 13:18:58 +09:00
bitops-irq.h sh: GUSA atomic rollback support. 2008-01-28 13:18:58 +09:00
bitops.h generic: implement __fls on all 64-bit archs 2008-04-26 19:21:16 +02:00
bug.h sh: Fix up generic BUG build for SH-5. 2008-01-28 13:18:52 +09:00
bugs.h sh: Initial support for the MX-G CPU. 2008-04-18 09:50:01 -07:00
byteorder.h sh: Fix more user header breakage from sh64 integration. 2008-03-14 17:21:09 +09:00
cache.h sh: Split out cache status bits per-CPU family. 2008-01-28 13:18:38 +09:00
cacheflush.h sh: Fix argument page dcache flushing regression. 2008-01-07 13:50:18 +09:00
checksum.h sh: Split out checksum.h in to _32 and _64 variants. 2008-01-28 13:18:45 +09:00
checksum_32.h sh: Split out checksum.h in to _32 and _64 variants. 2008-01-28 13:18:45 +09:00
checksum_64.h sh: comment tidying for sh64->sh migration. 2008-01-28 13:18:58 +09:00
clock.h sh: Implement clk_round_rate() in the clock framework. 2007-07-20 13:29:09 +09:00
cmpxchg-grb.h sh: GUSA atomic rollback support. 2008-01-28 13:18:58 +09:00
cmpxchg-irq.h sh: GUSA atomic rollback support. 2008-01-28 13:18:58 +09:00
cpu-features.h sh: Add 32-bit opcode feature CPU flag. 2007-05-09 01:35:01 +00:00
cputime.h
current.h
delay.h sh: Fix up the sh64 build. 2008-03-06 17:23:15 +09:00
device.h
div64.h
dma-mapping.h sh: declared coherent memory support V2 2008-01-28 13:19:04 +09:00
dma.h sh: dma: Fix CONFIG_SYSFS=n build. 2007-09-21 11:57:53 +09:00
dmabrg.h sh: SH7760 DMABRG support. 2007-05-09 17:36:15 +09:00
edosk7705.h fix file specification in comments 2007-05-09 08:58:16 +02:00
elf.h sh: Kill off superfluous __KERNEL__ check in asm/elf.h. 2008-01-28 13:19:00 +09:00
emergency-restart.h
entry-macros.S sh: Fix up HAS_SR_RB typo in entry-macros. 2008-02-26 14:28:48 +09:00
errno.h
fb.h fbdev: detect primary display device 2007-07-17 10:23:11 -07:00
fcntl.h
fixmap.h sh: Preparation for uncached jumps through PMB. 2008-01-28 13:18:59 +09:00
flat.h sh: Fix up binfmt_flat compile warnings. 2008-01-28 13:19:00 +09:00
fpu.h sh: Fix TIF_USEDFPU clearing under FPU emulation. 2008-03-26 19:09:21 +09:00
freq.h
futex-irq.h sh: Fix up futex implementation. 2007-06-18 13:58:32 +09:00
futex.h sh: Fix up futex implementation. 2007-06-18 13:58:32 +09:00
gpio.h sh: Add gpio.h stubs for PFC definitions. 2007-09-21 11:57:49 +09:00
hardirq.h
hd64461.h sh: include/asm-sh/: Spelling fixes. 2008-01-28 13:19:01 +09:00
heartbeat.h sh: heartbeat driver update. 2007-09-21 11:57:51 +09:00
hp6xx.h sh: Tidy include/asm-sh/hp6xx.h 2008-02-14 14:22:11 +09:00
hw_irq.h sh: intc - remove default interrupt priority tables 2008-01-28 13:19:02 +09:00
i2c-sh7760.h i2c: Renesas SH7760 I2C master driver 2008-04-22 22:16:47 +02:00
ide.h ide: remove ide_default_io_ctl() macro 2008-04-18 00:46:34 +02:00
ilsel.h sh: x3proto: ILSEL IRQ support. 2007-09-21 11:57:48 +09:00
io.h sh: fix ioreadN_rep and iowriteN_rep 2008-02-14 14:25:37 +09:00
io_generic.h
io_trapped.h sh: trapped io support V2 2008-02-14 14:22:09 +09:00
ioctl.h
ioctls.h sh: termios ioctl definitions 2008-02-14 14:22:07 +09:00
ipcbuf.h
irq.h sh: asm/irq.h needs asm/cpu/irq.h. 2008-02-14 14:22:12 +09:00
irq_regs.h
irqflags.h sh: Split out irqflags.h in to _32 and _64 variants. 2008-01-28 13:18:40 +09:00
irqflags_32.h sh: Split out irqflags.h in to _32 and _64 variants. 2008-01-28 13:18:40 +09:00
irqflags_64.h sh: Split out irqflags.h in to _32 and _64 variants. 2008-01-28 13:18:40 +09: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
keyboard.h
kgdb.h sh: Make kgdb i-cache flushing less inept. 2007-10-03 17:21:10 +09:00
kmap_types.h
kvm.h kvm: provide kvm.h for all architecture: fixes headers_install 2008-04-02 15:28:18 -07:00
lboxre2.h sh: Tidy up L-BOX area5 addresses. 2007-05-07 02:11:55 +00:00
linkage.h
local.h
machvec.h remove __attribute_used__ 2008-01-28 23:21:18 +01:00
magicpanelr2.h sh: Magic Panel R2 board support. 2007-09-21 11:57:54 +09:00
mc146818rtc.h
microdev.h sh: include/asm-sh/: Spelling fixes. 2008-01-28 13:19:01 +09:00
migor.h sh: Add MigoR header file 2008-04-18 09:50:03 -07:00
mman.h
mmu.h sh: Use a per-cpu ASID cache. 2007-02-13 10:54:45 +09:00
mmu_context.h sh: Move in the SH-5 mmu_context headers. 2008-01-28 13:18:41 +09:00
mmu_context_32.h sh: Move in the SH-5 mmu_context headers. 2008-01-28 13:18:41 +09:00
mmu_context_64.h sh: Get SH-5 caches working again post-unification. 2008-02-14 14:22:12 +09:00
mmzone.h sh: Support for multiple nodes. 2007-06-08 02:43:49 +00:00
module.h sh: Add SH-5 support to asm/module.h. 2008-01-28 13:18:39 +09:00
msgbuf.h
mutex.h
namei.h
page.h sh: Get SH-5 caches working again post-unification. 2008-02-14 14:22:12 +09:00
param.h sh: Always use CONFIG_HZ for HZ. 2008-01-28 13:19:01 +09:00
parport.h sh: Add parport stub for SuperIO ports. 2007-07-07 07:28:11 +09:00
pci.h sh: Get the SH-5 PCI support building. 2008-01-28 13:18:55 +09:00
percpu.h
pgalloc.h CONFIG_HIGHPTE vs. sub-page page tables. 2008-02-08 09:22:42 -08:00
pgtable.h sh: Stub in page_table_range_init() on nommu. 2008-01-28 13:19:00 +09:00
pgtable_32.h mm: introduce pte_special pte bit 2008-04-28 08:58:23 -07:00
pgtable_64.h mm: introduce pte_special pte bit 2008-04-28 08:58:23 -07:00
pm.h
poll.h Consolidate asm/poll.h 2007-05-11 08:29:34 -07:00
posix_types.h sh: Fix more user header breakage from sh64 integration. 2008-03-14 17:21:09 +09:00
posix_types_32.h sh: Fix posix_types.h userspace breakage from sh64 merge. 2008-01-28 13:19:02 +09:00
posix_types_64.h sh: Fix posix_types.h userspace breakage from sh64 merge. 2008-01-28 13:19:02 +09:00
processor.h sh: Add support for SH7723 CPU subtype. 2008-04-18 09:50:07 -07:00
processor_32.h sh: Fix occasional FPU register corruption under preempt. 2008-03-26 19:02:47 +09:00
processor_64.h sh: Fix occasional FPU register corruption under preempt. 2008-03-26 19:02:47 +09:00
ptrace.h sh: Share bug/debug traps across _32 and _64. 2008-01-28 13:18:50 +09:00
push-switch.h sh: push-switch fixups for work_struct API damage. 2006-12-12 08:42:07 +09:00
r7780rp.h sh: Hook up remaining IRQ sources for R7780MP FPGA. 2008-04-18 09:50:01 -07:00
resource.h
rtc.h rtc: rtc-sh: Split out the CPU defs to asm/cpu/. 2008-01-28 13:18:58 +09:00
rts7751r2d.h sh: trapped io support for r2d V2 2008-02-14 14:22:09 +09:00
rwsem.h sh: Warn against direct inclusion of <asm/rwsem.h>. 2007-06-08 11:56:31 +09:00
scatterlist.h sh: Kill off pgtable.h from scatterlist.h. 2008-01-28 13:19:00 +09:00
sdk7780.h sh: Add support for SDK7780 board. 2008-01-28 13:19:04 +09:00
se.h sh: Solution Engine SH7705 board and CPU updates. 2007-05-07 02:11:56 +00:00
se7206.h sh: SE7206 build fixes. 2006-12-06 10:45:37 +09:00
se7343.h
se7721.h sh: Add support for Solution Engine SH7721 board 2008-04-18 09:50:02 -07:00
se7722.h sh: SuperH KEYSC keypad data for Solution Engine 7722 2008-04-18 09:50:01 -07:00
se7751.h Fix misspellings of "system", "controller", "interrupt" and "necessary". 2007-10-19 23:10:43 +02:00
se7780.h sh: SH7780 Solution Engine board support. 2007-05-07 02:11:55 +00:00
sections.h sh: Preparation for uncached jumps through PMB. 2008-01-28 13:18:59 +09:00
segment.h
semaphore.h Generic semaphore implementation 2008-04-17 10:42:34 -04:00
sembuf.h
serial.h sh: rts7751r2d board updates. 2007-02-15 18:20:52 +09:00
setup.h sh: Move zero page param defs somewhere sensible. 2007-10-30 17:32:08 +09:00
sfp-machine.h
sh_bios.h
sh_keysc.h sh: SuperH KEYSC platform driver 2008-04-18 09:50:00 -07:00
shmbuf.h
shmin.h
shmparam.h
sigcontext.h sh: SH-2A FPU support. 2008-01-28 13:18:57 +09:00
siginfo.h
signal.h
smc37c93x.h
smp.h sh: Bring SMP support back from the dead. 2007-09-21 18:32:32 +09:00
snapgear.h sh: intc - remove redundant irq code for sh03, snapgear and titan 2007-09-21 11:57:47 +09: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
sparsemem.h sh: sparsemem support. 2007-06-08 02:43:43 +00:00
spi.h sh: add spi header and r2d platform data V3 2008-01-28 16:24:46 +09:00
spinlock.h sh: Overhaul spinlocks and rwlocks for SH-4A SMP. 2007-09-21 11:57:51 +09:00
spinlock_types.h sh: Overhaul spinlocks and rwlocks for SH-4A SMP. 2007-09-21 11:57:51 +09:00
stat.h sh: Special layout for SH-5 stat.h and user.h. 2008-01-28 13:18:53 +09:00
statfs.h
string.h sh: Split out asm/string.h for sh32 and sh64. 2008-01-28 13:18:40 +09:00
string_32.h sh: Split out asm/string.h for sh32 and sh64. 2008-01-28 13:18:40 +09:00
string_64.h sh: comment tidying for sh64->sh migration. 2008-01-28 13:18:58 +09:00
system.h sh: Create an sh debugfs root. 2008-04-18 09:50:01 -07:00
system_32.h sh: trapped io support V2 2008-02-14 14:22:09 +09:00
system_64.h sh: Preparation for uncached jumps through PMB. 2008-01-28 13:18:59 +09:00
systemh7751.h Fix misspellings of "system", "controller", "interrupt" and "necessary". 2007-10-19 23:10:43 +02:00
termbits.h sh: termios ioctl definitions 2008-02-14 14:22:07 +09:00
termios.h sh: termios ioctl definitions 2008-02-14 14:22:07 +09:00
thread_info.h remove __attribute_used__ 2008-01-28 23:21:18 +01:00
timer.h sh: clockevent/clocksource/hrtimers/nohz TMU support. 2007-05-09 17:33:24 +09:00
timex.h
titan.h sh: sh775x/titan fixes for irq header changes. 2006-12-06 12:05:02 +09:00
tlb.h sh: asm/tlb.h needs linux/pagemap.h for CONFIG_SWAP=n. 2008-02-14 14:22:11 +09:00
tlb_64.h sh: Move over the SH-5 head.S and tlb.h. 2008-01-28 13:18:44 +09:00
tlbflush.h remove unused flush_tlb_pgtables 2007-10-19 11:53:34 -07:00
topology.h sched, cpuset: customize sched domains, core 2008-04-19 19:45:00 +02:00
types.h sh: Share bug/debug traps across _32 and _64. 2008-01-28 13:18:50 +09:00
uaccess.h sh: make copy_to/from_user() static inline 2008-02-14 14:22:09 +09:00
uaccess_32.h sh: Fix up __access_ok() check for nommu. 2008-04-18 09:50:02 -07:00
uaccess_64.h sh: make copy_to/from_user() static inline 2008-02-14 14:22:09 +09:00
ubc.h sh: remove support for sh7300 and solution engine 7300 2007-07-26 15:37:57 +09:00
ucontext.h
unaligned.h
unistd.h sh: Split out syscall ABI for _32 and _64 variants. 2008-01-28 13:18:45 +09:00
unistd_32.h sh: Wire up new timerfd syscalls. 2008-02-14 14:22:08 +09:00
unistd_64.h sh: Wire up new timerfd syscalls. 2008-02-14 14:22:08 +09:00
user.h Sanitize the type of struct user.u_ar0 2008-02-07 08:42:30 -08:00
vga.h sh: Add a dummy vga.h. 2007-11-07 20:19:30 +09:00
watchdog.h
xor.h