|
@@ -27,7 +27,15 @@ static void *remove_element(mempool_t *pool)
|
|
return pool->elements[--pool->curr_nr];
|
|
return pool->elements[--pool->curr_nr];
|
|
}
|
|
}
|
|
|
|
|
|
-static void free_pool(mempool_t *pool)
|
|
|
|
|
|
+/**
|
|
|
|
+ * mempool_destroy - deallocate a memory pool
|
|
|
|
+ * @pool: pointer to the memory pool which was allocated via
|
|
|
|
+ * mempool_create().
|
|
|
|
+ *
|
|
|
|
+ * Free all reserved elements in @pool and @pool itself. This function
|
|
|
|
+ * only sleeps if the free_fn() function sleeps.
|
|
|
|
+ */
|
|
|
|
+void mempool_destroy(mempool_t *pool)
|
|
{
|
|
{
|
|
while (pool->curr_nr) {
|
|
while (pool->curr_nr) {
|
|
void *element = remove_element(pool);
|
|
void *element = remove_element(pool);
|
|
@@ -36,6 +44,7 @@ static void free_pool(mempool_t *pool)
|
|
kfree(pool->elements);
|
|
kfree(pool->elements);
|
|
kfree(pool);
|
|
kfree(pool);
|
|
}
|
|
}
|
|
|
|
+EXPORT_SYMBOL(mempool_destroy);
|
|
|
|
|
|
/**
|
|
/**
|
|
* mempool_create - create a memory pool
|
|
* mempool_create - create a memory pool
|
|
@@ -86,7 +95,7 @@ mempool_t *mempool_create_node(int min_nr, mempool_alloc_t *alloc_fn,
|
|
|
|
|
|
element = pool->alloc(GFP_KERNEL, pool->pool_data);
|
|
element = pool->alloc(GFP_KERNEL, pool->pool_data);
|
|
if (unlikely(!element)) {
|
|
if (unlikely(!element)) {
|
|
- free_pool(pool);
|
|
|
|
|
|
+ mempool_destroy(pool);
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
add_element(pool, element);
|
|
add_element(pool, element);
|
|
@@ -171,23 +180,6 @@ out:
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(mempool_resize);
|
|
EXPORT_SYMBOL(mempool_resize);
|
|
|
|
|
|
-/**
|
|
|
|
- * mempool_destroy - deallocate a memory pool
|
|
|
|
- * @pool: pointer to the memory pool which was allocated via
|
|
|
|
- * mempool_create().
|
|
|
|
- *
|
|
|
|
- * this function only sleeps if the free_fn() function sleeps. The caller
|
|
|
|
- * has to guarantee that all elements have been returned to the pool (ie:
|
|
|
|
- * freed) prior to calling mempool_destroy().
|
|
|
|
- */
|
|
|
|
-void mempool_destroy(mempool_t *pool)
|
|
|
|
-{
|
|
|
|
- /* Check for outstanding elements */
|
|
|
|
- BUG_ON(pool->curr_nr != pool->min_nr);
|
|
|
|
- free_pool(pool);
|
|
|
|
-}
|
|
|
|
-EXPORT_SYMBOL(mempool_destroy);
|
|
|
|
-
|
|
|
|
/**
|
|
/**
|
|
* mempool_alloc - allocate an element from a specific memory pool
|
|
* mempool_alloc - allocate an element from a specific memory pool
|
|
* @pool: pointer to the memory pool which was allocated via
|
|
* @pool: pointer to the memory pool which was allocated via
|