bf72aeba2f
Some POWER5+ machines can do 64k hardware pages for normal memory but not for cache-inhibited pages. This patch lets us use 64k hardware pages for most user processes on such machines (assuming the kernel has been configured with CONFIG_PPC_64K_PAGES=y). User processes start out using 64k pages and get switched to 4k pages if they use any non-cacheable mappings. With this, we use 64k pages for the vmalloc region and 4k pages for the imalloc region. If anything creates a non-cacheable mapping in the vmalloc region, the vmalloc region will get switched to 4k pages. I don't know of any driver other than the DRM that would do this, though, and these machines don't have AGP. When a region gets switched from 64k pages to 4k pages, we do not have to clear out all the 64k HPTEs from the hash table immediately. We use the _PAGE_COMBO bit in the Linux PTE to indicate whether the page was hashed in as a 64k page or a set of 4k pages. If hash_page is trying to insert a 4k page for a Linux PTE and it sees that it has already been inserted as a 64k page, it first invalidates the 64k HPTE before inserting the 4k HPTE. The hash invalidation routines also use the _PAGE_COMBO bit, to determine whether to look for a 64k HPTE or a set of 4k HPTEs to remove. With those two changes, we can tolerate a mix of 4k and 64k HPTEs in the hash table, and they will all get removed when the address space is torn down. Signed-off-by: Paul Mackerras <paulus@samba.org> |
||
---|---|---|
.. | ||
vdso32 | ||
vdso64 | ||
align.c | ||
asm-offsets.c | ||
binfmt_elf32.c | ||
btext.c | ||
cpu_setup_6xx.S | ||
cpu_setup_power4.S | ||
cputable.c | ||
crash_dump.c | ||
crash.c | ||
dma_64.c | ||
entry_32.S | ||
entry_64.S | ||
firmware.c | ||
fpu.S | ||
head_4xx.S | ||
head_8xx.S | ||
head_32.S | ||
head_44x.S | ||
head_64.S | ||
head_booke.h | ||
head_fsl_booke.S | ||
ibmebus.c | ||
idle_6xx.S | ||
idle_power4.S | ||
idle.c | ||
init_task.c | ||
iomap.c | ||
iommu.c | ||
irq.c | ||
kprobes.c | ||
l2cr_6xx.S | ||
legacy_serial.c | ||
lparcfg.c | ||
lparmap.c | ||
machine_kexec_32.c | ||
machine_kexec_64.c | ||
machine_kexec.c | ||
Makefile | ||
misc_32.S | ||
misc_64.S | ||
module_32.c | ||
module_64.c | ||
nvram_64.c | ||
of_device.c | ||
paca.c | ||
pci_32.c | ||
pci_64.c | ||
pci_direct_iommu.c | ||
pci_dn.c | ||
pci_iommu.c | ||
perfmon_fsl_booke.c | ||
pmc.c | ||
ppc32.h | ||
ppc_ksyms.c | ||
proc_ppc64.c | ||
process.c | ||
prom_init.c | ||
prom_parse.c | ||
prom.c | ||
ptrace32.c | ||
ptrace-common.h | ||
ptrace.c | ||
rtas_flash.c | ||
rtas_pci.c | ||
rtas-proc.c | ||
rtas-rtc.c | ||
rtas.c | ||
semaphore.c | ||
setup_32.c | ||
setup_64.c | ||
setup-common.c | ||
setup.h | ||
signal_32.c | ||
signal_64.c | ||
smp-tbsync.c | ||
smp.c | ||
swsusp_32.S | ||
sys_ppc32.c | ||
syscalls.c | ||
sysfs.c | ||
systbl.S | ||
tau_6xx.c | ||
time.c | ||
traps.c | ||
udbg_16550.c | ||
udbg.c | ||
vdso.c | ||
vecemu.c | ||
vector.S | ||
vio.c | ||
vmlinux.lds.S |