12 #include <linux/slab.h>
13 #include <linux/export.h>
41 void *
element = remove_element(pool);
76 pool = kmalloc_node(
sizeof(*pool), gfp_mask |
__GFP_ZERO, node_id);
79 pool->
elements = kmalloc_node(min_nr *
sizeof(
void *),
89 pool->
alloc = alloc_fn;
103 add_element(pool, element);
134 if (new_min_nr <= pool->min_nr) {
135 while (new_min_nr < pool->curr_nr) {
136 element = remove_element(pool);
137 spin_unlock_irqrestore(&pool->
lock, flags);
141 pool->
min_nr = new_min_nr;
144 spin_unlock_irqrestore(&pool->
lock, flags);
147 new_elements =
kmalloc(new_min_nr *
sizeof(*new_elements), gfp_mask);
152 if (
unlikely(new_min_nr <= pool->min_nr)) {
154 spin_unlock_irqrestore(&pool->
lock, flags);
159 pool->
curr_nr *
sizeof(*new_elements));
162 pool->
min_nr = new_min_nr;
165 spin_unlock_irqrestore(&pool->
lock, flags);
171 add_element(pool, element);
173 spin_unlock_irqrestore(&pool->
lock, flags);
179 spin_unlock_irqrestore(&pool->
lock, flags);
209 gfp_temp = gfp_mask & ~(__GFP_WAIT|
__GFP_IO);
219 element = remove_element(pool);
220 spin_unlock_irqrestore(&pool->
lock, flags);
230 if (gfp_temp != gfp_mask) {
231 spin_unlock_irqrestore(&pool->
lock, flags);
237 if (!(gfp_mask & __GFP_WAIT)) {
238 spin_unlock_irqrestore(&pool->
lock, flags);
246 spin_unlock_irqrestore(&pool->
lock, flags);
310 add_element(pool, element);
311 spin_unlock_irqrestore(&pool->
lock, flags);
315 spin_unlock_irqrestore(&pool->
lock, flags);
345 return kmalloc(size, gfp_mask);