Patch "dm thin: allocate the cell_sort_array dynamically" has been added to the 4.1-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
dm thin: allocate the cell_sort_array dynamically
to the 4.1-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
dm-thin-allocate-the-cell_sort_array-dynamically.patch
and it can be found in the queue-4.1 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
a822c83e47d97cdef38c4352e1ef62d9f46cfe98Mon Sep 17 00:00:00 2001
From: Joe Thornber <[email protected]>
Date: Fri, 3 Jul 2015 10:22:42 +0100
Subject: dm thin: allocate the cell_sort_array dynamically
From: Joe Thornber <[email protected]>
commit a822c83e47d97cdef38c4352e1ef62d9f46cfe98 upstream.
Given the pool's cell_sort_array holds 8192 pointers it triggers an order 5 allocation via kmalloc. This order 5 allocation is prone to failure as system memory gets more fragmented over time.
Fix this by allocating the cell_sort_array using vmalloc.
--- drivers/md/dm-thin.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
drivers/md/dm-thin.c +12 -1
@@ -18,6 +18,7 @@#include <linux/init.h> #include <linux/module.h> #include <linux/slab.h> +#include <linux/vmalloc.h> #include <linux/sort.h> #include <linux/rbtree.h>
@@ -260,7 +261,7 @@ struct pool {process_mapping_fn process_prepared_mapping;process_mapping_fn process_prepared_discard; -struct dm_bio_prison_cell *cell_sort_array[CELL_SORT_ARRAY_SIZE ]; +struct dm_bio_prison_cell **cell_sort_array; };static enum pool_mode get_pool_mode (struct pool *pool);
@@ -2499,6 +2500,7 @@ static void __pool_destroy(struct pool * {__pool_table_remove (pool); +vfree (pool->cell_sort_array);if (dm_pool_metadata_close (pool->pmd) <0 )DMWARN ("%s: dm_pool_metadata_close() failed." , __func__);
@@ -2611,6 +2613,13 @@ static struct pool *pool_create(struct m goto bad_mapping_pool; } + pool->cell_sort_array =vmalloc (sizeof (*pool->cell_sort_array) *CELL_SORT_ARRAY_SIZE ); +if (!pool->cell_sort_array) { + *error ="Error allocating cell sort array" ; + err_p =ERR_PTR (-ENOMEM ); + goto bad_sort_array; + } + pool->ref_count =1 ; pool->last_commit_jiffies = jiffies; pool->pool_md = pool_md;
@@ -2619,6 +2628,8 @@ static struct pool *pool_create(struct mreturn pool; +bad_sort_array: +mempool_destroy (pool->mapping_pool); bad_mapping_pool:dm_deferred_set_destroy (pool->all_io_ds); bad_all_io_ds:
Patches currently in stable-queue which might be from [email protected] are
queue-4.1/dm-btree-remove-fix-bug-in-redistribute3.patch queue-4.1/dm-btree-silence-lockdep-lock-inversion-in-dm_btree_del.patch queue-4.1/dm-cache-fix-race-when-issuing-a-policy_replace-operation.patch queue-4.1/dm-thin-allocate-the-cell_sort_array-dynamically.patch queue-4.1/dm-space-map-metadata-fix-occasional-leak-of-a-metadata-block-on-resize.patch