From owner-svn-src-head@FreeBSD.ORG Sat May 22 21:38:57 2010 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 5FB7C106566B; Sat, 22 May 2010 21:38:57 +0000 (UTC) (envelope-from neel@FreeBSD.org) Received: from svn.freebsd.org (unknown [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 4F24C8FC1C; Sat, 22 May 2010 21:38:57 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o4MLcvLF076786; Sat, 22 May 2010 21:38:57 GMT (envelope-from neel@svn.freebsd.org) Received: (from neel@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o4MLcvkk076784; Sat, 22 May 2010 21:38:57 GMT (envelope-from neel@svn.freebsd.org) Message-Id: <201005222138.o4MLcvkk076784@svn.freebsd.org> From: Neel Natu Date: Sat, 22 May 2010 21:38:57 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r208422 - head/sys/mips/mips X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 22 May 2010 21:38:57 -0000 Author: neel Date: Sat May 22 21:38:57 2010 New Revision: 208422 URL: http://svn.freebsd.org/changeset/base/208422 Log: - Use ptpgzone zone to allocate page table pages irrespective of the amount of memory on a platform. Tested on the Sibyte with 256MB and 1GB memory configurations. - Replace vtophys() with MIPS_KSEG0_TO_PHYS() to convert a page table page's virtual address to physical. We can safely do this because page table pages are allocated out of KSEG0. - Add an assertion to verify that when a page table page is freed it contains all zeroes. We can now use it after allocation without zeroing it. Modified: head/sys/mips/mips/pmap.c Modified: head/sys/mips/mips/pmap.c ============================================================================== --- head/sys/mips/mips/pmap.c Sat May 22 21:34:14 2010 (r208421) +++ head/sys/mips/mips/pmap.c Sat May 22 21:38:57 2010 (r208422) @@ -110,10 +110,6 @@ __FBSDID("$FreeBSD$"); #define PMAP_SHPGPERPROC 200 #endif -#if defined(TARGET_XLR_XLS) -#define HIGHMEM_SUPPORT -#endif - #if !defined(PMAP_DIAGNOSTIC) #define PMAP_INLINE __inline #else @@ -197,10 +193,9 @@ static void pmap_invalidate_all_action(v static void pmap_update_page_action(void *arg); #endif -#ifdef HIGHMEM_SUPPORT -static void * pmap_ptpgzone_allocf(uma_zone_t, int, u_int8_t*, int); +static void pmap_ptpgzone_dtor(void *mem, int size, void *arg); +static void *pmap_ptpgzone_allocf(uma_zone_t, int, u_int8_t *, int); static uma_zone_t ptpgzone; -#endif struct local_sysmaps { struct mtx lock; @@ -542,11 +537,9 @@ pmap_init(void) pv_entry_high_water = 9 * (pv_entry_max / 10); uma_zone_set_obj(pvzone, &pvzone_obj, pv_entry_max); -#ifdef HIGHMEM_SUPPORT - ptpgzone = uma_zcreate("PT ENTRY", PAGE_SIZE, NULL, - NULL, NULL, NULL, PAGE_SIZE-1, UMA_ZONE_NOFREE); + ptpgzone = uma_zcreate("PT ENTRY", PAGE_SIZE, NULL, pmap_ptpgzone_dtor, + NULL, NULL, PAGE_SIZE - 1, UMA_ZONE_NOFREE | UMA_ZONE_ZINIT); uma_zone_set_allocf(ptpgzone, pmap_ptpgzone_allocf); -#endif } /*************************************************** @@ -880,21 +873,10 @@ pmap_qremove(vm_offset_t va, int count) static int _pmap_unwire_pte_hold(pmap_t pmap, vm_page_t m) { - vm_offset_t pteva; /* * unmap the page table page */ - pteva = (vm_offset_t)pmap->pm_segtab[m->pindex]; - if (pteva >= VM_MIN_KERNEL_ADDRESS) { - pmap_kremove(pteva); - kmem_free(kernel_map, pteva, PAGE_SIZE); - } else { - KASSERT(MIPS_IS_KSEG0_ADDR(pteva), - ("_pmap_unwire_pte_hold: 0x%0lx is not in kseg0", - (long)pteva)); - } - pmap->pm_segtab[m->pindex] = 0; --pmap->pm_stats.resident_count; @@ -939,7 +921,7 @@ pmap_unuse_pt(pmap_t pmap, vm_offset_t v mpte = pmap->pm_ptphint; } else { pteva = *pmap_pde(pmap, va); - mpte = PHYS_TO_VM_PAGE(vtophys(pteva)); + mpte = PHYS_TO_VM_PAGE(MIPS_KSEG0_TO_PHYS(pteva)); pmap->pm_ptphint = mpte; } } @@ -964,12 +946,27 @@ pmap_pinit0(pmap_t pmap) bzero(&pmap->pm_stats, sizeof pmap->pm_stats); } -#ifdef HIGHMEM_SUPPORT +static void +pmap_ptpgzone_dtor(void *mem, int size, void *arg) +{ +#ifdef INVARIANTS + static char zeropage[PAGE_SIZE]; + + KASSERT(size == PAGE_SIZE, + ("pmap_ptpgzone_dtor: invalid size %d", size)); + KASSERT(bcmp(mem, zeropage, PAGE_SIZE) == 0, + ("pmap_ptpgzone_dtor: freeing a non-zeroed page")); +#endif +} + static void * pmap_ptpgzone_allocf(uma_zone_t zone, int bytes, u_int8_t *flags, int wait) { vm_page_t m; vm_paddr_t paddr; + + KASSERT(bytes == PAGE_SIZE, + ("pmap_ptpgzone_allocf: invalid allocation size %d", bytes)); *flags = UMA_SLAB_PRIV; m = vm_phys_alloc_contig(1, 0, MIPS_KSEG0_LARGEST_PHYS, @@ -1006,8 +1003,6 @@ pmap_alloc_pte_page(pmap_t pmap, unsigne paddr = MIPS_KSEG0_TO_PHYS(va); m = PHYS_TO_VM_PAGE(paddr); - if ((m->flags & PG_ZERO) == 0) - bzero(va, PAGE_SIZE); m->pindex = index; m->valid = VM_PAGE_BITS_ALL; m->wire_count = 1; @@ -1026,55 +1021,6 @@ pmap_release_pte_page(vm_page_t m) va = (void *)MIPS_PHYS_TO_KSEG0(paddr); uma_zfree(ptpgzone, va); } -#else -static vm_page_t -pmap_alloc_pte_page(pmap_t pmap, unsigned int index, int wait, vm_offset_t *vap) -{ - vm_offset_t va; - vm_page_t m; - int locked, req; - - locked = mtx_owned(&pmap->pm_mtx); - req = VM_ALLOC_WIRED | VM_ALLOC_NOOBJ; - if (wait & M_WAITOK) - req |= VM_ALLOC_NORMAL; - else - req |= VM_ALLOC_INTERRUPT; - - m = vm_page_alloc(NULL, index, req); - if (m == NULL) { - if (wait & M_WAITOK) { - if (locked) { - mtx_assert(&vm_page_queue_mtx, MA_OWNED); - PMAP_UNLOCK(pmap); - vm_page_unlock_queues(); - } - VM_WAIT; - if (locked) { - vm_page_lock_queues(); - PMAP_LOCK(pmap); - } - } - return NULL; - } - - va = MIPS_PHYS_TO_KSEG0(VM_PAGE_TO_PHYS(m)); - if ((m->flags & PG_ZERO) == 0) - bzero((void *)va, PAGE_SIZE); - else - vm_page_flag_clear(m, PG_ZERO); - - m->valid = VM_PAGE_BITS_ALL; - *vap = (vm_offset_t)va; - return (m); -} - -static void -pmap_release_pte_page(vm_page_t m) -{ - vm_page_free(m); -} -#endif /* * Initialize a preallocated and zeroed pmap structure, @@ -1178,7 +1124,7 @@ retry: (pmap->pm_ptphint->pindex == ptepindex)) { m = pmap->pm_ptphint; } else { - m = PHYS_TO_VM_PAGE(vtophys(pteva)); + m = PHYS_TO_VM_PAGE(MIPS_KSEG0_TO_PHYS(pteva)); pmap->pm_ptphint = m; } m->wire_count++; @@ -1226,10 +1172,7 @@ pmap_release(pmap_t pmap) pmap->pm_stats.resident_count)); ptdva = (vm_offset_t)pmap->pm_segtab; - ptdpg = PHYS_TO_VM_PAGE(vtophys(ptdva)); - - KASSERT(MIPS_IS_KSEG0_ADDR(ptdva), - ("pmap_release: 0x%0lx is not in kseg0", (long)ptdva)); + ptdpg = PHYS_TO_VM_PAGE(MIPS_KSEG0_TO_PHYS(ptdva)); ptdpg->wire_count--; atomic_subtract_int(&cnt.v_wire_count, 1); @@ -2023,7 +1966,8 @@ pmap_enter_quick_locked(pmap_t pmap, vm_ (pmap->pm_ptphint->pindex == ptepindex)) { mpte = pmap->pm_ptphint; } else { - mpte = PHYS_TO_VM_PAGE(vtophys(pteva)); + mpte = PHYS_TO_VM_PAGE( + MIPS_KSEG0_TO_PHYS(pteva)); pmap->pm_ptphint = mpte; } mpte->wire_count++;