diff options
author | jake <jake@FreeBSD.org> | 2002-12-27 03:11:29 +0000 |
---|---|---|
committer | jake <jake@FreeBSD.org> | 2002-12-27 03:11:29 +0000 |
commit | 16cc24455b991546fb087d4a1d3f0f1f61ba9f82 (patch) | |
tree | 4c86a8a5fe5b14a0b38c51f27bfc3f4916c0d4c2 | |
parent | 073c2d289bc3c4a88cbc7a5bb268f858e831a6a7 (diff) | |
download | FreeBSD-src-16cc24455b991546fb087d4a1d3f0f1f61ba9f82.zip FreeBSD-src-16cc24455b991546fb087d4a1d3f0f1f61ba9f82.tar.gz |
Implement uma_small_alloc and uma_small_free. Not yet used.
-rw-r--r-- | sys/sparc64/sparc64/vm_machdep.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/sys/sparc64/sparc64/vm_machdep.c b/sys/sparc64/sparc64/vm_machdep.c index 6549cca..548fceb 100644 --- a/sys/sparc64/sparc64/vm_machdep.c +++ b/sys/sparc64/sparc64/vm_machdep.c @@ -61,6 +61,8 @@ #include <vm/vm_map.h> #include <vm/vm_page.h> #include <vm/vm_param.h> +#include <vm/uma.h> +#include <vm/uma_int.h> #include <machine/cache.h> #include <machine/cpu.h> @@ -68,6 +70,7 @@ #include <machine/frame.h> #include <machine/md_var.h> #include <machine/ofw_machdep.h> +#include <machine/tlb.h> #include <machine/tstate.h> void @@ -298,6 +301,55 @@ swi_vm(void *v) */ } +void * +uma_small_alloc(uma_zone_t zone, int bytes, u_int8_t *flags, int wait) +{ + static vm_pindex_t color; + vm_offset_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; + + if (wait & M_ZERO) + pflags |= VM_ALLOC_ZERO; + + m = vm_page_alloc(NULL, color++, pflags | VM_ALLOC_NOOBJ); + + if (m) { + pa = VM_PAGE_TO_PHYS(m); + if (m->md.color != DCACHE_COLOR(pa)) { + KASSERT(m->md.colors[0] == 0 && m->md.colors[1] == 0, + ("uma_small_alloc: free page still has mappings!")); + m->md.color = DCACHE_COLOR(pa); + dcache_page_inval(pa); + } + va = (void *)TLB_PHYS_TO_DIRECT(pa); + if ((m->flags & PG_ZERO) == 0) + bzero(va, PAGE_SIZE); + return (va); + } + + return (NULL); +} + +void +uma_small_free(void *mem, int size, u_int8_t flags) +{ + vm_page_t m; + + m = PHYS_TO_VM_PAGE(TLB_DIRECT_TO_PHYS((vm_offset_t)mem)); + vm_page_lock_queues(); + vm_page_free(m); + vm_page_unlock_queues(); +} + /* * quick version of vm_fault */ |