gfp.h revision 219820
1/*- 2 * Copyright (c) 2010 Isilon Systems, Inc. 3 * Copyright (c) 2010 iX Systems, Inc. 4 * Copyright (c) 2010 Panasas, Inc. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice unmodified, this list of conditions, and the following 12 * disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29#ifndef _LINUX_GFP_H_ 30#define _LINUX_GFP_H_ 31 32#include <sys/systm.h> 33#include <sys/malloc.h> 34 35#include <linux/page.h> 36 37#include <vm/vm_object.h> 38#include <vm/vm_extern.h> 39#include <vm/vm_kern.h> 40 41#define __GFP_NOWARN 0 42#define __GFP_HIGHMEM 0 43#define __GFP_ZERO M_ZERO 44 45#define GFP_NOWAIT M_NOWAIT 46#define GFP_ATOMIC (M_NOWAIT | M_USE_RESERVE) 47#define GFP_KERNEL M_WAITOK 48#define GFP_USER M_WAITOK 49#define GFP_HIGHUSER M_WAITOK 50#define GFP_HIGHUSER_MOVABLE M_WAITOK 51#define GFP_IOFS M_NOWAIT 52 53static inline void * 54page_address(struct page *page) 55{ 56 57 if (page->object != kmem_object && page->object != kernel_object) 58 return (NULL); 59 return (void *)(VM_MIN_KERNEL_ADDRESS + IDX_TO_OFF(page->pindex)); 60} 61 62static inline unsigned long 63_get_page(gfp_t mask) 64{ 65 66 return kmem_malloc(kmem_map, PAGE_SIZE, mask); 67} 68 69#define get_zeroed_page(mask) _get_page((mask) | M_ZERO) 70#define alloc_page(mask) virt_to_page(_get_page((mask))) 71#define __get_free_page(mask) _get_page((mask)) 72 73static inline void 74free_page(unsigned long page) 75{ 76 77 if (page == 0) 78 return; 79 kmem_free(kmem_map, page, PAGE_SIZE); 80} 81 82static inline void 83__free_page(struct page *m) 84{ 85 86 if (m->object != kmem_object) 87 panic("__free_page: Freed page %p not allocated via wrappers.", 88 m); 89 kmem_free(kmem_map, (vm_offset_t)page_address(m), PAGE_SIZE); 90} 91 92static inline void 93__free_pages(void *p, unsigned int order) 94{ 95 size_t size; 96 97 if (p == 0) 98 return; 99 size = PAGE_SIZE << order; 100 kmem_free(kmem_map, (vm_offset_t)p, size); 101} 102 103/* 104 * Alloc pages allocates directly from the buddy allocator on linux so 105 * order specifies a power of two bucket of pages and the results 106 * are expected to be aligned on the size as well. 107 */ 108static inline struct page * 109alloc_pages(gfp_t gfp_mask, unsigned int order) 110{ 111 unsigned long page; 112 size_t size; 113 114 size = PAGE_SIZE << order; 115 page = kmem_alloc_contig(kmem_map, size, gfp_mask, 0, -1, 116 size, 0, VM_MEMATTR_DEFAULT); 117 if (page == 0) 118 return (NULL); 119 return (virt_to_page(page)); 120} 121 122#endif /* _LINUX_GFP_H_ */ 123