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

Commit 79b134a2 authored by David Sterba's avatar David Sterba
Browse files

btrfs: tweak free space tree bitmap allocation



The requested bitmap size varies, observed numbers were < 4K up to 16K.
Using vmalloc unconditionally would be too heavy, we'll try contiguous
allocations first and fall back to vmalloc if there's no contig memory.

Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 8cce83ba
Loading
Loading
Loading
Loading
+16 −2
Original line number Original line Diff line number Diff line
@@ -153,6 +153,20 @@ static inline u32 free_space_bitmap_size(u64 size, u32 sectorsize)


static unsigned long *alloc_bitmap(u32 bitmap_size)
static unsigned long *alloc_bitmap(u32 bitmap_size)
{
{
	void *mem;

	/*
	 * The allocation size varies, observed numbers were < 4K up to 16K.
	 * Using vmalloc unconditionally would be too heavy, we'll try
	 * contiguous allocations first.
	 */
	if  (bitmap_size <= PAGE_SIZE)
		return kzalloc(bitmap_size, GFP_NOFS);

	mem = kzalloc(bitmap_size, GFP_NOFS | __GFP_HIGHMEM | __GFP_NOWARN);
	if (mem)
		return mem;

	return __vmalloc(bitmap_size, GFP_NOFS | __GFP_HIGHMEM | __GFP_ZERO,
	return __vmalloc(bitmap_size, GFP_NOFS | __GFP_HIGHMEM | __GFP_ZERO,
			 PAGE_KERNEL);
			 PAGE_KERNEL);
}
}
@@ -289,7 +303,7 @@ int convert_free_space_to_bitmaps(struct btrfs_trans_handle *trans,


	ret = 0;
	ret = 0;
out:
out:
	vfree(bitmap);
	kvfree(bitmap);
	if (ret)
	if (ret)
		btrfs_abort_transaction(trans, root, ret);
		btrfs_abort_transaction(trans, root, ret);
	return ret;
	return ret;
@@ -438,7 +452,7 @@ int convert_free_space_to_extents(struct btrfs_trans_handle *trans,


	ret = 0;
	ret = 0;
out:
out:
	vfree(bitmap);
	kvfree(bitmap);
	if (ret)
	if (ret)
		btrfs_abort_transaction(trans, root, ret);
		btrfs_abort_transaction(trans, root, ret);
	return ret;
	return ret;