Commit 218a6944 authored by hanjinke's avatar hanjinke Committed by Theodore Ts'o
Browse files

ext4: reuse order and buddy in mb_mark_used when buddy split



After each buddy split, mb_mark_used will search the proper order
for the block which may consume some loop in mb_find_order_for_block.
In fact, we can reuse the order and buddy generated by the buddy split.

Reviewed by: lei.rao@intel.com
Signed-off-by: default avatarhanjinke <hanjinke.666@bytedance.com>
Link: https://lore.kernel.org/r/20220606155305.74146-1-hanjinke.666@bytedance.com


Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
parent 827891a3
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -1933,6 +1933,7 @@ static int mb_mark_used(struct ext4_buddy *e4b, struct ext4_free_extent *ex)
	unsigned ret = 0;
	int len0 = len;
	void *buddy;
	bool split = false;

	BUG_ON(start + len > (e4b->bd_sb->s_blocksize << 3));
	BUG_ON(e4b->bd_group != ex->fe_group);
@@ -1957,12 +1958,16 @@ static int mb_mark_used(struct ext4_buddy *e4b, struct ext4_free_extent *ex)

	/* let's maintain buddy itself */
	while (len) {
		if (!split)
			ord = mb_find_order_for_block(e4b, start);

		if (((start >> ord) << ord) == start && len >= (1 << ord)) {
			/* the whole chunk may be allocated at once! */
			mlen = 1 << ord;
			if (!split)
				buddy = mb_find_buddy(e4b, ord, &max);
			else
				split = false;
			BUG_ON((start >> ord) >= max);
			mb_set_bit(start >> ord, buddy);
			e4b->bd_info->bb_counters[ord]--;
@@ -1989,6 +1994,7 @@ static int mb_mark_used(struct ext4_buddy *e4b, struct ext4_free_extent *ex)
		mb_clear_bit(cur + 1, buddy);
		e4b->bd_info->bb_counters[ord]++;
		e4b->bd_info->bb_counters[ord]++;
		split = true;
	}
	mb_set_largest_free_order(e4b->bd_sb, e4b->bd_info);