diff options
author | Kent Overstreet <kmo@daterainc.com> | 2013-12-18 03:01:06 -0500 |
---|---|---|
committer | Kent Overstreet <kmo@daterainc.com> | 2014-01-08 16:05:11 -0500 |
commit | 0a45114534766058193eb2605c136562a4f7bcc8 (patch) | |
tree | 615fd89caaadb0235695551a8a46a5d7f332aa1e /drivers/md/bcache | |
parent | 78b77bf8b20431f8ad8a4db7e3120103bd922337 (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.h | 7 | ||||
-rw-r--r-- | drivers/md/bcache/bset.c | 12 | ||||
-rw-r--r-- | drivers/md/bcache/super.c | 5 |
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) || |