diff mbox series

fs: btrfs: Optimize code execution process to save time

Message ID 20230626100716.18935-1-luhongfei@vivo.com (mailing list archive)
State New, archived
Headers show
Series fs: btrfs: Optimize code execution process to save time | expand

Commit Message

Lu Hongfei June 26, 2023, 10:07 a.m. UTC
Originally, the btrfs_check_data_free_space used round_down twice when
aligning the range, which to some extent increased the execution time of
the code.
After optimization, round_down only needs to be executed once, which can
improve code efficiency and increase code readability.

Signed-off-by: Lu Hongfei <luhongfei@vivo.com>
---
 fs/btrfs/delalloc-space.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

Comments

David Sterba June 29, 2023, 3:33 p.m. UTC | #1
On Mon, Jun 26, 2023 at 06:07:16PM +0800, Lu Hongfei wrote:
> Originally, the btrfs_check_data_free_space used round_down twice when
> aligning the range, which to some extent increased the execution time of
> the code.
> After optimization, round_down only needs to be executed once, which can
> improve code efficiency and increase code readability.

But the code is not equivalent, because there is dependency on the value
of start that changes when the line is moved.

> Signed-off-by: Lu Hongfei <luhongfei@vivo.com>
> ---
>  fs/btrfs/delalloc-space.c | 3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)
> 
> diff --git a/fs/btrfs/delalloc-space.c b/fs/btrfs/delalloc-space.c
> index 427abaf608b8..fd33b1cf1954 100644
> --- a/fs/btrfs/delalloc-space.c
> +++ b/fs/btrfs/delalloc-space.c
> @@ -137,9 +137,8 @@ int btrfs_check_data_free_space(struct btrfs_inode *inode,
>  	int ret;
>  
>  	/* align the range */
> -	len = round_up(start + len, fs_info->sectorsize) -
> -	      round_down(start, fs_info->sectorsize);

Start is used unchanged, start + len

>  	start = round_down(start, fs_info->sectorsize);
> +	len = round_up(start + len, fs_info->sectorsize) - start;

New code uses the rounded down start for round_up, then for "- start"
it's the same (that part is ok).

The changelog should explain why the code is still doing the same, not
just that it's reducing the number of round_down() calls.
kernel test robot July 10, 2023, 1:35 a.m. UTC | #2
Hello,

kernel test robot noticed "WARNING:at_fs/btrfs/space-info.h:#btrfs_add_reserved_bytes[btrfs]" on:

commit: 533c820308d1b334d45bcf76ce839e7696862d3d ("[PATCH] fs: btrfs: Optimize code execution process to save time")
url: https://github.com/intel-lab-lkp/linux/commits/Lu-Hongfei/fs-btrfs-Optimize-code-execution-process-to-save-time/20230626-180916
base: https://git.kernel.org/cgit/linux/kernel/git/kdave/linux.git for-next
patch link: https://lore.kernel.org/all/20230626100716.18935-1-luhongfei@vivo.com/
patch subject: [PATCH] fs: btrfs: Optimize code execution process to save time

in testcase: xfstests
version: xfstests-x86_64-06c027a-1_20230706
with following parameters:

	disk: 4HDD
	fs: btrfs
	test: generic-group-56



compiler: gcc-12
test machine: 4 threads Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz (Skylake) with 32G memory

(please refer to attached dmesg/kmsg for entire log/backtrace)



If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <oliver.sang@intel.com>
| Closes: https://lore.kernel.org/oe-lkp/202307100954.4321daa9-oliver.sang@intel.com



[  162.967008][   T41] ------------[ cut here ]------------
[  162.972420][   T41] WARNING: CPU: 2 PID: 41 at fs/btrfs/space-info.h:198 btrfs_add_reserved_bytes+0x5b0/0x760 [btrfs]
[  162.983012][   T41] Modules linked in: dm_mod btrfs blake2b_generic xor raid6_pq zstd_compress libcrc32c sd_mod t10_pi crc64_rocksoft_generic intel_r
apl_msr crc64_rocksoft intel_rapl_common crc64 x86_pkg_temp_thermal sg intel_powerclamp coretemp kvm_intel kvm irqbypass crct10dif_pclmul ipmi_devintf c
rc32_pclmul mei_wdt ipmi_msghandler crc32c_intel ghash_clmulni_intel sha512_ssse3 i915 rapl wmi_bmof intel_cstate drm_buddy intel_gtt ahci libahci drm_d
isplay_helper intel_uncore drm_kms_helper libata mei_me mei syscopyarea sysfillrect sysimgblt intel_pch_thermal ttm video wmi intel_pmc_core acpi_pad dr
m fuse ip_tables
[  163.036856][   T41] CPU: 2 PID: 41 Comm: kworker/u8:3 Tainted: G          I        6.4.0-rc7-00205-g533c820308d1 #1
[  163.047178][   T41] Hardware name: Dell Inc. OptiPlex 7040/0Y7WYT, BIOS 1.1.1 10/07/2015
[  163.055179][   T41] Workqueue: writeback wb_workfn (flush-btrfs-10)
[  163.061380][   T41] RIP: 0010:btrfs_add_reserved_bytes+0x5b0/0x760 [btrfs]
[  163.068254][   T41] Code: d8 4c 0f 48 c0 e8 00 99 d6 ff 65 ff 0d a1 c7 57 3e 0f 85 29 fc ff ff 0f 1f 44 00 00 e9 1f fc ff ff 4c 39 e0 0f 83 40 fc ff
ff <0f> 0b 31 c0 e9 3a fc ff ff 48 b8 00 00 00 00 00 fc ff df 48 89 da
[  163.087506][   T41] RSP: 0018:ffffc90000326d10 EFLAGS: 00010287
[  163.093360][   T41] RAX: 0000000000007000 RBX: ffff88813e5db800 RCX: 0000000000000001
[  163.101102][   T41] RDX: 1ffff11027cbb005 RSI: 0000000000000004 RDI: ffff88813e5d8020
[  163.108845][   T41] RBP: 0000000000008000 R08: 0000000000000001 R09: 0000000000000003
[  163.116589][   T41] R10: fffff52000064d97 R11: 0000000000008000 R12: 0000000000008000
[  163.124333][   T41] R13: ffff88813e5d8000 R14: ffff88813e5d8028 R15: ffff88813e5d8070
[  163.132076][   T41] FS:  0000000000000000(0000) GS:ffff888731300000(0000) knlGS:0000000000000000
[  163.140763][   T41] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[  163.147134][   T41] CR2: 00007fffc777e298 CR3: 000000086fe44002 CR4: 00000000003706e0
[  163.154884][   T41] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[  163.162624][   T41] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
[  163.170378][   T41] Call Trace:
[  163.173489][   T41]  <TASK>
[  163.176259][   T41]  ? __warn+0xcd/0x260
[  163.180149][   T41]  ? btrfs_add_reserved_bytes+0x5b0/0x760 [btrfs]
[  163.186457][   T41]  ? report_bug+0x267/0x2d0
[  163.190780][   T41]  ? handle_bug+0x3c/0x70
[  163.194923][   T41]  ? exc_invalid_op+0x17/0x40
[  163.199407][   T41]  ? asm_exc_invalid_op+0x1a/0x20
[  163.204235][   T41]  ? btrfs_add_reserved_bytes+0x5b0/0x760 [btrfs]
[  163.210507][   T41]  ? kmem_cache_free+0x183/0x490
[  163.215251][   T41]  find_free_extent+0x1382/0x2a80 [btrfs]
[  163.220829][   T41]  ? do_allocation+0x5e0/0x5e0 [btrfs]
[  163.227175][   T41]  btrfs_reserve_extent+0x2c2/0x600 [btrfs]
[  163.232919][   T41]  ? walk_down_tree+0x530/0x530 [btrfs]
[  163.238317][   T41]  ? __set_extent_bit+0xbb5/0x1260 [btrfs]
[  163.243987][   T41]  ? __lookup_extent_mapping+0x1d8/0x2d0 [btrfs]
[  163.250165][   T41]  cow_file_range+0x3d3/0xb30 [btrfs]
[  163.255401][   T41]  ? async_cow_start+0x80/0x80 [btrfs]
[  163.260716][   T41]  ? lock_delalloc_pages+0x160/0x160 [btrfs]
[  163.266551][   T41]  btrfs_run_delalloc_range+0x2b2/0x4b0 [btrfs]
[  163.272641][   T41]  ? submit_bio_noacct_nocheck+0x395/0x630
[  163.278240][   T41]  ? write_extent_buffer+0x1ae/0x2a0 [btrfs]
[  163.284076][   T41]  writepage_delalloc+0x175/0x290 [btrfs]
[  163.289655][   T41]  ? find_lock_delalloc_range+0x4c0/0x4c0 [btrfs]
[  163.295926][   T41]  __extent_writepage+0x248/0x810 [btrfs]
[  163.301504][   T41]  ? btrfs_do_readpage+0x1090/0x1090 [btrfs]
[  163.307339][   T41]  ? folio_clear_dirty_for_io+0x16a/0x400
[  163.312855][   T41]  extent_write_cache_pages+0x2b2/0x9a0 [btrfs]
[  163.318949][   T41]  ? __extent_writepage+0x810/0x810 [btrfs]
[  163.324702][   T41]  ? submit_eb_page+0x490/0x490 [btrfs]
[  163.330110][   T41]  ? orc_find+0x1da/0x3b0
[  163.334853][   T41]  extent_writepages+0x1cc/0x450 [btrfs]
[  163.340347][   T41]  ? extent_write_locked_range+0x830/0x830 [btrfs]
[  163.346700][   T41]  ? __module_address+0x4d/0x200
[  163.351442][   T41]  ? 0xffffffffc1825000
[  163.355410][   T41]  ? btrfs_work_helper+0x159/0x5e0 [btrfs]
[  163.361078][   T41]  do_writepages+0x17b/0x650
[  163.365477][   T41]  ? 0xffffffffc1825000
[  163.369446][   T41]  ? writeback_set_ratelimit+0x120/0x120
[  163.374874][   T41]  ? btrfs_work_helper+0x159/0x5e0 [btrfs]
[  163.380540][   T41]  ? _raw_spin_lock+0x85/0xe0
[  163.385022][   T41]  ? _raw_write_lock_irq+0xe0/0xe0
[  163.389933][   T41]  __writeback_single_inode+0xd5/0x610
[  163.395190][   T41]  ? _raw_spin_lock+0x85/0xe0
[  163.399673][   T41]  ? __mark_inode_dirty+0x800/0x800
[  163.404676][   T41]  ? wbc_attach_and_unlock_inode+0x319/0x590
[  163.410454][   T41]  ? inode_io_list_move_locked+0x25c/0x360
[  163.416062][   T41]  writeback_sb_inodes+0x4c1/0xd00
[  163.420983][   T41]  ? sync_inode_metadata+0xd0/0xd0
[  163.425908][   T41]  ? queue_io+0x284/0x380
[  163.430053][   T41]  ? ret_from_fork+0x1f/0x30
[  163.434453][   T41]  wb_writeback+0x22e/0x6b0
[  163.438766][   T41]  ? __writeback_inodes_wb+0x270/0x270
[  163.444024][   T41]  ? _raw_spin_lock_irq+0x86/0xe0
[  163.448849][   T41]  ? _raw_spin_lock_bh+0xe0/0xe0
[  163.453592][   T41]  wb_do_writeback+0x17c/0x770
[  163.458160][   T41]  ? wb_writeback+0x6b0/0x6b0
[  163.462645][   T41]  ? set_worker_desc+0x172/0x190
[  163.467387][   T41]  ? idle_cull_fn+0x3b0/0x3b0
[  163.471872][   T41]  ? btrfs_finish_one_ordered+0x425/0x1610 [btrfs]
[  163.478224][   T41]  ? kmem_cache_free+0x183/0x490
[  163.482966][   T41]  ? __btrfs_end_transaction+0x311/0x700 [btrfs]
[  163.489143][   T41]  wb_workfn+0xef/0x530
[  163.493113][   T41]  ? inode_wait_for_writeback+0x30/0x30
[  163.498456][   T41]  ? btrfs_unlink_subvol+0xc80/0xc80 [btrfs]
[  163.504288][   T41]  ? try_to_wake_up+0xf6/0x1250
[  163.508946][   T41]  ? _raw_spin_lock_irq+0x86/0xe0
[  163.513775][   T41]  ? read_word_at_a_time+0xe/0x20
[  163.518600][   T41]  ? strscpy+0xad/0x280
[  163.522569][   T41]  process_one_work+0x691/0x10b0
[  163.527312][   T41]  worker_thread+0x102/0x1360
[  163.531796][   T41]  ? process_one_work+0x10b0/0x10b0
[  163.536794][   T41]  kthread+0x2d6/0x3b0
[  163.540681][   T41]  ? kthread_complete_and_exit+0x30/0x30
[  163.546110][   T41]  ret_from_fork+0x1f/0x30
[  163.550336][   T41]  </TASK>
[  163.553185][   T41] ---[ end trace 0000000000000000 ]---



To reproduce:

        git clone https://github.com/intel/lkp-tests.git
        cd lkp-tests
        sudo bin/lkp install job.yaml           # job file is attached in this email
        bin/lkp split-job --compatible job.yaml # generate the yaml file for lkp run
        sudo bin/lkp run generated-yaml-file

        # if come across any failure that blocks the test,
        # please remove ~/.lkp and /lkp dir to run from a clean state.
diff mbox series

Patch

diff --git a/fs/btrfs/delalloc-space.c b/fs/btrfs/delalloc-space.c
index 427abaf608b8..fd33b1cf1954 100644
--- a/fs/btrfs/delalloc-space.c
+++ b/fs/btrfs/delalloc-space.c
@@ -137,9 +137,8 @@  int btrfs_check_data_free_space(struct btrfs_inode *inode,
 	int ret;
 
 	/* align the range */
-	len = round_up(start + len, fs_info->sectorsize) -
-	      round_down(start, fs_info->sectorsize);
 	start = round_down(start, fs_info->sectorsize);
+	len = round_up(start + len, fs_info->sectorsize) - start;
 
 	if (noflush)
 		flush = BTRFS_RESERVE_NO_FLUSH;