1 /* 2 * Copyright (c) 2010 by The DragonFly Project and Samuel J. Greear. 3 * All rights reserved. 4 * 5 * This code is derived from software contributed to The DragonFly Project 6 * by Samuel J. Greear <sjg@thesjg.com> 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in 16 * the documentation and/or other materials provided with the 17 * distribution. 18 * 3. Neither the name of The DragonFly Project nor the names of its 19 * contributors may be used to endorse or promote products derived 20 * from this software without specific, prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 23 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 25 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 26 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 27 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, 28 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 29 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 30 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 31 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 32 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 */ 35 36 #include <sys/types.h> 37 #include <sys/kernel.h> 38 #include <sys/objcache.h> 39 #include <sys/systm.h> 40 #include <vm/vm.h> 41 #include <vm/pmap.h> 42 #include <vm/vm_extern.h> 43 #include <vm/vm_kern.h> 44 #include <vm/vm_page.h> 45 #include <cpu/lwbuf.h> 46 #include <machine/param.h> 47 48 static void lwbuf_init(void *); 49 SYSINIT(sock_lwb, SI_BOOT2_MACHDEP, SI_ORDER_ANY, lwbuf_init, NULL); 50 51 static struct objcache *lwbuf_cache; 52 53 MALLOC_DEFINE(M_LWBUF, "lwbuf", "Lightweight buffers"); 54 struct objcache_malloc_args lwbuf_malloc_args = { sizeof(struct lwbuf), M_LWBUF }; 55 56 57 static boolean_t 58 lwbuf_cache_ctor(void *obj, void *pdata, int ocflags) 59 { 60 struct lwbuf *lwb = (struct lwbuf *)obj; 61 62 lwb->m = NULL; 63 lwb->kva = 0; 64 65 return (TRUE); 66 } 67 68 static void 69 lwbuf_init(void *arg) 70 { 71 lwbuf_cache = objcache_create("lwbuf", 0, 0, 72 lwbuf_cache_ctor, NULL, NULL, 73 objcache_malloc_alloc, objcache_malloc_free, 74 &lwbuf_malloc_args); 75 } 76 77 struct lwbuf * 78 lwbuf_alloc(vm_page_t m) 79 { 80 struct lwbuf *lwb; 81 82 if ((lwb = objcache_get(lwbuf_cache, M_WAITOK)) == NULL) 83 return (NULL); 84 85 lwb->m = m; 86 lwb->kva = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(lwb->m)); 87 88 return (lwb); 89 } 90 91 void 92 lwbuf_free(struct lwbuf *lwb) 93 { 94 lwb->m = NULL; 95 96 objcache_put(lwbuf_cache, lwb); 97 } 98