mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
dm thin: allocate the cell_sort_array dynamically
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. Signed-off-by: Joe Thornber <ejt@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com> [lizf: Backported 3.4: it's prinson_{create,destroy}() that need fixing] Signed-off-by: Zefan Li <lizefan@huawei.com>
This commit is contained in:
parent
9b733904f3
commit
ac1adeabea
1 changed files with 10 additions and 4 deletions
|
@ -13,6 +13,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/vmalloc.h>
|
||||
|
||||
#define DM_MSG_PREFIX "thin"
|
||||
|
||||
|
@ -149,9 +150,7 @@ static struct bio_prison *prison_create(unsigned nr_cells)
|
|||
{
|
||||
unsigned i;
|
||||
uint32_t nr_buckets = calc_nr_buckets(nr_cells);
|
||||
size_t len = sizeof(struct bio_prison) +
|
||||
(sizeof(struct hlist_head) * nr_buckets);
|
||||
struct bio_prison *prison = kmalloc(len, GFP_KERNEL);
|
||||
struct bio_prison *prison = kmalloc(sizeof(*prison), GFP_KERNEL);
|
||||
|
||||
if (!prison)
|
||||
return NULL;
|
||||
|
@ -164,9 +163,15 @@ static struct bio_prison *prison_create(unsigned nr_cells)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
prison->cells = vmalloc(sizeof(*prison->cells) * nr_buckets);
|
||||
if (!prison->cells) {
|
||||
mempool_destroy(prison->cell_pool);
|
||||
kfree(prison);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
prison->nr_buckets = nr_buckets;
|
||||
prison->hash_mask = nr_buckets - 1;
|
||||
prison->cells = (struct hlist_head *) (prison + 1);
|
||||
for (i = 0; i < nr_buckets; i++)
|
||||
INIT_HLIST_HEAD(prison->cells + i);
|
||||
|
||||
|
@ -175,6 +180,7 @@ static struct bio_prison *prison_create(unsigned nr_cells)
|
|||
|
||||
static void prison_destroy(struct bio_prison *prison)
|
||||
{
|
||||
vfree(prison->cells);
|
||||
mempool_destroy(prison->cell_pool);
|
||||
kfree(prison);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue