From: Simon Glass <simon.glass@canonical.com>
Add a Kconfig option to make mballoc prefetch support optional. The
prefetch functions (ext4_mb_prefetch, ext4_mb_prefetch_fini) are used
in Linux to optimise read performance by pre-loading block bitmaps
during lazy initialisation.
When disabled, guard the calls with IS_ENABLED() checks so gc-sections
can remove the prefetch code. This removes the prefetch functions from
the binary, reducing the external references to mballoc.
Disable this by default as U-Boot is unlikely to gain any performance
from this feature. It saves about 300 bytes.
Co-developed-by: Claude <noreply@anthropic.com>
Signed-off-by: Simon Glass <simon.glass@canonical.com>
---
fs/ext4l/Kconfig | 15 +++++++++++++++
fs/ext4l/mballoc.c | 5 ++++-
fs/ext4l/super.c | 3 ++-
3 files changed, 21 insertions(+), 2 deletions(-)
@@ -110,3 +110,18 @@ config EXT4_INDIRECT
Filesystems without the extents feature will be rejected if
this is disabled. Adds about 5K. If unsure, say N.
+
+config EXT4_MBALLOC_PREFETCH
+ bool "Enable ext4 block bitmap prefetch support"
+ depends on FS_EXT4L
+ help
+ Enable prefetching of block allocation bitmaps to improve
+ allocation performance. When enabled, the multiblock allocator
+ will read ahead block bitmaps during allocation and lazy
+ initialization.
+
+ Disabling this saves space by allowing the multiblock allocator
+ prefetch code to be removed. Read performance may be slightly
+ reduced during lazy initialization.
+
+ If unsure, say Y.
@@ -2858,6 +2858,9 @@ static void ext4_mb_might_prefetch(struct ext4_allocation_context *ac,
{
struct ext4_sb_info *sbi;
+ if (!IS_ENABLED(CONFIG_EXT4_MBALLOC_PREFETCH))
+ return;
+
if (ac->ac_prefetch_grp != group)
return;
@@ -3069,7 +3072,7 @@ out:
ac->ac_b_ex.fe_len, ac->ac_o_ex.fe_len, ac->ac_status,
ac->ac_flags, ac->ac_criteria, err);
- if (ac->ac_prefetch_nr)
+ if (IS_ENABLED(CONFIG_EXT4_MBALLOC_PREFETCH) && ac->ac_prefetch_nr)
ext4_mb_prefetch_fini(sb, ac->ac_prefetch_grp, ac->ac_prefetch_nr);
return err;
@@ -3663,7 +3663,8 @@ static int ext4_run_li_request(struct ext4_li_request *elr)
int nr = EXT4_SB(sb)->s_mb_prefetch;
u64 start_time;
- if (elr->lr_mode == EXT4_LI_MODE_PREFETCH_BBITMAP) {
+ if (IS_ENABLED(CONFIG_EXT4_MBALLOC_PREFETCH) &&
+ elr->lr_mode == EXT4_LI_MODE_PREFETCH_BBITMAP) {
elr->lr_next_group = ext4_mb_prefetch(sb, group, nr, &prefetch_ios);
ext4_mb_prefetch_fini(sb, elr->lr_next_group, nr);
trace_ext4_prefetch_bitmaps(sb, group, elr->lr_next_group, nr);