Patch to kill ioremap_mm

John Rose johnrose at austin.ibm.com
Fri May 6 02:21:30 EST 2005


<apologies for resend>

Hi David-

Given that we use a separate allocation scheme for imalloc mappings,
does it make sense to lump these into the vmalloc mm_struct, and to
share the vmalloc address space?  This saves lines of code, but is it as
clear as the existing (separate) layout?

Thanks-
John


On Wed, 2005-05-04 at 20:42, David Gibson wrote:
> Can anyone see any problems with this patch.  If not, I'll send it on
> to akpm.
> 
> 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 gets rid of an unecessary set of
> pagetables.
> 
> Index: working-2.6/include/asm-ppc64/pgtable.h
> ===================================================================
> --- working-2.6.orig/include/asm-ppc64/pgtable.h	2005-05-05 10:58:04.000000000 +1000
> +++ working-2.6/include/asm-ppc64/pgtable.h	2005-05-05 11:12:59.000000000 +1000
> @@ -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);
>  
> Index: working-2.6/include/asm-ppc64/imalloc.h
> ===================================================================
> --- working-2.6.orig/include/asm-ppc64/imalloc.h	2005-05-05 10:58:04.000000000 +1000
> +++ working-2.6/include/asm-ppc64/imalloc.h	2005-05-05 11:13:39.000000000 +1000
> @@ -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 */
> @@ -21,4 +21,6 @@
>  			int region_type);
>  unsigned long im_free(void *addr);
>  
> +extern unsigned long ioremap_bot;
> +
>  #endif /* _PPC64_IMALLOC_H */
> Index: working-2.6/include/asm-ppc64/page.h
> ===================================================================
> --- working-2.6.orig/include/asm-ppc64/page.h	2005-05-05 10:58:04.000000000 +1000
> +++ working-2.6/include/asm-ppc64/page.h	2005-05-05 11:14:02.000000000 +1000
> @@ -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)
> Index: working-2.6/arch/ppc64/kernel/eeh.c
> ===================================================================
> --- working-2.6.orig/arch/ppc64/kernel/eeh.c	2005-04-26 15:37:55.000000000 +1000
> +++ working-2.6/arch/ppc64/kernel/eeh.c	2005-05-05 11:23:40.000000000 +1000
> @@ -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;
> Index: working-2.6/arch/ppc64/kernel/process.c
> ===================================================================
> --- working-2.6.orig/arch/ppc64/kernel/process.c	2005-04-26 15:37:55.000000000 +1000
> +++ working-2.6/arch/ppc64/kernel/process.c	2005-05-05 11:16:20.000000000 +1000
> @@ -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.
> Index: working-2.6/include/asm-ppc64/processor.h
> ===================================================================
> --- working-2.6.orig/include/asm-ppc64/processor.h	2005-04-26 15:38:02.000000000 +1000
> +++ working-2.6/include/asm-ppc64/processor.h	2005-05-05 11:24:46.000000000 +1000
> @@ -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)    \
> Index: working-2.6/arch/ppc64/mm/hash_utils.c
> ===================================================================
> --- working-2.6.orig/arch/ppc64/mm/hash_utils.c	2005-05-05 10:58:04.000000000 +1000
> +++ working-2.6/arch/ppc64/mm/hash_utils.c	2005-05-05 11:17:03.000000000 +1000
> @@ -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);
> Index: working-2.6/arch/ppc64/mm/init.c
> ===================================================================
> --- working-2.6.orig/arch/ppc64/mm/init.c	2005-05-05 10:58:04.000000000 +1000
> +++ working-2.6/arch/ppc64/mm/init.c	2005-05-05 11:22:54.000000000 +1000
> @@ -144,7 +144,7 @@
>  
>  	pte = pte_offset_kernel(pmd, addr);
>  	do {
> -		pte_t ptent = ptep_get_and_clear(&ioremap_mm, addr, pte);
> +		pte_t ptent = ptep_get_and_clear(&init_mm, addr, pte);
>  		WARN_ON(!pte_none(ptent) && !pte_present(ptent));
>  	} while (pte++, addr += PAGE_SIZE, addr != end);
>  }
> @@ -181,13 +181,13 @@
>  
>  static void unmap_im_area(unsigned long addr, unsigned long end)
>  {
> -	struct mm_struct *mm = &ioremap_mm;
> +	struct mm_struct *mm = &init_mm;
>  	unsigned long next;
>  	pgd_t *pgd;
>  
>  	spin_lock(&mm->page_table_lock);
>  
> -	pgd = pgd_offset_i(addr);
> +	pgd = pgd_offset_k(addr);
>  	flush_cache_vunmap(addr, end);
>  	do {
>  		next = pgd_addr_end(addr, end);
> @@ -214,21 +214,21 @@
>  	unsigned long vsid;
>  
>  	if (mem_init_done) {
> -		spin_lock(&ioremap_mm.page_table_lock);
> -		pgdp = pgd_offset_i(ea);
> -		pudp = pud_alloc(&ioremap_mm, pgdp, ea);
> +		spin_lock(&init_mm.page_table_lock);
> +		pgdp = pgd_offset_k(ea);
> +		pudp = pud_alloc(&init_mm, pgdp, ea);
>  		if (!pudp)
>  			return -ENOMEM;
> -		pmdp = pmd_alloc(&ioremap_mm, pudp, ea);
> +		pmdp = pmd_alloc(&init_mm, pudp, ea);
>  		if (!pmdp)
>  			return -ENOMEM;
> -		ptep = pte_alloc_kernel(&ioremap_mm, pmdp, ea);
> +		ptep = pte_alloc_kernel(&init_mm, pmdp, ea);
>  		if (!ptep)
>  			return -ENOMEM;
>  		pa = abs_to_phys(pa);
> -		set_pte_at(&ioremap_mm, ea, ptep, pfn_pte(pa >> PAGE_SHIFT,
> +		set_pte_at(&init_mm, ea, ptep, pfn_pte(pa >> PAGE_SHIFT,
>  							  __pgprot(flags)));
> -		spin_unlock(&ioremap_mm.page_table_lock);
> +		spin_unlock(&init_mm.page_table_lock);
>  	} else {
>  		unsigned long va, vpn, hash, hpteg;
>  
> 
> 




More information about the Linuxppc64-dev mailing list