ppc64: Abolish ioremap_mm
PATCH 1/1 ppc64: Abolish ioremap_mm
Andrew, please apply:
Currently ppc64 has two mm_structs for the kernel, init_mm and also ioremap_mm. The latter really isn't necessary: this patch abolishes it, instead restricting vmallocs to the lower 1TB of the init_mm's range and placing io mappings in the upper 1TB. This simplifies the code in a number of places and eliminates an unecessary set of pagetables. It also tweaks the unmap/free path a little, allowing us to remove the unmap_im_area() set of page table walkers, replacing them with unmap_vm_area().
arch/ppc64/kernel/eeh.c | 2 arch/ppc64/kernel/head.S | 4 - arch/ppc64/kernel/process.c | 8 --- arch/ppc64/mm/hash_utils.c | 4 - arch/ppc64/mm/imalloc.c | 20 +++++---- arch/ppc64/mm/init.c | 93 ++++-------------------------------------- include/asm-ppc64/imalloc.h | 12 +++-- include/asm-ppc64/page.h | 2 include/asm-ppc64/pgtable.h | 9 ---- include/asm-ppc64/processor.h | 10 ---- 10 files changed, 31 insertions(+), 133 deletions(-)
Signed-off-by David Gibson <[email protected]>
include/asm-ppc64/pgtable.h +2 -7
@@ -53,7 +53,8 @@* Define the address range of the vmalloc VM area. */ #define VMALLOC_START (0xD000000000000000ul) -#define VMALLOC_END (VMALLOC_START + EADDR_MASK) +#define VMALLOC_SIZE (0x10000000000UL) +#define VMALLOC_END (VMALLOC_START + VMALLOC_SIZE)/* * Bits in a linux-style PTE. These match the bits in the
@@ -239,9 +240,6 @@/* This now only contains the vmalloc pages */ #define pgd_offset_k (address) pgd_offset(&init_mm, address) -/* to find an entry in the ioremap page-table-directory */ -#define pgd_offset_i (address) (ioremap_pgd + pgd_index(address)) -/* * The following only work if pte_present() is true. * Undefined behaviour if not..
@@ -459,15 +457,12 @@#define __HAVE_ARCH_PTE_SAME#define pte_same (A ,B ) (((pte_val(A) ^ pte_val(B)) & ~_PAGE_HPTEFLAGS) == 0) -extern unsigned long ioremap_bot, ioremap_base; -#define pmd_ERROR (e) \ printk("%s:%d: bad pmd %08x.\n", __FILE__, __LINE__, pmd_val(e))#define pgd_ERROR (e) \ printk("%s:%d: bad pgd %08x.\n", __FILE__, __LINE__, pgd_val(e))extern pgd_t swapper_pg_dir[]; -extern pgd_t ioremap_dir[];extern void paging_init (void );
include/asm-ppc64/imalloc.h +7 -5
@@ -4,9 +4,9 @@/* * Define the address range of the imalloc VM area. */ -#define PHBS_IO_BASE IOREGIONBASE -#define IMALLOC_BASE (IOREGIONBASE + 0x80000000ul)/* Reserve 2 gigs for PHBs */ -#define IMALLOC_END (IOREGIONBASE + EADDR_MASK) +#define PHBS_IO_BASE VMALLOC_END +#define IMALLOC_BASE (PHBS_IO_BASE + 0x80000000ul)/* Reserve 2 gigs for PHBs */ +#define IMALLOC_END (VMALLOC_START + EADDR_MASK)/* imalloc region types */
@@ -18,7 +18,9 @@extern struct vm_struct *im_get_free_area (unsigned long size);extern struct vm_struct *im_get_area (unsigned long v_addr,unsigned long size, -int region_type); -unsigned long im_free (void *addr); +int region_type); +extern void im_free (void *addr); + +extern unsigned long ioremap_bot;#endif /* _PPC64_IMALLOC_H */
include/asm-ppc64/page.h +0 -2
@@ -202,9 +202,7 @@#define PAGE_OFFSET ASM_CONST(0xC000000000000000)#define KERNELBASE PAGE_OFFSET#define VMALLOCBASE ASM_CONST(0xD000000000000000) -#define IOREGIONBASE ASM_CONST(0xE000000000000000) -#define IO_REGION_ID (IOREGIONBASE >> REGION_SHIFT)#define VMALLOC_REGION_ID (VMALLOCBASE >> REGION_SHIFT)#define KERNEL_REGION_ID (KERNELBASE >> REGION_SHIFT)#define USER_REGION_ID (0UL)
arch/ppc64/kernel/eeh.c +1 -1
@@ -505,7 +505,7 @@pte_t *ptep;unsigned long pa; - ptep =find_linux_pte (ioremap_mm.pgd, token); + ptep =find_linux_pte (init_mm.pgd, token);if (!ptep)return token; pa =pte_pfn (*ptep) <<PAGE_SHIFT ;
arch/ppc64/kernel/process.c +0 -8
@@ -58,14 +58,6 @@struct task_struct *last_task_used_altivec =NULL ;#endif -struct mm_struct ioremap_mm = { - .pgd = ioremap_dir, - .mm_users =ATOMIC_INIT (2 ), - .mm_count =ATOMIC_INIT (1 ), - .cpu_vm_mask =CPU_MASK_ALL , - .page_table_lock =SPIN_LOCK_UNLOCKED , -}; -/* * Make sure the floating-point register state in the * the thread_struct is up to date for task tsk.
include/asm-ppc64/processor.h +0 -10
@@ -590,16 +590,6 @@ }/* -* Note: the vm_start and vm_end fields here should *not* -* be in kernel space. (Could vm_end == vm_start perhaps?) -*/ -#define IOREMAP_MMAP { &ioremap_mm, 0, 0x1000, NULL, \ - PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC, \ - 1, NULL, NULL } - -extern struct mm_struct ioremap_mm; - -/* * Return saved PC of a blocked thread. For now, this is the "user" PC */ #define thread_saved_pc (tsk) \
arch/ppc64/mm/hash_utils.c +0 -4
@@ -310,10 +310,6 @@ vsid =get_vsid (mm->context.id, ea);break ; -case IO_REGION_ID : - mm = &ioremap_mm; - vsid =get_kernel_vsid (ea); -break ;case VMALLOC_REGION_ID : mm = &init_mm; vsid =get_kernel_vsid (ea);
arch/ppc64/mm/init.c +9 -84
140 lines not on this page · raw message
arch/ppc64/kernel/head.S +0 -4
@@ -2121,10 +2121,6 @@ swapper_pg_dir: .space 4096 - .globl ioremap_dir -ioremap_dir: - .space 4096 - #ifdef CONFIG_SMP /* 1 page segment table per cpu (max 48, cpu0 allocated at STAB0_PHYS_ADDR) */ .globl stab_array
arch/ppc64/mm/imalloc.c +12 -8
@@ -15,6 +15,7 @@#include <asm/pgtable.h> #include <asm/semaphore.h> #include <asm/imalloc.h> +#include <asm/cacheflush.h> static DECLARE_MUTEX (imlist_sem);struct vm_struct * imlist =NULL ;
@@ -285,29 +286,32 @@return area; } -unsigned long im_free (void * addr) +void im_free (void * addr) {struct vm_struct **p, *tmp; -unsigned long ret_size =0 ;if (!addr) -return ret_size; -if ((PAGE_SIZE -1 ) & (unsigned long ) addr) { +return ; +if ((unsigned long ) addr & ~PAGE_MASK ) {printk (KERN_ERR "Trying to %s bad address (%p)\n" , __FUNCTION__, addr); -return ret_size; +return ; }down (&imlist_sem);for (p = &imlist ; (tmp = *p) ; p = &tmp->next) {if (tmp->addr == addr) { - ret_size = tmp->size; *p = tmp->next; + +/* XXX: do we need the lock? */ +spin_lock (&init_mm.page_table_lock); +unmap_vm_area (tmp); +spin_unlock (&init_mm.page_table_lock); +kfree (tmp);up (&imlist_sem); -return ret_size; +return ; } }up (&imlist_sem);printk (KERN_ERR "Trying to %s nonexistent area (%p)\n" , __FUNCTION__, addr); -return ret_size; }
Signature · 4 lines
David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/people/dgibson