Message ID | 20250512063319.3539411-9-yi.zhang@huaweicloud.com |
---|---|
State | Awaiting Upstream |
Headers | show |
Series | ext4: enable large folio for regular files | expand |
Hello, kernel test robot noticed a 37.7% improvement of fsmark.files_per_sec on: commit: 34696dd792d839c46a280c720ab28aab2db1f4bf ("[PATCH v2 8/8] ext4: enable large folio for regular file") url: https://github.com/intel-lab-lkp/linux/commits/Zhang-Yi/ext4-make-ext4_mpage_readpages-support-large-folios/20250512-144942 base: https://git.kernel.org/cgit/linux/kernel/git/tytso/ext4.git dev patch link: https://lore.kernel.org/all/20250512063319.3539411-9-yi.zhang@huaweicloud.com/ patch subject: [PATCH v2 8/8] ext4: enable large folio for regular file testcase: fsmark config: x86_64-rhel-9.4 compiler: gcc-12 test machine: 96 threads 2 sockets Intel(R) Xeon(R) Platinum 8260L CPU @ 2.40GHz (Cascade Lake) with 128G memory parameters: iterations: 1x nr_threads: 1t disk: 1BRD_48G fs: ext4 filesize: 4M test_size: 24G sync_method: NoSync cpufreq_governor: performance Details are as below: --------------------------------------------------------------------------------------------------> The kernel config and materials to reproduce are available at: https://download.01.org/0day-ci/archive/20250516/202505161418.ec0d753f-lkp@intel.com ========================================================================================= compiler/cpufreq_governor/disk/filesize/fs/iterations/kconfig/nr_threads/rootfs/sync_method/tbox_group/test_size/testcase: gcc-12/performance/1BRD_48G/4M/ext4/1x/x86_64-rhel-9.4/1t/debian-12-x86_64-20240206.cgz/NoSync/lkp-csl-2sp3/24G/fsmark commit: 0368e6caf2 ("ext4: make online defragmentation support large folios") 34696dd792 ("ext4: enable large folio for regular file") 0368e6caf2d6ff21 34696dd792d839c46a280c720ab ---------------- --------------------------- %stddev %change %stddev \ | \ 1.964e+09 ± 3% -14.9% 1.671e+09 ± 8% cpuidle..time 3825 ± 20% -24.6% 2884 ± 17% sched_debug.cpu.avg_idle.min 69081 -3.2% 66894 fsmark.app_overhead 529.15 +37.7% 728.75 fsmark.files_per_sec 70.33 ± 3% -11.6% 62.17 fsmark.time.percent_of_cpu_this_job_got 3.50 ± 54% +109.5% 7.33 ± 21% perf-sched.wait_and_delay.count.schedule_hrtimeout_range.ep_poll.do_epoll_wait.__x64_sys_epoll_wait 4.00 ± 14% +21.0% 4.84 ± 21% perf-sched.wait_and_delay.max.ms.schedule_timeout.rcu_gp_fqs_loop.rcu_gp_kthread.kthread 0.91 ± 12% -14.1% 0.78 ± 8% perf-sched.wait_time.max.ms.do_wait.kernel_wait4.do_syscall_64.entry_SYSCALL_64_after_hwframe 691923 ± 25% -62.0% 263011 ± 18% proc-vmstat.numa_foreign 12650103 ± 4% -35.5% 8153366 proc-vmstat.numa_hit 12607229 ± 3% -36.1% 8052736 proc-vmstat.numa_local 707756 ± 22% -62.8% 263011 ± 18% proc-vmstat.numa_miss 806083 ± 25% -55.0% 362335 ± 13% proc-vmstat.numa_other 231973 -3.4% 224103 proc-vmstat.pgfault 3.86 ± 2% +37.3% 5.29 ± 9% perf-stat.i.MPKI 1.889e+09 -11.1% 1.679e+09 ± 2% perf-stat.i.branch-instructions 3.60 ± 3% +0.3 3.91 ± 5% perf-stat.i.branch-miss-rate% 34677646 +17.9% 40883980 ± 8% perf-stat.i.cache-misses 2003 ± 2% +10.2% 2209 ± 4% perf-stat.i.context-switches 1.08 +14.4% 1.24 ± 4% perf-stat.i.cpi 9.762e+09 -10.6% 8.728e+09 ± 2% perf-stat.i.instructions 0.98 -9.7% 0.89 ± 4% perf-stat.i.ipc 7068 ± 3% +14.7% 8105 ± 6% perf-stat.i.minor-faults 7068 ± 3% +14.7% 8105 ± 6% perf-stat.i.page-faults 3.56 +31.5% 4.68 ± 6% perf-stat.overall.MPKI 3.67 ± 2% +0.4 4.06 ± 2% perf-stat.overall.branch-miss-rate% 1.04 +10.9% 1.15 ± 2% perf-stat.overall.cpi 291.68 -15.5% 246.52 ± 4% perf-stat.overall.cycles-between-cache-misses 0.96 -9.8% 0.87 ± 2% perf-stat.overall.ipc 1.795e+09 -12.0% 1.58e+09 perf-stat.ps.branch-instructions 65831109 -2.5% 64181687 perf-stat.ps.branch-misses 32991347 +16.6% 38460099 ± 7% perf-stat.ps.cache-misses 1905 ± 2% +9.0% 2077 ± 4% perf-stat.ps.context-switches 9.28e+09 -11.5% 8.215e+09 ± 2% perf-stat.ps.instructions 6695 ± 2% +13.6% 7604 ± 5% perf-stat.ps.minor-faults 6696 ± 2% +13.6% 7604 ± 5% perf-stat.ps.page-faults 1.918e+11 ± 2% -25.3% 1.432e+11 ± 7% perf-stat.total.instructions 24.59 ± 5% -7.7 16.86 perf-profile.calltrace.cycles-pp.ext4_buffered_write_iter.vfs_write.ksys_write.do_syscall_64.entry_SYSCALL_64_after_hwframe 24.39 ± 5% -7.7 16.68 perf-profile.calltrace.cycles-pp.generic_perform_write.ext4_buffered_write_iter.vfs_write.ksys_write.do_syscall_64 30.60 -6.3 24.26 perf-profile.calltrace.cycles-pp.write 29.63 -6.3 23.36 perf-profile.calltrace.cycles-pp.entry_SYSCALL_64_after_hwframe.write 29.39 -6.3 23.12 perf-profile.calltrace.cycles-pp.vfs_write.ksys_write.do_syscall_64.entry_SYSCALL_64_after_hwframe.write 29.60 -6.3 23.34 perf-profile.calltrace.cycles-pp.do_syscall_64.entry_SYSCALL_64_after_hwframe.write 29.50 -6.3 23.24 perf-profile.calltrace.cycles-pp.ksys_write.do_syscall_64.entry_SYSCALL_64_after_hwframe.write 6.31 ± 3% -5.1 1.24 ± 6% perf-profile.calltrace.cycles-pp.ext4_da_do_write_end.generic_perform_write.ext4_buffered_write_iter.vfs_write.ksys_write 5.84 ± 3% -4.7 1.17 ± 6% perf-profile.calltrace.cycles-pp.block_write_end.ext4_da_do_write_end.generic_perform_write.ext4_buffered_write_iter.vfs_write 5.79 ± 3% -4.6 1.16 ± 6% perf-profile.calltrace.cycles-pp.__block_commit_write.block_write_end.ext4_da_do_write_end.generic_perform_write.ext4_buffered_write_iter 9.66 ± 5% -4.0 5.62 ± 2% perf-profile.calltrace.cycles-pp.ext4_da_write_begin.generic_perform_write.ext4_buffered_write_iter.vfs_write.ksys_write 17.24 ± 5% -3.7 13.49 perf-profile.calltrace.cycles-pp.__writeback_single_inode.writeback_sb_inodes.__writeback_inodes_wb.wb_writeback.wb_do_writeback 17.24 ± 5% -3.7 13.49 perf-profile.calltrace.cycles-pp.do_writepages.__writeback_single_inode.writeback_sb_inodes.__writeback_inodes_wb.wb_writeback 17.24 ± 5% -3.7 13.50 perf-profile.calltrace.cycles-pp.__writeback_inodes_wb.wb_writeback.wb_do_writeback.wb_workfn.process_one_work 17.24 ± 5% -3.7 13.50 perf-profile.calltrace.cycles-pp.writeback_sb_inodes.__writeback_inodes_wb.wb_writeback.wb_do_writeback.wb_workfn 17.24 ± 5% -3.7 13.49 perf-profile.calltrace.cycles-pp.ext4_writepages.do_writepages.__writeback_single_inode.writeback_sb_inodes.__writeback_inodes_wb 4.92 ± 6% -3.1 1.87 ± 2% perf-profile.calltrace.cycles-pp.__filemap_get_folio.ext4_da_write_begin.generic_perform_write.ext4_buffered_write_iter.vfs_write 2.60 ± 5% -1.7 0.94 ± 4% perf-profile.calltrace.cycles-pp.filemap_add_folio.__filemap_get_folio.ext4_da_write_begin.generic_perform_write.ext4_buffered_write_iter 1.78 ± 8% -1.1 0.68 ± 7% perf-profile.calltrace.cycles-pp.alloc_pages_mpol.folio_alloc_noprof.__filemap_get_folio.ext4_da_write_begin.generic_perform_write 1.56 ± 8% -1.1 0.48 ± 44% perf-profile.calltrace.cycles-pp.mpage_submit_folio.mpage_map_and_submit_buffers.mpage_map_and_submit_extent.ext4_do_writepages.ext4_writepages 1.86 ± 7% -1.0 0.82 ± 6% perf-profile.calltrace.cycles-pp.folio_alloc_noprof.__filemap_get_folio.ext4_da_write_begin.generic_perform_write.ext4_buffered_write_iter 1.65 ± 7% -1.0 0.64 ± 7% perf-profile.calltrace.cycles-pp.__alloc_frozen_pages_noprof.alloc_pages_mpol.folio_alloc_noprof.__filemap_get_folio.ext4_da_write_begin 4.54 ± 5% -0.9 3.67 ± 3% perf-profile.calltrace.cycles-pp.ext4_block_write_begin.ext4_da_write_begin.generic_perform_write.ext4_buffered_write_iter.vfs_write 1.93 ± 6% -0.8 1.08 ± 32% perf-profile.calltrace.cycles-pp.ext4_finish_bio.ext4_release_io_end.ext4_end_io_end.ext4_do_writepages.ext4_writepages 1.93 ± 6% -0.8 1.09 ± 31% perf-profile.calltrace.cycles-pp.ext4_release_io_end.ext4_end_io_end.ext4_do_writepages.ext4_writepages.do_writepages 1.42 ± 7% -0.8 0.58 ± 9% perf-profile.calltrace.cycles-pp.get_page_from_freelist.__alloc_frozen_pages_noprof.alloc_pages_mpol.folio_alloc_noprof.__filemap_get_folio 1.96 ± 6% -0.8 1.20 ± 26% perf-profile.calltrace.cycles-pp.ext4_end_io_end.ext4_do_writepages.ext4_writepages.do_writepages.__writeback_single_inode 1.31 ± 3% -0.7 0.58 ± 6% perf-profile.calltrace.cycles-pp.mark_buffer_dirty.__block_commit_write.block_write_end.ext4_da_do_write_end.generic_perform_write 2.04 ± 9% -0.7 1.35 ± 7% perf-profile.calltrace.cycles-pp.mpage_map_and_submit_buffers.mpage_map_and_submit_extent.ext4_do_writepages.ext4_writepages.do_writepages 2.11 ± 9% -0.6 1.46 ± 7% perf-profile.calltrace.cycles-pp.mpage_map_and_submit_extent.ext4_do_writepages.ext4_writepages.do_writepages.__writeback_single_inode 1.84 ± 7% -0.5 1.30 ± 7% perf-profile.calltrace.cycles-pp.create_empty_buffers.ext4_block_write_begin.ext4_da_write_begin.generic_perform_write.ext4_buffered_write_iter 1.38 ± 8% -0.2 1.18 ± 7% perf-profile.calltrace.cycles-pp.folio_alloc_buffers.create_empty_buffers.ext4_block_write_begin.ext4_da_write_begin.generic_perform_write 0.62 ± 2% -0.1 0.56 ± 5% perf-profile.calltrace.cycles-pp.ext4_es_lookup_extent.ext4_da_map_blocks.ext4_da_get_block_prep.ext4_block_write_begin.ext4_da_write_begin 0.40 ± 70% +0.3 0.67 ± 5% perf-profile.calltrace.cycles-pp.io_serial_out.serial8250_console_write.console_flush_all.console_unlock.vprintk_emit 1.34 ± 9% +0.6 1.96 ± 4% perf-profile.calltrace.cycles-pp.clear_page_erms.get_page_from_freelist.__alloc_frozen_pages_noprof.alloc_pages_mpol.alloc_pages_noprof 0.34 ±103% +0.8 1.13 ± 25% perf-profile.calltrace.cycles-pp.get_jiffies_update.tmigr_requires_handle_remote.update_process_times.tick_nohz_handler.__hrtimer_run_queues 1.84 ± 12% +0.8 2.62 ± 10% perf-profile.calltrace.cycles-pp.update_process_times.tick_nohz_handler.__hrtimer_run_queues.hrtimer_interrupt.__sysvec_apic_timer_interrupt 0.35 ±103% +0.8 1.15 ± 24% perf-profile.calltrace.cycles-pp.tmigr_requires_handle_remote.update_process_times.tick_nohz_handler.__hrtimer_run_queues.hrtimer_interrupt 4.14 ± 8% +0.9 5.02 ± 9% perf-profile.calltrace.cycles-pp.__sysvec_apic_timer_interrupt.sysvec_apic_timer_interrupt.asm_sysvec_apic_timer_interrupt.cpuidle_enter_state.cpuidle_enter 4.11 ± 8% +0.9 5.00 ± 9% perf-profile.calltrace.cycles-pp.hrtimer_interrupt.__sysvec_apic_timer_interrupt.sysvec_apic_timer_interrupt.asm_sysvec_apic_timer_interrupt.cpuidle_enter_state 1.95 ± 6% +0.9 2.89 ± 3% perf-profile.calltrace.cycles-pp.get_page_from_freelist.__alloc_frozen_pages_noprof.alloc_pages_mpol.alloc_pages_noprof.brd_insert_page 2.35 ± 10% +1.0 3.32 ± 12% perf-profile.calltrace.cycles-pp.tick_nohz_handler.__hrtimer_run_queues.hrtimer_interrupt.__sysvec_apic_timer_interrupt.sysvec_apic_timer_interrupt 3.21 ± 9% +1.0 4.21 ± 10% perf-profile.calltrace.cycles-pp.__hrtimer_run_queues.hrtimer_interrupt.__sysvec_apic_timer_interrupt.sysvec_apic_timer_interrupt.asm_sysvec_apic_timer_interrupt 2.10 ± 6% +1.0 3.12 ± 2% perf-profile.calltrace.cycles-pp.__alloc_frozen_pages_noprof.alloc_pages_mpol.alloc_pages_noprof.brd_insert_page.brd_submit_bio 2.21 ± 5% +1.1 3.30 ± 3% perf-profile.calltrace.cycles-pp.alloc_pages_mpol.alloc_pages_noprof.brd_insert_page.brd_submit_bio.__submit_bio 2.26 ± 5% +1.1 3.37 ± 3% perf-profile.calltrace.cycles-pp.alloc_pages_noprof.brd_insert_page.brd_submit_bio.__submit_bio.__submit_bio_noacct 3.70 ± 30% +1.2 4.90 ± 4% perf-profile.calltrace.cycles-pp.wait_for_lsr.serial8250_console_write.console_flush_all.console_unlock.vprintk_emit 4.40 ± 29% +1.4 5.82 ± 4% perf-profile.calltrace.cycles-pp.serial8250_console_write.console_flush_all.console_unlock.vprintk_emit.devkmsg_emit 4.96 ± 32% +1.4 6.41 perf-profile.calltrace.cycles-pp.memcpy_toio.drm_fb_memcpy.ast_primary_plane_helper_atomic_update.drm_atomic_helper_commit_planes.drm_atomic_helper_commit_tail 4.68 ± 30% +1.5 6.17 ± 4% perf-profile.calltrace.cycles-pp.devkmsg_write.vfs_write.ksys_write.do_syscall_64.entry_SYSCALL_64_after_hwframe 4.68 ± 30% +1.5 6.17 ± 4% perf-profile.calltrace.cycles-pp.devkmsg_emit.devkmsg_write.vfs_write.ksys_write.do_syscall_64 4.68 ± 30% +1.5 6.17 ± 4% perf-profile.calltrace.cycles-pp.vprintk_emit.devkmsg_emit.devkmsg_write.vfs_write.ksys_write 4.68 ± 30% +1.5 6.17 ± 4% perf-profile.calltrace.cycles-pp.console_unlock.vprintk_emit.devkmsg_emit.devkmsg_write.vfs_write 4.68 ± 30% +1.5 6.17 ± 4% perf-profile.calltrace.cycles-pp.console_flush_all.console_unlock.vprintk_emit.devkmsg_emit.devkmsg_write 5.04 ± 32% +1.5 6.54 perf-profile.calltrace.cycles-pp.drm_fb_memcpy.ast_primary_plane_helper_atomic_update.drm_atomic_helper_commit_planes.drm_atomic_helper_commit_tail.ast_mode_config_helper_atomic_commit_tail 5.06 ± 32% +1.5 6.59 perf-profile.calltrace.cycles-pp.ast_primary_plane_helper_atomic_update.drm_atomic_helper_commit_planes.drm_atomic_helper_commit_tail.ast_mode_config_helper_atomic_commit_tail.commit_tail 5.07 ± 32% +1.5 6.60 perf-profile.calltrace.cycles-pp.drm_atomic_commit.drm_atomic_helper_dirtyfb.drm_fbdev_shmem_helper_fb_dirty.drm_fb_helper_damage_work.process_one_work 5.07 ± 32% +1.5 6.59 perf-profile.calltrace.cycles-pp.drm_atomic_helper_commit_planes.drm_atomic_helper_commit_tail.ast_mode_config_helper_atomic_commit_tail.commit_tail.drm_atomic_helper_commit 5.07 ± 32% +1.5 6.60 perf-profile.calltrace.cycles-pp.drm_atomic_helper_commit_tail.ast_mode_config_helper_atomic_commit_tail.commit_tail.drm_atomic_helper_commit.drm_atomic_commit 5.07 ± 32% +1.5 6.60 perf-profile.calltrace.cycles-pp.ast_mode_config_helper_atomic_commit_tail.commit_tail.drm_atomic_helper_commit.drm_atomic_commit.drm_atomic_helper_dirtyfb 5.07 ± 32% +1.5 6.60 perf-profile.calltrace.cycles-pp.commit_tail.drm_atomic_helper_commit.drm_atomic_commit.drm_atomic_helper_dirtyfb.drm_fbdev_shmem_helper_fb_dirty 5.07 ± 32% +1.5 6.60 perf-profile.calltrace.cycles-pp.drm_atomic_helper_commit.drm_atomic_commit.drm_atomic_helper_dirtyfb.drm_fbdev_shmem_helper_fb_dirty.drm_fb_helper_damage_work 5.07 ± 32% +1.5 6.60 perf-profile.calltrace.cycles-pp.drm_atomic_helper_dirtyfb.drm_fbdev_shmem_helper_fb_dirty.drm_fb_helper_damage_work.process_one_work.worker_thread 5.07 ± 32% +1.5 6.60 perf-profile.calltrace.cycles-pp.drm_fb_helper_damage_work.process_one_work.worker_thread.kthread.ret_from_fork 5.07 ± 32% +1.5 6.60 perf-profile.calltrace.cycles-pp.drm_fbdev_shmem_helper_fb_dirty.drm_fb_helper_damage_work.process_one_work.worker_thread.kthread 7.23 ± 9% +1.9 9.10 ± 2% perf-profile.calltrace.cycles-pp.rep_movs_alternative.copy_page_from_iter_atomic.generic_perform_write.ext4_buffered_write_iter.vfs_write 7.48 ± 9% +1.9 9.39 ± 2% perf-profile.calltrace.cycles-pp.copy_page_from_iter_atomic.generic_perform_write.ext4_buffered_write_iter.vfs_write.ksys_write 3.78 ± 7% +2.2 5.96 ± 7% perf-profile.calltrace.cycles-pp.memcpy_orig.copy_to_brd.brd_submit_bio.__submit_bio.__submit_bio_noacct 4.02 ± 7% +2.3 6.28 ± 6% perf-profile.calltrace.cycles-pp.copy_to_brd.brd_submit_bio.__submit_bio.__submit_bio_noacct.ext4_io_submit 5.63 ± 8% +3.2 8.81 ± 4% perf-profile.calltrace.cycles-pp._raw_spin_lock.brd_insert_page.brd_submit_bio.__submit_bio.__submit_bio_noacct 8.48 ± 7% +4.4 12.91 ± 3% perf-profile.calltrace.cycles-pp.brd_insert_page.brd_submit_bio.__submit_bio.__submit_bio_noacct.ext4_io_submit 17.80 ± 4% +5.1 22.94 perf-profile.calltrace.cycles-pp.wb_do_writeback.wb_workfn.process_one_work.worker_thread.kthread 17.80 ± 4% +5.1 22.94 perf-profile.calltrace.cycles-pp.wb_workfn.process_one_work.worker_thread.kthread.ret_from_fork 17.80 ± 4% +5.1 22.94 perf-profile.calltrace.cycles-pp.wb_writeback.wb_do_writeback.wb_workfn.process_one_work.worker_thread 17.72 ± 4% +5.2 22.93 perf-profile.calltrace.cycles-pp.ext4_do_writepages.ext4_writepages.do_writepages.__writeback_single_inode.writeback_sb_inodes 12.77 ± 5% +6.6 19.36 perf-profile.calltrace.cycles-pp.brd_submit_bio.__submit_bio.__submit_bio_noacct.ext4_io_submit.ext4_do_writepages 12.77 ± 5% +6.6 19.37 perf-profile.calltrace.cycles-pp.__submit_bio.__submit_bio_noacct.ext4_io_submit.ext4_do_writepages.ext4_writepages 12.77 ± 5% +6.6 19.37 perf-profile.calltrace.cycles-pp.__submit_bio_noacct.ext4_io_submit.ext4_do_writepages.ext4_writepages.do_writepages 12.77 ± 5% +6.6 19.37 perf-profile.calltrace.cycles-pp.ext4_io_submit.ext4_do_writepages.ext4_writepages.do_writepages.__writeback_single_inode 23.05 ± 4% +6.7 29.71 perf-profile.calltrace.cycles-pp.kthread.ret_from_fork.ret_from_fork_asm 22.96 ± 4% +6.7 29.61 perf-profile.calltrace.cycles-pp.process_one_work.worker_thread.kthread.ret_from_fork.ret_from_fork_asm 23.05 ± 4% +6.7 29.71 perf-profile.calltrace.cycles-pp.ret_from_fork.ret_from_fork_asm 23.05 ± 4% +6.7 29.71 perf-profile.calltrace.cycles-pp.ret_from_fork_asm 22.98 ± 4% +6.7 29.64 perf-profile.calltrace.cycles-pp.worker_thread.kthread.ret_from_fork.ret_from_fork_asm 0.48 ±110% +9.0 9.44 ± 2% perf-profile.calltrace.cycles-pp.ext4_writepages.do_writepages.__writeback_single_inode.writeback_sb_inodes.wb_writeback 0.48 ±110% +9.0 9.44 ± 2% perf-profile.calltrace.cycles-pp.__writeback_single_inode.writeback_sb_inodes.wb_writeback.wb_do_writeback.wb_workfn 0.48 ±110% +9.0 9.44 ± 2% perf-profile.calltrace.cycles-pp.do_writepages.__writeback_single_inode.writeback_sb_inodes.wb_writeback.wb_do_writeback 0.48 ±110% +9.0 9.44 ± 2% perf-profile.calltrace.cycles-pp.writeback_sb_inodes.wb_writeback.wb_do_writeback.wb_workfn.process_one_work 24.59 ± 5% -7.7 16.86 perf-profile.children.cycles-pp.ext4_buffered_write_iter 24.41 ± 5% -7.7 16.69 perf-profile.children.cycles-pp.generic_perform_write 31.13 -6.6 24.56 ± 2% perf-profile.children.cycles-pp.entry_SYSCALL_64_after_hwframe 31.10 -6.6 24.53 ± 2% perf-profile.children.cycles-pp.do_syscall_64 30.67 -6.4 24.32 perf-profile.children.cycles-pp.write 29.40 -6.3 23.14 perf-profile.children.cycles-pp.vfs_write 29.51 -6.3 23.26 perf-profile.children.cycles-pp.ksys_write 6.32 ± 3% -5.1 1.24 ± 6% perf-profile.children.cycles-pp.ext4_da_do_write_end 5.86 ± 3% -4.7 1.17 ± 6% perf-profile.children.cycles-pp.block_write_end 5.80 ± 3% -4.6 1.16 ± 6% perf-profile.children.cycles-pp.__block_commit_write 9.67 ± 5% -4.0 5.62 ± 2% perf-profile.children.cycles-pp.ext4_da_write_begin 17.24 ± 5% -3.7 13.50 perf-profile.children.cycles-pp.__writeback_inodes_wb 4.94 ± 6% -3.1 1.88 ± 2% perf-profile.children.cycles-pp.__filemap_get_folio 2.62 ± 5% -1.7 0.95 ± 4% perf-profile.children.cycles-pp.filemap_add_folio 1.86 ± 7% -1.0 0.82 ± 6% perf-profile.children.cycles-pp.folio_alloc_noprof 4.54 ± 5% -0.9 3.68 ± 3% perf-profile.children.cycles-pp.ext4_block_write_begin 2.11 ± 8% -0.8 1.35 ± 7% perf-profile.children.cycles-pp.mpage_map_and_submit_buffers 1.15 ± 6% -0.7 0.41 ± 11% perf-profile.children.cycles-pp.__folio_batch_add_and_move 1.31 ± 3% -0.7 0.58 ± 6% perf-profile.children.cycles-pp.mark_buffer_dirty 1.34 ± 7% -0.7 0.61 ± 9% perf-profile.children.cycles-pp.folio_end_writeback 2.17 ± 8% -0.7 1.46 ± 7% perf-profile.children.cycles-pp.mpage_map_and_submit_extent 1.02 ± 3% -0.7 0.33 ± 10% perf-profile.children.cycles-pp.__folio_mark_dirty 2.00 ± 5% -0.7 1.32 ± 10% perf-profile.children.cycles-pp.ext4_finish_bio 2.00 ± 5% -0.7 1.32 ± 10% perf-profile.children.cycles-pp.ext4_release_io_end 2.03 ± 6% -0.7 1.36 ± 9% perf-profile.children.cycles-pp.ext4_end_io_end 1.61 ± 7% -0.7 0.94 ± 8% perf-profile.children.cycles-pp.mpage_submit_folio 1.04 ± 5% -0.6 0.39 ± 11% perf-profile.children.cycles-pp.folio_batch_move_lru 1.07 ± 8% -0.6 0.44 ± 6% perf-profile.children.cycles-pp.__filemap_add_folio 0.80 ± 5% -0.6 0.21 ± 7% perf-profile.children.cycles-pp.lru_add 1.11 ± 6% -0.6 0.52 ± 9% perf-profile.children.cycles-pp.__folio_end_writeback 1.84 ± 7% -0.5 1.30 ± 7% perf-profile.children.cycles-pp.create_empty_buffers 0.99 ± 5% -0.5 0.45 ± 5% perf-profile.children.cycles-pp.__lruvec_stat_mod_folio 0.68 ± 8% -0.4 0.27 ± 11% perf-profile.children.cycles-pp.__folio_start_writeback 0.66 ± 7% -0.4 0.27 ± 8% perf-profile.children.cycles-pp.__mod_memcg_lruvec_state 0.53 ± 7% -0.4 0.14 ± 11% perf-profile.children.cycles-pp.lru_gen_add_folio 1.50 ± 7% -0.4 1.14 ± 7% perf-profile.children.cycles-pp.rmqueue 1.09 ± 7% -0.3 0.75 ± 9% perf-profile.children.cycles-pp.ext4_bio_write_folio 0.56 ± 5% -0.3 0.23 ± 11% perf-profile.children.cycles-pp.folio_account_dirtied 0.48 ± 7% -0.3 0.18 ± 7% perf-profile.children.cycles-pp.folio_clear_dirty_for_io 1.12 ± 6% -0.3 0.82 ± 9% perf-profile.children.cycles-pp.__rmqueue_pcplist 0.36 ± 10% -0.3 0.09 ± 4% perf-profile.children.cycles-pp.fault_in_iov_iter_readable 0.33 ± 10% -0.2 0.08 ± 8% perf-profile.children.cycles-pp.fault_in_readable 0.33 ± 6% -0.2 0.09 ± 14% perf-profile.children.cycles-pp.__mem_cgroup_charge 0.28 ± 8% -0.2 0.07 ± 17% perf-profile.children.cycles-pp.filemap_get_entry 0.27 ± 5% -0.2 0.06 ± 19% perf-profile.children.cycles-pp.__xa_set_mark 1.40 ± 8% -0.2 1.19 ± 7% perf-profile.children.cycles-pp.folio_alloc_buffers 0.28 ± 9% -0.2 0.08 ± 8% perf-profile.children.cycles-pp.node_dirty_ok 0.47 ± 10% -0.2 0.28 ± 13% perf-profile.children.cycles-pp.percpu_counter_add_batch 1.00 ± 8% -0.2 0.83 ± 3% perf-profile.children.cycles-pp.xas_load 0.21 ± 11% -0.1 0.08 perf-profile.children.cycles-pp.__mod_node_page_state 0.76 ± 8% -0.1 0.64 ± 8% perf-profile.children.cycles-pp.rmqueue_bulk 0.20 ± 9% -0.1 0.09 ± 18% perf-profile.children.cycles-pp._raw_spin_lock_irq 0.16 ± 11% -0.1 0.06 ± 48% perf-profile.children.cycles-pp.__mark_inode_dirty 0.12 ± 16% -0.1 0.02 ± 99% perf-profile.children.cycles-pp.xas_find_conflict 0.25 ± 11% -0.1 0.16 ± 10% perf-profile.children.cycles-pp.balance_dirty_pages_ratelimited_flags 0.12 ± 17% -0.1 0.02 ± 99% perf-profile.children.cycles-pp.mod_zone_page_state 0.14 ± 9% -0.1 0.06 ± 15% perf-profile.children.cycles-pp.charge_memcg 0.15 ± 9% -0.1 0.06 ± 11% perf-profile.children.cycles-pp.cgroup_rstat_updated 0.16 ± 12% -0.1 0.08 ± 12% perf-profile.children.cycles-pp.ext4_da_write_end 0.22 ± 13% -0.1 0.14 ± 10% perf-profile.children.cycles-pp.xas_start 0.35 ± 10% -0.1 0.28 ± 8% perf-profile.children.cycles-pp.allocate_slab 0.12 ± 10% -0.1 0.05 ± 47% perf-profile.children.cycles-pp.try_charge_memcg 0.12 ± 11% -0.1 0.05 ± 7% perf-profile.children.cycles-pp.__mod_zone_page_state 0.12 ± 18% -0.1 0.06 ± 18% perf-profile.children.cycles-pp.__fprop_add_percpu 0.57 ± 9% -0.1 0.51 ± 6% perf-profile.children.cycles-pp.__memcg_slab_post_alloc_hook 0.63 ± 2% -0.1 0.58 ± 4% perf-profile.children.cycles-pp.ext4_es_lookup_extent 0.12 ± 15% -0.1 0.07 ± 16% perf-profile.children.cycles-pp._raw_spin_unlock_irqrestore 0.08 ± 20% -0.1 0.03 ±100% perf-profile.children.cycles-pp.xas_find_marked 0.20 ± 12% -0.0 0.16 ± 9% perf-profile.children.cycles-pp.__cond_resched 0.12 ± 10% -0.0 0.08 ± 11% perf-profile.children.cycles-pp.policy_nodemask 0.14 ± 5% -0.0 0.11 ± 8% perf-profile.children.cycles-pp.up_write 0.08 ± 8% -0.0 0.06 ± 15% perf-profile.children.cycles-pp.rcu_all_qs 0.10 ± 13% +0.0 0.12 ± 6% perf-profile.children.cycles-pp.vfs_read 0.10 ± 15% +0.0 0.13 ± 8% perf-profile.children.cycles-pp.ksys_read 0.07 ± 15% +0.0 0.11 ± 24% perf-profile.children.cycles-pp.ext4_ext_map_blocks 0.07 ± 14% +0.1 0.12 ± 18% perf-profile.children.cycles-pp.ext4_map_create_blocks 0.08 ± 8% +0.1 0.14 ± 19% perf-profile.children.cycles-pp.ext4_map_blocks 0.01 ±223% +0.1 0.07 ± 33% perf-profile.children.cycles-pp.ext4_mb_new_blocks 0.30 ± 10% +0.1 0.43 ± 8% perf-profile.children.cycles-pp.__xa_insert 0.37 ± 12% +0.1 0.51 ± 9% perf-profile.children.cycles-pp.xa_load 0.52 ± 29% +0.2 0.68 ± 5% perf-profile.children.cycles-pp.io_serial_out 1.40 ± 10% +0.6 1.98 ± 4% perf-profile.children.cycles-pp.clear_page_erms 0.56 ± 31% +0.6 1.17 ± 24% perf-profile.children.cycles-pp.tmigr_requires_handle_remote 0.54 ± 34% +0.6 1.15 ± 24% perf-profile.children.cycles-pp.get_jiffies_update 1.98 ± 12% +0.8 2.80 ± 10% perf-profile.children.cycles-pp.update_process_times 4.39 ± 8% +0.9 5.31 ± 9% perf-profile.children.cycles-pp.__sysvec_apic_timer_interrupt 4.36 ± 8% +0.9 5.29 ± 9% perf-profile.children.cycles-pp.hrtimer_interrupt 2.53 ± 10% +1.0 3.53 ± 12% perf-profile.children.cycles-pp.tick_nohz_handler 3.44 ± 8% +1.0 4.47 ± 10% perf-profile.children.cycles-pp.__hrtimer_run_queues 2.35 ± 5% +1.0 3.39 ± 3% perf-profile.children.cycles-pp.alloc_pages_noprof 4.03 ± 29% +1.3 5.28 ± 5% perf-profile.children.cycles-pp.wait_for_lsr 4.55 ± 29% +1.4 5.97 ± 5% perf-profile.children.cycles-pp.serial8250_console_write 4.84 ± 29% +1.5 6.32 ± 4% perf-profile.children.cycles-pp.console_flush_all 4.84 ± 29% +1.5 6.32 ± 4% perf-profile.children.cycles-pp.console_unlock 4.85 ± 29% +1.5 6.32 ± 4% perf-profile.children.cycles-pp.vprintk_emit 4.68 ± 30% +1.5 6.17 ± 4% perf-profile.children.cycles-pp.devkmsg_write 4.68 ± 30% +1.5 6.17 ± 4% perf-profile.children.cycles-pp.devkmsg_emit 5.02 ± 32% +1.5 6.52 perf-profile.children.cycles-pp.memcpy_toio 5.06 ± 32% +1.5 6.59 perf-profile.children.cycles-pp.drm_fb_memcpy 5.06 ± 32% +1.5 6.59 perf-profile.children.cycles-pp.ast_primary_plane_helper_atomic_update 5.07 ± 32% +1.5 6.60 perf-profile.children.cycles-pp.drm_atomic_commit 5.07 ± 32% +1.5 6.59 perf-profile.children.cycles-pp.drm_atomic_helper_commit_planes 5.07 ± 32% +1.5 6.60 perf-profile.children.cycles-pp.drm_atomic_helper_commit_tail 5.07 ± 32% +1.5 6.60 perf-profile.children.cycles-pp.ast_mode_config_helper_atomic_commit_tail 5.07 ± 32% +1.5 6.60 perf-profile.children.cycles-pp.commit_tail 5.07 ± 32% +1.5 6.60 perf-profile.children.cycles-pp.drm_atomic_helper_commit 5.07 ± 32% +1.5 6.60 perf-profile.children.cycles-pp.drm_atomic_helper_dirtyfb 5.07 ± 32% +1.5 6.60 perf-profile.children.cycles-pp.drm_fb_helper_damage_work 5.07 ± 32% +1.5 6.60 perf-profile.children.cycles-pp.drm_fbdev_shmem_helper_fb_dirty 7.25 ± 9% +1.9 9.13 ± 2% perf-profile.children.cycles-pp.rep_movs_alternative 7.50 ± 9% +1.9 9.40 ± 2% perf-profile.children.cycles-pp.copy_page_from_iter_atomic 3.96 ± 7% +2.0 6.00 ± 7% perf-profile.children.cycles-pp.memcpy_orig 4.18 ± 7% +2.1 6.30 ± 6% perf-profile.children.cycles-pp.copy_to_brd 6.53 ± 7% +2.8 9.36 ± 3% perf-profile.children.cycles-pp._raw_spin_lock 8.66 ± 6% +4.3 12.93 ± 3% perf-profile.children.cycles-pp.brd_insert_page 17.79 ± 4% +5.1 22.93 perf-profile.children.cycles-pp.__writeback_single_inode 17.79 ± 4% +5.1 22.93 perf-profile.children.cycles-pp.ext4_writepages 17.79 ± 4% +5.1 22.93 perf-profile.children.cycles-pp.do_writepages 17.79 ± 4% +5.1 22.93 perf-profile.children.cycles-pp.ext4_do_writepages 17.80 ± 4% +5.1 22.94 perf-profile.children.cycles-pp.writeback_sb_inodes 17.80 ± 4% +5.1 22.94 perf-profile.children.cycles-pp.wb_do_writeback 17.80 ± 4% +5.1 22.94 perf-profile.children.cycles-pp.wb_workfn 17.80 ± 4% +5.1 22.94 perf-profile.children.cycles-pp.wb_writeback 12.92 ± 4% +6.4 19.36 perf-profile.children.cycles-pp.brd_submit_bio 12.92 ± 4% +6.4 19.37 perf-profile.children.cycles-pp.__submit_bio 12.92 ± 4% +6.4 19.37 perf-profile.children.cycles-pp.__submit_bio_noacct 12.89 ± 4% +6.5 19.37 perf-profile.children.cycles-pp.ext4_io_submit 23.05 ± 4% +6.7 29.71 perf-profile.children.cycles-pp.kthread 22.96 ± 4% +6.7 29.61 perf-profile.children.cycles-pp.process_one_work 23.06 ± 4% +6.7 29.71 perf-profile.children.cycles-pp.ret_from_fork_asm 23.05 ± 4% +6.7 29.71 perf-profile.children.cycles-pp.ret_from_fork 22.98 ± 4% +6.7 29.64 perf-profile.children.cycles-pp.worker_thread 4.33 ± 4% -3.8 0.53 ± 8% perf-profile.self.cycles-pp.__block_commit_write 0.96 ± 6% -0.4 0.57 ± 8% perf-profile.self.cycles-pp._raw_spin_lock_irqsave 0.52 ± 8% -0.3 0.21 ± 10% perf-profile.self.cycles-pp.__mod_memcg_lruvec_state 0.37 ± 6% -0.3 0.10 ± 8% perf-profile.self.cycles-pp.lru_gen_add_folio 0.34 ± 6% -0.3 0.07 ± 5% perf-profile.self.cycles-pp.__filemap_add_folio 0.32 ± 8% -0.3 0.06 ± 45% perf-profile.self.cycles-pp.ext4_da_do_write_end 0.33 ± 9% -0.2 0.08 ± 10% perf-profile.self.cycles-pp.fault_in_readable 0.33 ± 11% -0.2 0.12 ± 10% perf-profile.self.cycles-pp.__folio_end_writeback 0.26 ± 8% -0.2 0.07 ± 20% perf-profile.self.cycles-pp.lru_add 0.36 ± 8% -0.2 0.18 ± 16% perf-profile.self.cycles-pp.__rmqueue_pcplist 0.37 ± 10% -0.2 0.19 ± 18% perf-profile.self.cycles-pp.percpu_counter_add_batch 0.24 ± 7% -0.2 0.07 ± 14% perf-profile.self.cycles-pp.create_empty_buffers 0.69 ± 7% -0.2 0.53 ± 6% perf-profile.self.cycles-pp.rmqueue_bulk 0.24 ± 9% -0.2 0.08 ± 8% perf-profile.self.cycles-pp.__folio_start_writeback 0.27 ± 7% -0.1 0.12 ± 8% perf-profile.self.cycles-pp.ext4_block_write_begin 0.22 ± 9% -0.1 0.08 ± 12% perf-profile.self.cycles-pp.folio_clear_dirty_for_io 0.26 ± 9% -0.1 0.12 ± 13% perf-profile.self.cycles-pp.folios_put_refs 0.22 ± 12% -0.1 0.08 ± 8% perf-profile.self.cycles-pp.folio_end_writeback 0.29 ± 7% -0.1 0.15 ± 5% perf-profile.self.cycles-pp.__lruvec_stat_mod_folio 0.19 ± 11% -0.1 0.06 ± 9% perf-profile.self.cycles-pp.node_dirty_ok 0.16 ± 4% -0.1 0.05 ± 49% perf-profile.self.cycles-pp.ext4_da_write_begin 0.18 ± 11% -0.1 0.07 ± 5% perf-profile.self.cycles-pp.__mod_node_page_state 0.20 ± 7% -0.1 0.08 ± 17% perf-profile.self.cycles-pp._raw_spin_lock_irq 0.16 ± 13% -0.1 0.07 ± 12% perf-profile.self.cycles-pp.ext4_da_write_end 0.32 ± 12% -0.1 0.23 ± 15% perf-profile.self.cycles-pp.get_page_from_freelist 0.11 ± 8% -0.1 0.02 ± 99% perf-profile.self.cycles-pp.__mod_zone_page_state 0.14 ± 8% -0.1 0.06 ± 19% perf-profile.self.cycles-pp.mpage_prepare_extent_to_map 0.14 ± 9% -0.1 0.06 ± 11% perf-profile.self.cycles-pp.cgroup_rstat_updated 0.21 ± 13% -0.1 0.13 ± 10% perf-profile.self.cycles-pp.xas_start 0.14 ± 37% -0.1 0.06 ± 21% perf-profile.self.cycles-pp.folio_alloc_buffers 0.34 ± 9% -0.1 0.27 ± 11% perf-profile.self.cycles-pp.__alloc_frozen_pages_noprof 0.16 ± 19% -0.1 0.09 ± 12% perf-profile.self.cycles-pp.generic_perform_write 0.08 ± 20% -0.1 0.03 ±100% perf-profile.self.cycles-pp.xas_find_marked 0.11 ± 18% -0.0 0.06 ± 19% perf-profile.self.cycles-pp._raw_spin_unlock_irqrestore 0.20 ± 11% -0.0 0.16 ± 6% perf-profile.self.cycles-pp._raw_spin_trylock 0.14 ± 7% -0.0 0.11 ± 8% perf-profile.self.cycles-pp.up_write 0.05 ± 48% +0.0 0.08 ± 21% perf-profile.self.cycles-pp.bvec_try_merge_page 0.04 ± 71% +0.0 0.08 ± 10% perf-profile.self.cycles-pp.alloc_pages_noprof 0.04 ± 71% +0.0 0.08 ± 22% perf-profile.self.cycles-pp.__xa_insert 0.03 ±101% +0.1 0.09 ± 17% perf-profile.self.cycles-pp.update_process_times 0.09 ± 17% +0.1 0.14 ± 13% perf-profile.self.cycles-pp.brd_submit_bio 0.20 ± 9% +0.1 0.27 ± 10% perf-profile.self.cycles-pp.ext4_bio_write_folio 0.00 +0.1 0.13 ± 8% perf-profile.self.cycles-pp.folio_alloc_noprof 0.52 ± 29% +0.2 0.68 ± 5% perf-profile.self.cycles-pp.io_serial_out 0.29 ± 36% +0.2 0.51 ± 26% perf-profile.self.cycles-pp.tick_nohz_handler 0.20 ± 8% +0.3 0.47 ± 14% perf-profile.self.cycles-pp.ext4_finish_bio 1.39 ± 10% +0.6 1.96 ± 3% perf-profile.self.cycles-pp.clear_page_erms 0.54 ± 34% +0.6 1.15 ± 24% perf-profile.self.cycles-pp.get_jiffies_update 4.90 ± 32% +1.4 6.34 perf-profile.self.cycles-pp.memcpy_toio 7.20 ± 9% +1.9 9.08 ± 2% perf-profile.self.cycles-pp.rep_movs_alternative 3.94 ± 7% +2.0 5.96 ± 6% perf-profile.self.cycles-pp.memcpy_orig 6.48 ± 7% +2.8 9.28 ± 3% perf-profile.self.cycles-pp._raw_spin_lock Disclaimer: Results have been estimated based on internal Intel analysis and are provided for informational purposes only. Any difference in system hardware or software design or configuration may affect actual performance.
On Mon, May 12, 2025 at 02:33:19PM +0800, Zhang Yi wrote: > From: Zhang Yi <yi.zhang@huawei.com> > > Besides fsverity, fscrypt, and the data=journal mode, ext4 now supports > large folios for regular files. Enable this feature by default. However, > since we cannot change the folio order limitation of mappings on active > inodes, setting the journal=data mode via ioctl on an active inode will > not take immediate effect in non-delalloc mode. > Looks good: Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com> Thanks, Ojaswin > Signed-off-by: Zhang Yi <yi.zhang@huawei.com> > --- > fs/ext4/ext4.h | 1 + > fs/ext4/ext4_jbd2.c | 3 ++- > fs/ext4/ialloc.c | 3 +++ > fs/ext4/inode.c | 20 ++++++++++++++++++++ > 4 files changed, 26 insertions(+), 1 deletion(-) > > diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h > index 5a20e9cd7184..2fad90c30493 100644 > --- a/fs/ext4/ext4.h > +++ b/fs/ext4/ext4.h > @@ -2993,6 +2993,7 @@ int ext4_walk_page_buffers(handle_t *handle, > struct buffer_head *bh)); > int do_journal_get_write_access(handle_t *handle, struct inode *inode, > struct buffer_head *bh); > +bool ext4_should_enable_large_folio(struct inode *inode); > #define FALL_BACK_TO_NONDELALLOC 1 > #define CONVERT_INLINE_DATA 2 > > diff --git a/fs/ext4/ext4_jbd2.c b/fs/ext4/ext4_jbd2.c > index 135e278c832e..b3e9b7bd7978 100644 > --- a/fs/ext4/ext4_jbd2.c > +++ b/fs/ext4/ext4_jbd2.c > @@ -16,7 +16,8 @@ int ext4_inode_journal_mode(struct inode *inode) > ext4_test_inode_flag(inode, EXT4_INODE_EA_INODE) || > test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA || > (ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA) && > - !test_opt(inode->i_sb, DELALLOC))) { > + !test_opt(inode->i_sb, DELALLOC) && > + !mapping_large_folio_support(inode->i_mapping))) { > /* We do not support data journalling for encrypted data */ > if (S_ISREG(inode->i_mode) && IS_ENCRYPTED(inode)) > return EXT4_INODE_ORDERED_DATA_MODE; /* ordered */ > diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c > index e7ecc7c8a729..4938e78cbadc 100644 > --- a/fs/ext4/ialloc.c > +++ b/fs/ext4/ialloc.c > @@ -1336,6 +1336,9 @@ struct inode *__ext4_new_inode(struct mnt_idmap *idmap, > } > } > > + if (ext4_should_enable_large_folio(inode)) > + mapping_set_large_folios(inode->i_mapping); > + > ext4_update_inode_fsync_trans(handle, inode, 1); > > err = ext4_mark_inode_dirty(handle, inode); > diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c > index 29eccdf8315a..7fd3921cfe46 100644 > --- a/fs/ext4/inode.c > +++ b/fs/ext4/inode.c > @@ -4774,6 +4774,23 @@ static int check_igot_inode(struct inode *inode, ext4_iget_flags flags, > return -EFSCORRUPTED; > } > > +bool ext4_should_enable_large_folio(struct inode *inode) > +{ > + struct super_block *sb = inode->i_sb; > + > + if (!S_ISREG(inode->i_mode)) > + return false; > + if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA || > + ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA)) > + return false; > + if (ext4_has_feature_verity(sb)) > + return false; > + if (ext4_has_feature_encrypt(sb)) > + return false; > + > + return true; > +} > + > struct inode *__ext4_iget(struct super_block *sb, unsigned long ino, > ext4_iget_flags flags, const char *function, > unsigned int line) > @@ -5096,6 +5113,9 @@ struct inode *__ext4_iget(struct super_block *sb, unsigned long ino, > ret = -EFSCORRUPTED; > goto bad_inode; > } > + if (ext4_should_enable_large_folio(inode)) > + mapping_set_large_folios(inode->i_mapping); > + > ret = check_igot_inode(inode, flags, function, line); > /* > * -ESTALE here means there is nothing inherently wrong with the inode, > -- > 2.46.1 >
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 5a20e9cd7184..2fad90c30493 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -2993,6 +2993,7 @@ int ext4_walk_page_buffers(handle_t *handle, struct buffer_head *bh)); int do_journal_get_write_access(handle_t *handle, struct inode *inode, struct buffer_head *bh); +bool ext4_should_enable_large_folio(struct inode *inode); #define FALL_BACK_TO_NONDELALLOC 1 #define CONVERT_INLINE_DATA 2 diff --git a/fs/ext4/ext4_jbd2.c b/fs/ext4/ext4_jbd2.c index 135e278c832e..b3e9b7bd7978 100644 --- a/fs/ext4/ext4_jbd2.c +++ b/fs/ext4/ext4_jbd2.c @@ -16,7 +16,8 @@ int ext4_inode_journal_mode(struct inode *inode) ext4_test_inode_flag(inode, EXT4_INODE_EA_INODE) || test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA || (ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA) && - !test_opt(inode->i_sb, DELALLOC))) { + !test_opt(inode->i_sb, DELALLOC) && + !mapping_large_folio_support(inode->i_mapping))) { /* We do not support data journalling for encrypted data */ if (S_ISREG(inode->i_mode) && IS_ENCRYPTED(inode)) return EXT4_INODE_ORDERED_DATA_MODE; /* ordered */ diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index e7ecc7c8a729..4938e78cbadc 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c @@ -1336,6 +1336,9 @@ struct inode *__ext4_new_inode(struct mnt_idmap *idmap, } } + if (ext4_should_enable_large_folio(inode)) + mapping_set_large_folios(inode->i_mapping); + ext4_update_inode_fsync_trans(handle, inode, 1); err = ext4_mark_inode_dirty(handle, inode); diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 29eccdf8315a..7fd3921cfe46 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -4774,6 +4774,23 @@ static int check_igot_inode(struct inode *inode, ext4_iget_flags flags, return -EFSCORRUPTED; } +bool ext4_should_enable_large_folio(struct inode *inode) +{ + struct super_block *sb = inode->i_sb; + + if (!S_ISREG(inode->i_mode)) + return false; + if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA || + ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA)) + return false; + if (ext4_has_feature_verity(sb)) + return false; + if (ext4_has_feature_encrypt(sb)) + return false; + + return true; +} + struct inode *__ext4_iget(struct super_block *sb, unsigned long ino, ext4_iget_flags flags, const char *function, unsigned int line) @@ -5096,6 +5113,9 @@ struct inode *__ext4_iget(struct super_block *sb, unsigned long ino, ret = -EFSCORRUPTED; goto bad_inode; } + if (ext4_should_enable_large_folio(inode)) + mapping_set_large_folios(inode->i_mapping); + ret = check_igot_inode(inode, flags, function, line); /* * -ESTALE here means there is nothing inherently wrong with the inode,