gfp.h revision 270710
1254721Semaste/*- 2254721Semaste * Copyright (c) 2010 Isilon Systems, Inc. 3254721Semaste * Copyright (c) 2010 iX Systems, Inc. 4254721Semaste * Copyright (c) 2010 Panasas, Inc. 5254721Semaste * Copyright (c) 2013 Mellanox Technologies, Ltd. 6254721Semaste * All rights reserved. 7254721Semaste * 8254721Semaste * Redistribution and use in source and binary forms, with or without 9254721Semaste * modification, are permitted provided that the following conditions 10254721Semaste * are met: 11254721Semaste * 1. Redistributions of source code must retain the above copyright 12254721Semaste * notice unmodified, this list of conditions, and the following 13254721Semaste * disclaimer. 14254721Semaste * 2. Redistributions in binary form must reproduce the above copyright 15254721Semaste * notice, this list of conditions and the following disclaimer in the 16254721Semaste * documentation and/or other materials provided with the distribution. 17254721Semaste * 18254721Semaste * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19254721Semaste * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20254721Semaste * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21254721Semaste * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22254721Semaste * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23254721Semaste * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24254721Semaste * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25254721Semaste * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26254721Semaste * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27254721Semaste * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28254721Semaste */ 29254721Semaste 30254721Semaste#ifndef _LINUX_GFP_H_ 31254721Semaste#define _LINUX_GFP_H_ 32254721Semaste 33254721Semaste#include <sys/systm.h> 34254721Semaste#include <sys/malloc.h> 35254721Semaste 36254721Semaste#include <linux/page.h> 37254721Semaste 38254721Semaste#include <vm/vm_param.h> 39254721Semaste#include <vm/vm_object.h> 40254721Semaste#include <vm/vm_extern.h> 41254721Semaste#include <vm/vm_kern.h> 42254721Semaste 43254721Semaste#define __GFP_NOWARN 0 44254721Semaste#define __GFP_HIGHMEM 0 45254721Semaste#define __GFP_ZERO M_ZERO 46254721Semaste 47254721Semaste#define GFP_NOWAIT M_NOWAIT 48254721Semaste#define GFP_ATOMIC (M_NOWAIT | M_USE_RESERVE) 49254721Semaste#define GFP_KERNEL M_WAITOK 50254721Semaste#define GFP_USER M_WAITOK 51254721Semaste#define GFP_HIGHUSER M_WAITOK 52254721Semaste#define GFP_HIGHUSER_MOVABLE M_WAITOK 53254721Semaste#define GFP_IOFS M_NOWAIT 54254721Semaste 55254721Semastestatic inline void * 56254721Semastepage_address(struct page *page) 57254721Semaste{ 58254721Semaste 59254721Semaste if (page->object != kmem_object && page->object != kernel_object) 60254721Semaste return (NULL); 61254721Semaste return ((void *)(uintptr_t)(VM_MIN_KERNEL_ADDRESS + 62254721Semaste IDX_TO_OFF(page->pindex))); 63254721Semaste} 64254721Semaste 65254721Semastestatic inline unsigned long 66254721Semaste_get_page(gfp_t mask) 67254721Semaste{ 68254721Semaste 69254721Semaste return kmem_malloc(kmem_arena, PAGE_SIZE, mask); 70254721Semaste} 71254721Semaste 72254721Semaste#define get_zeroed_page(mask) _get_page((mask) | M_ZERO) 73254721Semaste#define alloc_page(mask) virt_to_page(_get_page((mask))) 74254721Semaste#define __get_free_page(mask) _get_page((mask)) 75254721Semaste 76254721Semastestatic inline void 77254721Semastefree_page(unsigned long page) 78254721Semaste{ 79254721Semaste 80254721Semaste if (page == 0) 81254721Semaste return; 82254721Semaste kmem_free(kmem_arena, page, PAGE_SIZE); 83254721Semaste} 84254721Semaste 85254721Semastestatic inline void 86254721Semaste__free_page(struct page *m) 87254721Semaste{ 88254721Semaste 89254721Semaste if (m->object != kmem_object) 90254721Semaste panic("__free_page: Freed page %p not allocated via wrappers.", 91254721Semaste m); 92254721Semaste kmem_free(kmem_arena, (vm_offset_t)page_address(m), PAGE_SIZE); 93254721Semaste} 94254721Semaste 95254721Semastestatic inline void 96254721Semaste__free_pages(struct page *m, unsigned int order) 97254721Semaste{ 98254721Semaste size_t size; 99254721Semaste 100254721Semaste if (m == NULL) 101254721Semaste return; 102254721Semaste size = PAGE_SIZE << order; 103254721Semaste kmem_free(kmem_arena, (vm_offset_t)page_address(m), size); 104254721Semaste} 105254721Semaste 106254721Semaste/* 107254721Semaste * Alloc pages allocates directly from the buddy allocator on linux so 108254721Semaste * order specifies a power of two bucket of pages and the results 109254721Semaste * are expected to be aligned on the size as well. 110254721Semaste */ 111254721Semastestatic inline struct page * 112254721Semastealloc_pages(gfp_t gfp_mask, unsigned int order) 113254721Semaste{ 114254721Semaste unsigned long page; 115254721Semaste size_t size; 116254721Semaste 117254721Semaste size = PAGE_SIZE << order; 118254721Semaste page = kmem_alloc_contig(kmem_arena, size, gfp_mask, 0, -1, 119254721Semaste size, 0, VM_MEMATTR_DEFAULT); 120254721Semaste if (page == 0) 121254721Semaste return (NULL); 122254721Semaste return (virt_to_page(page)); 123254721Semaste} 124254721Semaste 125254721Semaste#define alloc_pages_node(node, mask, order) alloc_pages(mask, order) 126254721Semaste 127254721Semaste#define kmalloc_node(chunk, mask, node) kmalloc(chunk, mask) 128254721Semaste 129254721Semaste#endif /* _LINUX_GFP_H_ */ 130254721Semaste