Commit 198d6700 authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet
Browse files

bcachefs: add functionality for heaps to update backpointers

parent 2252aa27
Loading
Loading
Loading
Loading
+9 −7
Original line number Diff line number Diff line
@@ -583,7 +583,8 @@ static void find_reclaimable_buckets_lru(struct bch_fs *c, struct bch_dev *ca)
			e.nr++;
		} else {
			if (e.nr)
				heap_add_or_replace(&ca->alloc_heap, e, -bucket_alloc_cmp);
				heap_add_or_replace(&ca->alloc_heap, e,
					-bucket_alloc_cmp, NULL);

			e = (struct alloc_heap_entry) {
				.bucket = b,
@@ -596,14 +597,15 @@ static void find_reclaimable_buckets_lru(struct bch_fs *c, struct bch_dev *ca)
	}

	if (e.nr)
		heap_add_or_replace(&ca->alloc_heap, e, -bucket_alloc_cmp);
		heap_add_or_replace(&ca->alloc_heap, e,
				-bucket_alloc_cmp, NULL);

	for (i = 0; i < ca->alloc_heap.used; i++)
		nr += ca->alloc_heap.data[i].nr;

	while (nr - ca->alloc_heap.data[0].nr >= ALLOC_SCAN_BATCH(ca)) {
		nr -= ca->alloc_heap.data[0].nr;
		heap_pop(&ca->alloc_heap, e, -bucket_alloc_cmp);
		heap_pop(&ca->alloc_heap, e, -bucket_alloc_cmp, NULL);
	}

	up_read(&ca->bucket_lock);
@@ -633,7 +635,7 @@ static void find_reclaimable_buckets_fifo(struct bch_fs *c, struct bch_dev *ca)
		if (bch2_can_invalidate_bucket(ca, b, m)) {
			struct alloc_heap_entry e = { .bucket = b, .nr = 1, };

			heap_add(&ca->alloc_heap, e, bucket_alloc_cmp);
			heap_add(&ca->alloc_heap, e, bucket_alloc_cmp, NULL);
			if (heap_full(&ca->alloc_heap))
				break;
		}
@@ -660,7 +662,7 @@ static void find_reclaimable_buckets_random(struct bch_fs *c, struct bch_dev *ca
		if (bch2_can_invalidate_bucket(ca, b, m)) {
			struct alloc_heap_entry e = { .bucket = b, .nr = 1, };

			heap_add(&ca->alloc_heap, e, bucket_alloc_cmp);
			heap_add(&ca->alloc_heap, e, bucket_alloc_cmp, NULL);
			if (heap_full(&ca->alloc_heap))
				break;
		}
@@ -698,7 +700,7 @@ static size_t find_reclaimable_buckets(struct bch_fs *c, struct bch_dev *ca)
		break;
	}

	heap_resort(&ca->alloc_heap, bucket_alloc_cmp);
	heap_resort(&ca->alloc_heap, bucket_alloc_cmp, NULL);

	for (i = 0; i < ca->alloc_heap.used; i++)
		nr += ca->alloc_heap.data[i].nr;
@@ -719,7 +721,7 @@ static inline long next_alloc_bucket(struct bch_dev *ca)
			return b;
		}

		heap_pop(&ca->alloc_heap, e, bucket_alloc_cmp);
		heap_pop(&ca->alloc_heap, e, bucket_alloc_cmp, NULL);
	}

	return -1;
+3 −3
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@ void bch2_btree_node_iter_large_push(struct btree_node_iter_large *iter,
				 __btree_node_key_to_offset(b, end)
			 });

		__heap_add(iter, n, btree_node_iter_cmp_heap);
		__heap_add(iter, n, btree_node_iter_cmp_heap, NULL);
	}
}

@@ -48,9 +48,9 @@ void bch2_btree_node_iter_large_advance(struct btree_node_iter_large *iter,
	EBUG_ON(iter->data->k > iter->data->end);

	if (iter->data->k == iter->data->end)
		heap_del(iter, 0, btree_node_iter_cmp_heap);
		heap_del(iter, 0, btree_node_iter_cmp_heap, NULL);
	else
		heap_sift_down(iter, 0, btree_node_iter_cmp_heap);
		heap_sift_down(iter, 0, btree_node_iter_cmp_heap, NULL);
}

static void verify_no_dups(struct btree *b,
+3 −3
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@ void bch2_io_timer_add(struct io_clock *clock, struct io_timer *timer)
		if (clock->timers.data[i] == timer)
			goto out;

	BUG_ON(!heap_add(&clock->timers, timer, io_timer_cmp));
	BUG_ON(!heap_add(&clock->timers, timer, io_timer_cmp, NULL));
out:
	spin_unlock(&clock->timer_lock);
}
@@ -35,7 +35,7 @@ void bch2_io_timer_del(struct io_clock *clock, struct io_timer *timer)

	for (i = 0; i < clock->timers.used; i++)
		if (clock->timers.data[i] == timer) {
			heap_del(&clock->timers, i, io_timer_cmp);
			heap_del(&clock->timers, i, io_timer_cmp, NULL);
			break;
		}

@@ -128,7 +128,7 @@ static struct io_timer *get_expired_timer(struct io_clock *clock,

	if (clock->timers.used &&
	    time_after_eq(now, clock->timers.data[0]->expire))
		heap_pop(&clock->timers, ret, io_timer_cmp);
		heap_pop(&clock->timers, ret, io_timer_cmp, NULL);

	spin_unlock(&clock->timer_lock);

+5 −5
Original line number Diff line number Diff line
@@ -88,7 +88,7 @@ struct btree_nr_keys bch2_key_sort_fix_overlapping(struct bset *dst,

	memset(&nr, 0, sizeof(nr));

	heap_resort(iter, key_sort_cmp);
	heap_resort(iter, key_sort_cmp, NULL);

	while (!bch2_btree_node_iter_large_end(iter)) {
		if (!should_drop_next_key(iter, b)) {
@@ -101,7 +101,7 @@ struct btree_nr_keys bch2_key_sort_fix_overlapping(struct bset *dst,
		}

		sort_key_next(iter, b, iter->data);
		heap_sift_down(iter, 0, key_sort_cmp);
		heap_sift_down(iter, 0, key_sort_cmp, NULL);
	}

	dst->u64s = cpu_to_le16((u64 *) out - dst->_data);
@@ -841,7 +841,7 @@ static bool extent_i_save(struct btree *b, struct bkey_packed *dst,
static inline void extent_sort_sift(struct btree_node_iter_large *iter,
				    struct btree *b, size_t i)
{
	heap_sift_down(iter, i, extent_sort_cmp);
	heap_sift_down(iter, i, extent_sort_cmp, NULL);
}

static inline void extent_sort_next(struct btree_node_iter_large *iter,
@@ -849,7 +849,7 @@ static inline void extent_sort_next(struct btree_node_iter_large *iter,
				    struct btree_node_iter_set *i)
{
	sort_key_next(iter, b, i);
	heap_sift_down(iter, i - iter->data, extent_sort_cmp);
	heap_sift_down(iter, i - iter->data, extent_sort_cmp, NULL);
}

static void extent_sort_append(struct bch_fs *c,
@@ -897,7 +897,7 @@ struct btree_nr_keys bch2_extent_sort_fix_overlapping(struct bch_fs *c,

	memset(&nr, 0, sizeof(nr));

	heap_resort(iter, extent_sort_cmp);
	heap_resort(iter, extent_sort_cmp, NULL);

	while (!bch2_btree_node_iter_large_end(iter)) {
		lk = __btree_node_offset_to_key(b, _l->k);
+2 −2
Original line number Diff line number Diff line
@@ -161,7 +161,7 @@ static void bch2_copygc(struct bch_fs *c, struct bch_dev *ca)
			.sectors	= bucket_sectors_used(m),
			.offset		= bucket_to_sector(ca, b),
		};
		heap_add_or_replace(h, e, -sectors_used_cmp);
		heap_add_or_replace(h, e, -sectors_used_cmp, NULL);
	}
	up_read(&ca->bucket_lock);
	up_read(&c->gc_lock);
@@ -170,7 +170,7 @@ static void bch2_copygc(struct bch_fs *c, struct bch_dev *ca)
		sectors_to_move += i->sectors;

	while (sectors_to_move > COPYGC_SECTORS_PER_ITER(ca)) {
		BUG_ON(!heap_pop(h, e, -sectors_used_cmp));
		BUG_ON(!heap_pop(h, e, -sectors_used_cmp, NULL));
		sectors_to_move -= e.sectors;
	}

Loading