linux/arch/sparc/kernel
David S. Miller 0dd5b7b09e sparc64: Fix physical memory management regressions with large max_phys_bits.
If max_phys_bits needs to be > 43 (f.e. for T4 chips), things like
DEBUG_PAGEALLOC stop working because the 3-level page tables only
can cover up to 43 bits.

Another problem is that when we increased MAX_PHYS_ADDRESS_BITS up to
47, several statically allocated tables became enormous.

Compounding this is that we will need to support up to 49 bits of
physical addressing for M7 chips.

The two tables in question are sparc64_valid_addr_bitmap and
kpte_linear_bitmap.

The first holds a bitmap, with 1 bit for each 4MB chunk of physical
memory, indicating whether that chunk actually exists in the machine
and is valid.

The second table is a set of 2-bit values which tell how large of a
mapping (4MB, 256MB, 2GB, 16GB, respectively) we can use at each 256MB
chunk of ram in the system.

These tables are huge and take up an enormous amount of the BSS
section of the sparc64 kernel image.  Specifically, the
sparc64_valid_addr_bitmap is 4MB, and the kpte_linear_bitmap is 128K.

So let's solve the space wastage and the DEBUG_PAGEALLOC problem
at the same time, by using the kernel page tables (as designed) to
manage this information.

We have to keep using large mappings when DEBUG_PAGEALLOC is disabled,
and we do this by encoding huge PMDs and PUDs.

On a T4-2 with 256GB of ram the kernel page table takes up 16K with
DEBUG_PAGEALLOC disabled and 256MB with it enabled.  Furthermore, this
memory is dynamically allocated at run time rather than coded
statically into the kernel image.

Signed-off-by: David S. Miller <davem@davemloft.net>
Acked-by: Bob Picco <bob.picco@oracle.com>
2014-10-05 16:53:39 -07:00
..
.gitignore
apc.c sparc idle: rename pm_idle to sparc_idle 2013-02-17 23:36:56 -05:00
asm-offsets.c [PATCH] sparc32: vm_area_struct access for old Sun SPARCs. 2013-07-10 13:56:10 -07:00
audit.c sparc64: fix sparse warnings in compat_audit.c 2014-05-18 19:01:34 -07:00
auxio_32.c sparc32: fix sparse warning in auxio_32.c 2014-05-18 19:01:27 -07:00
auxio_64.c sparc: remove __devinit, __devexit annotations 2013-01-12 15:28:45 -08:00
btext.c sparc64: fix sparse warning in btext.c 2014-05-18 19:01:30 -07:00
central.c sparc: remove __devinit, __devexit annotations 2013-01-12 15:28:45 -08:00
cherrs.S
chmc.c sparc: remove __devinit, __devexit annotations 2013-01-12 15:28:45 -08:00
compat_audit.c sparc64: fix sparse warnings in compat_audit.c 2014-05-18 19:01:34 -07:00
cpu.c sparc64: correctly recognise M6 and M7 cpu type 2014-09-09 15:24:10 -07:00
cpumap.c sparc64: support M6 and M7 for building CPU distribution map 2014-09-09 15:24:10 -07:00
cpumap.h sparc: drop use of extern for prototypes in arch/sparc/* 2014-05-18 19:01:29 -07:00
devices.c sparc32: drop tadpole specific code 2014-05-18 19:01:29 -07:00
dma.c
ds.c sparc64: Move request_irq() from ldc_bind() to ldc_alloc() 2014-09-16 18:31:31 -07:00
dtlb_miss.S
dtlb_prot.S
ebus.c sparc: delete non-required instances of include <linux/init.h> 2014-01-28 23:38:23 -08:00
entry.h sparc: drop use of extern for prototypes in arch/sparc/* 2014-05-18 19:01:29 -07:00
entry.S sparc32: Fix exit flag passed from traced sys_sigreturn 2013-07-31 19:10:04 -07:00
etrap_32.S
etrap_64.S
fpu_traps.S
ftrace.c ftrace: Do not pass data to ftrace_dyn_arch_init 2014-03-07 10:06:14 -05:00
getsetcc.S
head_32.S
head_64.S sparc64: correctly recognise M6 and M7 cpu type 2014-09-09 15:24:10 -07:00
helpers.S
hvapi.c sparc64: T5 PMU 2014-09-16 18:26:40 -07:00
hvcalls.S sparc64: T5 PMU 2014-09-16 18:26:40 -07:00
hvtramp.S sparc: delete non-required instances of include <linux/init.h> 2014-01-28 23:38:23 -08:00
idprom.c
iommu_common.h sparc: drop use of extern for prototypes in arch/sparc/* 2014-05-18 19:01:29 -07:00
iommu.c sparc64: fix sparse warning in pci.c 2014-05-18 19:01:31 -07:00
ioport.c sparc32: dma_alloc_coherent must honour gfp flags 2014-09-10 14:03:28 -07:00
irq_32.c sparc32: fix sparse warnings in irq_32.c 2014-04-29 01:12:25 -04:00
irq_64.c irq: Consolidate do_softirq() arch overriden implementations 2013-10-01 12:53:25 +02:00
irq.h sparc: drop use of extern for prototypes in arch/sparc/* 2014-05-18 19:01:29 -07:00
itlb_miss.S
ivec.S
jump_label.c
kernel.h sparc64: fix sparse warning in kgdb_64.c 2014-05-18 19:01:34 -07:00
kgdb_32.c sparc: explicitly include sched.h to get task_thread_info declaration 2013-02-06 11:04:10 -08:00
kgdb_64.c sparc64: fix sparse warning in kgdb_64.c 2014-05-18 19:01:34 -07:00
kprobes.c sparc64: fix sparse warnings in kprobes.c 2014-05-18 19:01:32 -07:00
kstack.h
ktlb.S sparc64: Fix physical memory management regressions with large max_phys_bits. 2014-10-05 16:53:39 -07:00
ldc.c sparc64: Move request_irq() from ldc_bind() to ldc_alloc() 2014-09-16 18:31:31 -07:00
led.c
leon_kernel.c sparc: leon: Fix race condition between leon_cycles_offset and timer_interrupt 2014-09-09 16:39:10 -07:00
leon_pci_grpci1.c sparc32: replace flip_dword() with swab32() 2014-05-02 01:30:21 -04:00
leon_pci_grpci2.c sparc32: replace flip_dword() with swab32() 2014-05-02 01:30:21 -04:00
leon_pci.c sparc32: introduce asm-generic/io.h 2014-05-02 01:30:21 -04:00
leon_pmc.c sparc32: fix sparse warnings in leon_pmc.c 2014-04-29 01:12:27 -04:00
leon_smp.c sparc32: fix sparse warnings in leon_smp.c 2014-04-29 01:12:27 -04:00
Makefile sparc32: drop tadpole specific code 2014-05-18 19:01:29 -07:00
mdesc.c sparc: Add support for seek and shorter read to /dev/mdesc 2014-07-21 21:37:06 -07:00
misctrap.S
module.c mm/arch: use NUMA_NO_NODE 2013-11-13 12:09:05 +09:00
nmi.c sparc64: Do not disable interrupts in nmi_cpu_busy() 2014-08-11 20:45:01 -07:00
of_device_32.c
of_device_64.c
of_device_common.c sparc: fix sparse warnings in of_device_common.c 2014-04-29 01:12:27 -04:00
of_device_common.h
pci_common.c sparc: delete non-required instances of include <linux/init.h> 2014-01-28 23:38:23 -08:00
pci_fire.c sparc: remove __devinit, __devexit annotations 2013-01-12 15:28:45 -08:00
pci_impl.h sparc: drop use of extern for prototypes in arch/sparc/* 2014-05-18 19:01:29 -07:00
pci_msi.c
pci_psycho.c sparc: remove __devinit, __devexit annotations 2013-01-12 15:28:45 -08:00
pci_sabre.c sparc: remove __devinit, __devexit annotations 2013-01-12 15:28:45 -08:00
pci_schizo.c sparc: remove __devinit, __devexit annotations 2013-01-12 15:28:45 -08:00
pci_sun4v_asm.S
pci_sun4v.c sparc: remove __devinit, __devexit annotations 2013-01-12 15:28:45 -08:00
pci_sun4v.h sparc: drop use of extern for prototypes in arch/sparc/* 2014-05-18 19:01:29 -07:00
pci.c sparc64: Properly claim resources as each PCI bus is probed. 2014-08-13 21:17:49 -07:00
pcic.c sparc32: fix sparse warnings in pcic.c 2014-05-18 19:01:27 -07:00
pcr.c sparc64: T5 PMU 2014-09-16 18:26:40 -07:00
perf_event.c sparc64: T5 PMU 2014-09-16 18:26:40 -07:00
pmc.c sparc idle: rename pm_idle to sparc_idle 2013-02-17 23:36:56 -05:00
power.c sparc: remove __devinit, __devexit annotations 2013-01-12 15:28:45 -08:00
process_32.c sparc32: fix sparse warning in auxio_32.c 2014-05-18 19:01:27 -07:00
process_64.c sparc64: Fix pcr_ops initialization and usage bugs. 2014-08-11 20:45:12 -07:00
prom_32.c
prom_64.c sparc64: fix sparse warning in prom_64.c 2014-05-18 19:01:31 -07:00
prom_common.c of: Fix locking vs. interrupts 2013-06-13 22:12:14 +01:00
prom_irqtrans.c
prom.h sparc: drop use of extern for prototypes in arch/sparc/* 2014-05-18 19:01:29 -07:00
psycho_common.c
psycho_common.h sparc: drop use of extern for prototypes in arch/sparc/* 2014-05-18 19:01:29 -07:00
ptrace_32.c sparc32: fix sparse warning in ptrace_32.c 2014-04-29 01:12:26 -04:00
ptrace_64.c sparc64: Implement HAVE_CONTEXT_TRACKING 2013-11-14 14:57:21 -08:00
reboot.c
rtrap_32.S
rtrap_64.S Merge branch 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2013-11-19 10:40:00 -08:00
sbus.c sparc: kernel/sbus.c: fix memory leakage 2013-01-21 14:33:00 -08:00
setup_32.c sparc32: fix sparse warnings in setup_32.c 2014-04-29 01:12:25 -04:00
setup_64.c sparc64: mem boot option correction 2014-09-16 18:23:11 -07:00
signal32.c sparc64: clean up compat_sigset_t.seta handling 2014-05-18 19:01:32 -07:00
signal_32.c sparc32: fix sparse warnings in signal_32.c 2014-04-29 01:12:25 -04:00
signal_64.c sparc64: fix sparse "Should it be static?" warnings in signal32.c 2014-05-18 19:01:32 -07:00
sigutil_32.c
sigutil_64.c
sigutil.h
smp_32.c sparc: fix decimal printf format specifiers prefixed with 0x 2014-08-06 14:41:10 -07:00
smp_64.c sparc64: Switch to 4-level page tables. 2014-10-05 16:53:38 -07:00
sparc_ksyms_32.c sparc: delete non-required instances of include <linux/init.h> 2014-01-28 23:38:23 -08:00
sparc_ksyms_64.c sparc: delete non-required instances of include <linux/init.h> 2014-01-28 23:38:23 -08:00
spiterrs.S
sstate.c
stacktrace.c
starfire.c
sun4d_irq.c sparc32: fix sparse warnings in sun4d_irq.c 2014-04-29 01:12:25 -04:00
sun4d_smp.c sparc: delete __cpuinit/__CPUINIT usage from all users 2013-07-14 19:36:52 -04:00
sun4m_irq.c sun4M: add include of slab.h for kzalloc 2014-02-12 16:10:45 -05:00
sun4m_smp.c sparc: delete __cpuinit/__CPUINIT usage from all users 2013-07-14 19:36:52 -04:00
sun4v_ivec.S
sun4v_tlb_miss.S sparc64: sun4v TLB error power off events 2014-09-16 17:46:44 -07:00
sys32.S sparc: Hook up renameat2 syscall. 2014-07-21 22:27:56 -07:00
sys_sparc32.c sparc64: fix sparse warnings in sys_sparc32.c 2014-05-18 19:01:31 -07:00
sys_sparc_32.c sparc32: fix sparse warnings in sys_sparc_32.c 2014-05-18 19:01:28 -07:00
sys_sparc_64.c sparc64: fix sparse warnings in sys_sparc_64.c + unaligned_64.c 2014-05-18 19:01:30 -07:00
syscalls.S sparc64: don't treat 64-bit syscall return codes as 32-bit 2014-03-17 15:54:52 -04:00
sysfs.c sparc64: fix format string mismatch in arch/sparc/kernel/sysfs.c 2014-05-21 12:54:42 -07:00
systbls_32.S sparc: Hook up memfd_create system call. 2014-08-13 22:00:09 -07:00
systbls_64.S sparc: Hook up memfd_create system call. 2014-08-13 22:00:09 -07:00
systbls.h sparc64: fix sparse warnings in sys_sparc32.c 2014-05-18 19:01:31 -07:00
time_32.c sparc32: fix sparse warnings in time_32.c 2014-05-18 19:01:27 -07:00
time_64.c ACPI and power management updates for 3.15-rc1 2014-04-01 12:48:54 -07:00
trampoline_32.S sparc: delete non-required instances of include <linux/init.h> 2014-01-28 23:38:23 -08:00
trampoline_64.S sparc: delete non-required instances of include <linux/init.h> 2014-01-28 23:38:23 -08:00
traps_32.c sparc: fix sparse warning in math_{32,64} 2014-05-18 19:01:28 -07:00
traps_64.c sparc64: sun4v TLB error power off events 2014-09-16 17:46:44 -07:00
tsb.S sparc64: Move from 4MB to 8MB huge pages. 2013-11-12 15:22:34 -08:00
ttable_32.S
ttable_64.S
una_asm_32.S
una_asm_64.S
unaligned_32.c sparc: use %s for unaligned panic 2014-07-21 21:37:06 -07:00
unaligned_64.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next 2014-06-19 07:50:07 -10:00
utrap.S
vio.c sparc64: Add vio_set_intr() to enable/disable Rx interrupts 2014-09-30 14:40:45 -07:00
viohs.c sparc: VIO protocol version 1.6 2014-09-30 14:17:08 -07:00
visemul.c
vmlinux.lds.S sparc64: Fix physical memory management regressions with large max_phys_bits. 2014-10-05 16:53:39 -07:00
windows.c sparc32: fix sparse warnings in windows.c 2014-04-29 01:12:25 -04:00
winfixup.S
wof.S
wuf.S