Date: Thu, 9 Dec 2010 06:34:28 +0000 (UTC) From: "Jayachandran C." <jchandra@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r216315 - in head/sys: conf mips/include mips/mips Message-ID: <201012090634.oB96YS4P026620@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jchandra Date: Thu Dec 9 06:34:28 2010 New Revision: 216315 URL: http://svn.freebsd.org/changeset/base/216315 Log: UMA_MD_SMALL_ALLOC for mips. Implement uma_small_alloc() and uma_small_free() for mips that allocates pages from direct mapped memory. Uses the same mechanism as the page table page allocator, so that we allocate from KSEG0 in 32 bit, and from XKPHYS on 64 bit. Reviewed by: alc, jmallett Added: head/sys/mips/mips/uma_machdep.c (contents, props changed) Modified: head/sys/conf/files.mips head/sys/mips/include/pmap.h head/sys/mips/include/vmparam.h head/sys/mips/mips/pmap.c Modified: head/sys/conf/files.mips ============================================================================== --- head/sys/conf/files.mips Thu Dec 9 05:16:20 2010 (r216314) +++ head/sys/conf/files.mips Thu Dec 9 06:34:28 2010 (r216315) @@ -63,6 +63,7 @@ mips/mips/support.S standard mips/mips/sys_machdep.c standard mips/mips/swtch.S standard mips/mips/uio_machdep.c standard +mips/mips/uma_machdep.c standard crypto/blowfish/bf_enc.c optional crypto | ipsec crypto/des/des_enc.c optional crypto | ipsec | netsmb geom/geom_bsd.c optional geom_bsd Modified: head/sys/mips/include/pmap.h ============================================================================== --- head/sys/mips/include/pmap.h Thu Dec 9 05:16:20 2010 (r216314) +++ head/sys/mips/include/pmap.h Thu Dec 9 06:34:28 2010 (r216315) @@ -163,6 +163,9 @@ void pmap_kenter_temporary_free(vm_paddr int pmap_compute_pages_to_dump(void); void pmap_flush_pvcache(vm_page_t m); int pmap_emulate_modified(pmap_t pmap, vm_offset_t va); +void pmap_grow_direct_page_cache(void); +vm_page_t pmap_alloc_direct_page(unsigned int index, int req); + #endif /* _KERNEL */ #endif /* !LOCORE */ Modified: head/sys/mips/include/vmparam.h ============================================================================== --- head/sys/mips/include/vmparam.h Thu Dec 9 05:16:20 2010 (r216314) +++ head/sys/mips/include/vmparam.h Thu Dec 9 06:34:28 2010 (r216315) @@ -149,6 +149,8 @@ #define VM_INITIAL_PAGEIN 16 #endif +#define UMA_MD_SMALL_ALLOC + /* * max number of non-contig chunks of physical RAM you can have */ Modified: head/sys/mips/mips/pmap.c ============================================================================== --- head/sys/mips/mips/pmap.c Thu Dec 9 05:16:20 2010 (r216314) +++ head/sys/mips/mips/pmap.c Thu Dec 9 06:34:28 2010 (r216315) @@ -185,8 +185,6 @@ static vm_page_t pmap_allocpte(pmap_t pm static vm_page_t _pmap_allocpte(pmap_t pmap, unsigned ptepindex, int flags); static int pmap_unuse_pt(pmap_t, vm_offset_t, vm_page_t); static int init_pte_prot(vm_offset_t va, vm_page_t m, vm_prot_t prot); -static vm_page_t pmap_alloc_pte_page(unsigned int index, int req); -static void pmap_grow_pte_page_cache(void); #ifdef SMP static void pmap_invalidate_page_action(void *arg); @@ -1062,8 +1060,8 @@ pmap_pinit0(pmap_t pmap) bzero(&pmap->pm_stats, sizeof pmap->pm_stats); } -static void -pmap_grow_pte_page_cache() +void +pmap_grow_direct_page_cache() { #ifdef __mips_n64 @@ -1073,8 +1071,8 @@ pmap_grow_pte_page_cache() #endif } -static vm_page_t -pmap_alloc_pte_page(unsigned int index, int req) +vm_page_t +pmap_alloc_direct_page(unsigned int index, int req) { vm_page_t m; @@ -1107,8 +1105,8 @@ pmap_pinit(pmap_t pmap) /* * allocate the page directory page */ - while ((ptdpg = pmap_alloc_pte_page(NUSERPGTBLS, VM_ALLOC_NORMAL)) == NULL) - pmap_grow_pte_page_cache(); + while ((ptdpg = pmap_alloc_direct_page(NUSERPGTBLS, VM_ALLOC_NORMAL)) == NULL) + pmap_grow_direct_page_cache(); ptdva = MIPS_PHYS_TO_DIRECT(VM_PAGE_TO_PHYS(ptdpg)); pmap->pm_segtab = (pd_entry_t *)ptdva; @@ -1141,11 +1139,11 @@ _pmap_allocpte(pmap_t pmap, unsigned pte /* * Find or fabricate a new pagetable page */ - if ((m = pmap_alloc_pte_page(ptepindex, VM_ALLOC_NORMAL)) == NULL) { + if ((m = pmap_alloc_direct_page(ptepindex, VM_ALLOC_NORMAL)) == NULL) { if (flags & M_WAITOK) { PMAP_UNLOCK(pmap); vm_page_unlock_queues(); - pmap_grow_pte_page_cache(); + pmap_grow_direct_page_cache(); vm_page_lock_queues(); PMAP_LOCK(pmap); } @@ -1313,7 +1311,7 @@ pmap_growkernel(vm_offset_t addr) #ifdef __mips_n64 if (*pdpe == 0) { /* new intermediate page table entry */ - nkpg = pmap_alloc_pte_page(nkpt, VM_ALLOC_INTERRUPT); + nkpg = pmap_alloc_direct_page(nkpt, VM_ALLOC_INTERRUPT); if (nkpg == NULL) panic("pmap_growkernel: no memory to grow kernel"); *pdpe = (pd_entry_t)MIPS_PHYS_TO_DIRECT(VM_PAGE_TO_PHYS(nkpg)); @@ -1333,7 +1331,7 @@ pmap_growkernel(vm_offset_t addr) /* * This index is bogus, but out of the way */ - nkpg = pmap_alloc_pte_page(nkpt, VM_ALLOC_INTERRUPT); + nkpg = pmap_alloc_direct_page(nkpt, VM_ALLOC_INTERRUPT); if (!nkpg) panic("pmap_growkernel: no memory to grow kernel"); nkpt++; Added: head/sys/mips/mips/uma_machdep.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/mips/mips/uma_machdep.c Thu Dec 9 06:34:28 2010 (r216315) @@ -0,0 +1,87 @@ +/*- + * Copyright (c) 2003 Alan L. Cox <alc@cs.rice.edu> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <sys/param.h> +#include <sys/lock.h> +#include <sys/mutex.h> +#include <sys/systm.h> +#include <vm/vm.h> +#include <vm/vm_page.h> +#include <vm/vm_pageout.h> +#include <vm/uma.h> +#include <vm/uma_int.h> +#include <machine/md_var.h> +#include <machine/vmparam.h> + +void * +uma_small_alloc(uma_zone_t zone, int bytes, u_int8_t *flags, int wait) +{ + static vm_pindex_t color; + vm_paddr_t pa; + vm_page_t m; + int pflags; + void *va; + + *flags = UMA_SLAB_PRIV; + + if ((wait & (M_NOWAIT|M_USE_RESERVE)) == M_NOWAIT) + pflags = VM_ALLOC_INTERRUPT; + else + pflags = VM_ALLOC_SYSTEM; + + for (;;) { + m = pmap_alloc_direct_page(color++, pflags); + if (m == NULL) { + if (wait & M_NOWAIT) + return (NULL); + else + pmap_grow_direct_page_cache(); + } else + break; + } + + pa = VM_PAGE_TO_PHYS(m); + va = (void *)MIPS_PHYS_TO_DIRECT(pa); + if ((wait & M_ZERO) && (m->flags & PG_ZERO) == 0) + bzero(va, PAGE_SIZE); + return (va); +} + +void +uma_small_free(void *mem, int size, u_int8_t flags) +{ + vm_page_t m; + vm_paddr_t pa; + + pa = MIPS_DIRECT_TO_PHYS((vm_offset_t)mem); + m = PHYS_TO_VM_PAGE(pa); + m->wire_count--; + vm_page_free(m); + atomic_subtract_int(&cnt.v_wire_count, 1); +}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201012090634.oB96YS4P026620>