Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0a451145 authored by Kent Overstreet's avatar Kent Overstreet
Browse files

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: default avatarKent Overstreet <kmo@daterainc.com>
parent 78b77bf8
Loading
Loading
Loading
Loading
+1 −6
Original line number Diff line number Diff line
@@ -645,12 +645,7 @@ struct cache_set {
	 */
	mempool_t		*fill_iter;

	/*
	 * btree_sort() is a merge sort and requires temporary space - single
	 * element mempool
	 */
	struct mutex		sort_lock;
	struct bset		*sort;
	mempool_t		*sort_pool;
	unsigned		sort_crit_factor;

	/* List of buckets we're currently writing data to */
+5 −7
Original line number Diff line number Diff line
@@ -1047,11 +1047,12 @@ static void __btree_sort(struct btree *b, struct btree_iter *iter,
{
	uint64_t start_time;
	bool remove_stale = !b->written;
	bool used_mempool = false;
	struct bset *out = (void *) __get_free_pages(__GFP_NOWARN|GFP_NOIO,
						     order);
	if (!out) {
		mutex_lock(&b->c->sort_lock);
		out = b->c->sort;
		out = page_address(mempool_alloc(b->c->sort_pool, GFP_NOIO));
		used_mempool = true;
		order = ilog2(bucket_pages(b->c));
	}

@@ -1071,17 +1072,14 @@ static void __btree_sort(struct btree *b, struct btree_iter *iter,
		out->seq	= b->sets[0].data->seq;
		out->version	= b->sets[0].data->version;
		swap(out, b->sets[0].data);

		if (b->c->sort == b->sets[0].data)
			b->c->sort = out;
	} else {
		b->sets[start].data->keys = out->keys;
		memcpy(b->sets[start].data->start, out->start,
		       (void *) end(out) - (void *) out->start);
	}

	if (out == b->c->sort)
		mutex_unlock(&b->c->sort_lock);
	if (used_mempool)
		mempool_free(virt_to_page(out), b->c->sort_pool);
	else
		free_pages((unsigned long) out, order);

+2 −3
Original line number Diff line number Diff line
@@ -1352,7 +1352,6 @@ static void cache_set_free(struct closure *cl)
			kobject_put(&ca->kobj);

	free_pages((unsigned long) c->uuids, ilog2(bucket_pages(c)));
	free_pages((unsigned long) c->sort, ilog2(bucket_pages(c)));

	if (c->bio_split)
		bioset_free(c->bio_split);
@@ -1489,7 +1488,6 @@ struct cache_set *bch_cache_set_alloc(struct cache_sb *sb)
	init_waitqueue_head(&c->try_wait);
	init_waitqueue_head(&c->bucket_wait);
	sema_init(&c->uuid_write_mutex, 1);
	mutex_init(&c->sort_lock);

	spin_lock_init(&c->sort_time.lock);
	spin_lock_init(&c->btree_gc_time.lock);
@@ -1519,7 +1517,8 @@ struct cache_set *bch_cache_set_alloc(struct cache_sb *sb)
				bucket_pages(c))) ||
	    !(c->fill_iter = mempool_create_kmalloc_pool(1, iter_size)) ||
	    !(c->bio_split = bioset_create(4, offsetof(struct bbio, bio))) ||
	    !(c->sort = alloc_bucket_pages(GFP_KERNEL, c)) ||
	    !(c->sort_pool = mempool_create_page_pool(1,
				ilog2(bucket_pages(c)))) ||
	    !(c->uuids = alloc_bucket_pages(GFP_KERNEL, c)) ||
	    bch_journal_alloc(c) ||
	    bch_btree_cache_alloc(c) ||