linux/include/asm-generic
Christoph Lameter 8f6aac419b Generic Virtual Memmap support for SPARSEMEM
SPARSEMEM is a pretty nice framework that unifies quite a bit of code over all
the arches.  It would be great if it could be the default so that we can get
rid of various forms of DISCONTIG and other variations on memory maps.  So far
what has hindered this are the additional lookups that SPARSEMEM introduces
for virt_to_page and page_address.  This goes so far that the code to do this
has to be kept in a separate function and cannot be used inline.

This patch introduces a virtual memmap mode for SPARSEMEM, in which the memmap
is mapped into a virtually contigious area, only the active sections are
physically backed.  This allows virt_to_page page_address and cohorts become
simple shift/add operations.  No page flag fields, no table lookups, nothing
involving memory is required.

The two key operations pfn_to_page and page_to_page become:

   #define __pfn_to_page(pfn)      (vmemmap + (pfn))
   #define __page_to_pfn(page)     ((page) - vmemmap)

By having a virtual mapping for the memmap we allow simple access without
wasting physical memory.  As kernel memory is typically already mapped 1:1
this introduces no additional overhead.  The virtual mapping must be big
enough to allow a struct page to be allocated and mapped for all valid
physical pages.  This vill make a virtual memmap difficult to use on 32 bit
platforms that support 36 address bits.

However, if there is enough virtual space available and the arch already maps
its 1-1 kernel space using TLBs (f.e.  true of IA64 and x86_64) then this
technique makes SPARSEMEM lookups even more efficient than CONFIG_FLATMEM.
FLATMEM needs to read the contents of the mem_map variable to get the start of
the memmap and then add the offset to the required entry.  vmemmap is a
constant to which we can simply add the offset.

This patch has the potential to allow us to make SPARSMEM the default (and
even the only) option for most systems.  It should be optimal on UP, SMP and
NUMA on most platforms.  Then we may even be able to remove the other memory
models: FLATMEM, DISCONTIG etc.

[apw@shadowen.org: config cleanups, resplit code etc]
[kamezawa.hiroyu@jp.fujitsu.com: Fix sparsemem_vmemmap init]
[apw@shadowen.org: vmemmap: remove excess debugging]
[apw@shadowen.org: simplify initialisation code and reduce duplication]
[apw@shadowen.org: pull out the vmemmap code into its own file]
Signed-off-by: Christoph Lameter <clameter@sgi.com>
Signed-off-by: Andy Whitcroft <apw@shadowen.org>
Acked-by: Mel Gorman <mel@csn.ul.ie>
Cc: "Luck, Tony" <tony.luck@intel.com>
Cc: Andi Kleen <ak@suse.de>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-10-16 09:42:51 -07:00
..
bitops sched: simplify sched_find_first_bit() 2007-07-09 18:52:00 +02:00
4level-fixup.h [PATCH] Standardize pxx_page macros 2006-09-26 08:48:51 -07:00
atomic.h atomic.h: atomic_add_unless as inline. Remove system.h atomic.h circular dependency 2007-05-08 11:15:20 -07:00
audit_change_attr.h [PATCH] fix missing ifdefs in syscall classes hookup for generic targets 2006-09-22 17:48:56 -07:00
audit_dir_write.h [PATCH] fix missing ifdefs in syscall classes hookup for generic targets 2006-09-22 17:48:56 -07:00
audit_read.h [PATCH] audit: more syscall classes added 2006-09-11 13:32:27 -04:00
audit_signal.h [PATCH] add SIGNAL syscall class (v3) 2007-05-11 05:38:25 -04:00
audit_write.h [PATCH] audit: more syscall classes added 2006-09-11 13:32:27 -04:00
bitops.h [PATCH] bitops: update include/asm-generic/bitops.h 2006-03-26 08:57:15 -08:00
bug.h Fix WARN_ON() on bitfield ops 2007-07-31 21:12:07 -07:00
cputime.h [CPUFREQ] Remove slowdown from ondemand sampling path. 2006-06-30 01:29:47 -04: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-broken.h dma-mapping: prevent dma dependent code from linking on !HAS_DMA archs 2007-07-16 09:05:45 -07:00
dma-mapping.h [PATCH] Pass struct dev pointer to dma_cache_sync() 2006-12-07 08:39:41 -08:00
emergency-restart.h [PATCH] Add emergency_restart() 2005-07-26 14:35:41 -07:00
errno-base.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
fcntl.h Introduce O_CLOEXEC 2007-07-16 09:05:45 -07:00
futex.h [PATCH] mm: pagefault_{disable,enable}() 2006-12-07 08:39:21 -08:00
gpio.h [PATCH] GPIO core 2007-02-12 09:48:34 -08:00
ide_iops.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
ioctl.h [PATCH] Generic ioctl.h 2006-01-10 08:01:34 -08:00
iomap.h [PATCH] add Big Endian variants of ioread/iowrite 2005-04-16 15:25:54 -07:00
ipc.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
irq_regs.h IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
Kbuild Consolidate asm/poll.h 2007-05-11 08:29:34 -07:00
Kbuild.asm [PATCH] cleanup asm/setup.h userspace visibility 2006-12-07 08:39:46 -08:00
kdebug.h move die notifier handling to common code 2007-05-08 11:15:04 -07:00
libata-portmap.h libata-portmap: Remove unused definitions 2007-10-12 14:55:37 -04:00
local.h local_t: architecture independent extension 2007-05-08 11:15:20 -07:00
memory_model.h Generic Virtual Memmap support for SPARSEMEM 2007-10-16 09:42:51 -07:00
mm_hooks.h [PATCH] x86: PARAVIRT: add hooks to intercept mm creation and destruction 2007-05-02 19:27:14 +02:00
mman.h [PATCH] Remove final references to deprecated "MAP_ANON" page protection flag 2007-02-11 10:51:17 -08:00
mutex-dec.h fix file specification in comments 2006-10-03 23:01:26 +02:00
mutex-null.h fix file specification in comments 2006-10-03 23:01:26 +02:00
mutex-xchg.h fix file specification in comments 2006-10-03 23:01:26 +02:00
page.h Revert "[PATCH] LOG2: Alter get_order() so that it can make use of ilog2() on a constant" 2007-03-06 19:38:01 -08:00
pci-dma-compat.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
pci.h [PATCH] Make sparc64 use setup-res.c 2005-09-08 14:57:25 -07:00
percpu.h define new percpu interface for shared data 2007-07-19 10:04:44 -07:00
pgtable-nopmd.h [PATCH] Standardize pxx_page macros 2006-09-26 08:48:51 -07:00
pgtable-nopud.h [PATCH] Standardize pxx_page macros 2006-09-26 08:48:51 -07:00
pgtable.h changing include/asm-generic/pgtable.h for non-mmu 2007-08-11 15:47:42 -07:00
poll.h Consolidate asm/poll.h 2007-05-11 08:29:34 -07:00
resource.h [PATCH] nice and rt-prio rlimits 2005-05-01 08:59:00 -07:00
rtc.h fix file specification in comments 2006-10-03 23:01:26 +02:00
sections.h [PATCH] add __[start|end]_rodata sections to asm-generic/sections.h 2006-07-01 09:56:03 -07:00
siginfo.h [PATCH] consolidate SIGEV_PAD_SIZE 2005-05-01 08:59:08 -07:00
signal.h Add standard include guard to asm-generic/signal and use compiler.h 2006-04-27 06:57:23 +01:00
statfs.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
termios.h Define termios_1 functions for powerpc, s390, avr32 and frv 2007-09-12 09:08:05 -07:00
tlb.h fix file specification in comments 2006-10-03 23:01:26 +02:00
topology.h [PATCH] x86/x86_64: pcibus_to_node 2005-06-23 09:45:08 -07:00
uaccess.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
unaligned.h use __val in __get_unaligned 2007-07-31 15:39:42 -07:00
vmlinux.lds.h fix sparc32 breakage (result of vmlinux.lds.S bug) 2007-10-13 09:58:59 -07:00
xor.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00