aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/bcache
diff options
context:
space:
mode:
authorKent Overstreet <kmo@daterainc.com>2013-12-18 03:01:06 -0500
committerKent Overstreet <kmo@daterainc.com>2014-01-08 16:05:11 -0500
commit0a45114534766058193eb2605c136562a4f7bcc8 (patch)
tree615fd89caaadb0235695551a8a46a5d7f332aa1e /drivers/md/bcache
parent78b77bf8b20431f8ad8a4db7e3120103bd922337 (diff)
bcache: Use a mempool for mergesort temporary space
It was a single element mempool before, it's slightly cleaner to just use a real mempool. Signed-off-by: Kent Overstreet <kmo@daterainc.com>
Diffstat (limited to 'drivers/md/bcache')
-rw-r--r--drivers/md/bcache/bcache.h7
-rw-r--r--drivers/md/bcache/bset.c12
-rw-r--r--drivers/md/bcache/super.c5
3 files changed, 8 insertions, 16 deletions
diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h
index eb6f2e6927ad..25f017248a81 100644
--- a/drivers/md/bcache/bcache.h
+++ b/drivers/md/bcache/bcache.h
@@ -645,12 +645,7 @@ struct cache_set {
645 */ 645 */
646 mempool_t *fill_iter; 646 mempool_t *fill_iter;
647 647
648 /* 648 mempool_t *sort_pool;
649 * btree_sort() is a merge sort and requires temporary space - single
650 * element mempool
651 */
652 struct mutex sort_lock;
653 struct bset *sort;
654 unsigned sort_crit_factor; 649 unsigned sort_crit_factor;
655 650
656 /* List of buckets we're currently writing data to */ 651 /* List of buckets we're currently writing data to */
diff --git a/drivers/md/bcache/bset.c b/drivers/md/bcache/bset.c
index 98f0ced236b6..e6882659afb9 100644
--- a/drivers/md/bcache/bset.c
+++ b/drivers/md/bcache/bset.c
@@ -1047,11 +1047,12 @@ static void __btree_sort(struct btree *b, struct btree_iter *iter,
1047{ 1047{
1048 uint64_t start_time; 1048 uint64_t start_time;
1049 bool remove_stale = !b->written; 1049 bool remove_stale = !b->written;
1050 bool used_mempool = false;
1050 struct bset *out = (void *) __get_free_pages(__GFP_NOWARN|GFP_NOIO, 1051 struct bset *out = (void *) __get_free_pages(__GFP_NOWARN|GFP_NOIO,
1051 order); 1052 order);
1052 if (!out) { 1053 if (!out) {
1053 mutex_lock(&b->c->sort_lock); 1054 out = page_address(mempool_alloc(b->c->sort_pool, GFP_NOIO));
1054 out = b->c->sort; 1055 used_mempool = true;
1055 order = ilog2(bucket_pages(b->c)); 1056 order = ilog2(bucket_pages(b->c));
1056 } 1057 }
1057 1058
@@ -1071,17 +1072,14 @@ static void __btree_sort(struct btree *b, struct btree_iter *iter,
1071 out->seq = b->sets[0].data->seq; 1072 out->seq = b->sets[0].data->seq;
1072 out->version = b->sets[0].data->version; 1073 out->version = b->sets[0].data->version;
1073 swap(out, b->sets[0].data); 1074 swap(out, b->sets[0].data);
1074
1075 if (b->c->sort == b->sets[0].data)
1076 b->c->sort = out;
1077 } else { 1075 } else {
1078 b->sets[start].data->keys = out->keys; 1076 b->sets[start].data->keys = out->keys;
1079 memcpy(b->sets[start].data->start, out->start, 1077 memcpy(b->sets[start].data->start, out->start,
1080 (void *) end(out) - (void *) out->start); 1078 (void *) end(out) - (void *) out->start);
1081 } 1079 }
1082 1080
1083 if (out == b->c->sort) 1081 if (used_mempool)
1084 mutex_unlock(&b->c->sort_lock); 1082 mempool_free(virt_to_page(out), b->c->sort_pool);
1085 else 1083 else
1086 free_pages((unsigned long) out, order); 1084 free_pages((unsigned long) out, order);
1087 1085
diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c
index 677a604e7f3f..d05e75627714 100644
--- a/drivers/md/bcache/super.c
+++ b/drivers/md/bcache/super.c
@@ -1352,7 +1352,6 @@ static void cache_set_free(struct closure *cl)
1352 kobject_put(&ca->kobj); 1352 kobject_put(&ca->kobj);
1353 1353
1354 free_pages((unsigned long) c->uuids, ilog2(bucket_pages(c))); 1354 free_pages((unsigned long) c->uuids, ilog2(bucket_pages(c)));
1355 free_pages((unsigned long) c->sort, ilog2(bucket_pages(c)));
1356 1355
1357 if (c->bio_split) 1356 if (c->bio_split)
1358 bioset_free(c->bio_split); 1357 bioset_free(c->bio_split);
@@ -1489,7 +1488,6 @@ struct cache_set *bch_cache_set_alloc(struct cache_sb *sb)
1489 init_waitqueue_head(&c->try_wait); 1488 init_waitqueue_head(&c->try_wait);
1490 init_waitqueue_head(&c->bucket_wait); 1489 init_waitqueue_head(&c->bucket_wait);
1491 sema_init(&c->uuid_write_mutex, 1); 1490 sema_init(&c->uuid_write_mutex, 1);
1492 mutex_init(&c->sort_lock);
1493 1491
1494 spin_lock_init(&c->sort_time.lock); 1492 spin_lock_init(&c->sort_time.lock);
1495 spin_lock_init(&c->btree_gc_time.lock); 1493 spin_lock_init(&c->btree_gc_time.lock);
@@ -1519,7 +1517,8 @@ struct cache_set *bch_cache_set_alloc(struct cache_sb *sb)
1519 bucket_pages(c))) || 1517 bucket_pages(c))) ||
1520 !(c->fill_iter = mempool_create_kmalloc_pool(1, iter_size)) || 1518 !(c->fill_iter = mempool_create_kmalloc_pool(1, iter_size)) ||
1521 !(c->bio_split = bioset_create(4, offsetof(struct bbio, bio))) || 1519 !(c->bio_split = bioset_create(4, offsetof(struct bbio, bio))) ||
1522 !(c->sort = alloc_bucket_pages(GFP_KERNEL, c)) || 1520 !(c->sort_pool = mempool_create_page_pool(1,
1521 ilog2(bucket_pages(c)))) ||
1523 !(c->uuids = alloc_bucket_pages(GFP_KERNEL, c)) || 1522 !(c->uuids = alloc_bucket_pages(GFP_KERNEL, c)) ||
1524 bch_journal_alloc(c) || 1523 bch_journal_alloc(c) ||
1525 bch_btree_cache_alloc(c) || 1524 bch_btree_cache_alloc(c) ||