1/* 2 * xvmalloc memory allocator 3 * 4 * Copyright (C) 2008, 2009, 2010 Nitin Gupta 5 * 6 * This code is released using a dual license strategy: BSD/GPL 7 * You can choose the licence that better fits your requirements. 8 * 9 * Released under the terms of 3-clause BSD License 10 * Released under the terms of GNU General Public License Version 2.0 11 */ 12 13#ifndef _XV_MALLOC_INT_H_ 14#define _XV_MALLOC_INT_H_ 15 16#include <linux/kernel.h> 17#include <linux/types.h> 18 19/* User configurable params */ 20 21/* Must be power of two */ 22#define XV_ALIGN_SHIFT 2 23#define XV_ALIGN (1 << XV_ALIGN_SHIFT) 24#define XV_ALIGN_MASK (XV_ALIGN - 1) 25 26/* This must be greater than sizeof(link_free) */ 27#define XV_MIN_ALLOC_SIZE 32 28#define XV_MAX_ALLOC_SIZE (PAGE_SIZE - XV_ALIGN) 29 30/* Free lists are separated by FL_DELTA bytes */ 31#define FL_DELTA_SHIFT 3 32#define FL_DELTA (1 << FL_DELTA_SHIFT) 33#define FL_DELTA_MASK (FL_DELTA - 1) 34#define NUM_FREE_LISTS ((XV_MAX_ALLOC_SIZE - XV_MIN_ALLOC_SIZE) \ 35 / FL_DELTA + 1) 36 37#define MAX_FLI DIV_ROUND_UP(NUM_FREE_LISTS, BITS_PER_LONG) 38 39/* End of user params */ 40 41enum blockflags { 42 BLOCK_FREE, 43 PREV_FREE, 44 __NR_BLOCKFLAGS, 45}; 46 47#define FLAGS_MASK XV_ALIGN_MASK 48#define PREV_MASK (~FLAGS_MASK) 49 50struct freelist_entry { 51 struct page *page; 52 u16 offset; 53 u16 pad; 54}; 55 56struct link_free { 57 struct page *prev_page; 58 struct page *next_page; 59 u16 prev_offset; 60 u16 next_offset; 61}; 62 63struct block_header { 64 union { 65 /* This common header must be XV_ALIGN bytes */ 66 u8 common[XV_ALIGN]; 67 struct { 68 u16 size; 69 u16 prev; 70 }; 71 }; 72 struct link_free link; 73}; 74 75struct xv_pool { 76 ulong flbitmap; 77 ulong slbitmap[MAX_FLI]; 78 spinlock_t lock; 79 80 struct freelist_entry freelist[NUM_FREE_LISTS]; 81 82 /* stats */ 83 u64 total_pages; 84}; 85 86#endif 87