at v2.6.31-rc9 1.2 kB view raw
1#ifndef _FLEX_ARRAY_H 2#define _FLEX_ARRAY_H 3 4#include <linux/types.h> 5#include <asm/page.h> 6 7#define FLEX_ARRAY_PART_SIZE PAGE_SIZE 8#define FLEX_ARRAY_BASE_SIZE PAGE_SIZE 9 10struct flex_array_part; 11 12/* 13 * This is meant to replace cases where an array-like 14 * structure has gotten too big to fit into kmalloc() 15 * and the developer is getting tempted to use 16 * vmalloc(). 17 */ 18 19struct flex_array { 20 union { 21 struct { 22 int element_size; 23 int total_nr_elements; 24 struct flex_array_part *parts[]; 25 }; 26 /* 27 * This little trick makes sure that 28 * sizeof(flex_array) == PAGE_SIZE 29 */ 30 char padding[FLEX_ARRAY_BASE_SIZE]; 31 }; 32}; 33 34#define FLEX_ARRAY_INIT(size, total) { { {\ 35 .element_size = (size), \ 36 .total_nr_elements = (total), \ 37} } } 38 39struct flex_array *flex_array_alloc(int element_size, unsigned int total, 40 gfp_t flags); 41int flex_array_prealloc(struct flex_array *fa, unsigned int start, 42 unsigned int end, gfp_t flags); 43void flex_array_free(struct flex_array *fa); 44void flex_array_free_parts(struct flex_array *fa); 45int flex_array_put(struct flex_array *fa, unsigned int element_nr, void *src, 46 gfp_t flags); 47void *flex_array_get(struct flex_array *fa, unsigned int element_nr); 48 49#endif /* _FLEX_ARRAY_H */