summaryrefslogtreecommitdiffstats
path: root/tools/testing/selftests/bpf/prog_tests/autoload.c
diff options
context:
space:
mode:
authorQu Wenruo <wqu@suse.com>2025-03-29 17:46:35 +1030
committerDavid Sterba <dsterba@suse.com>2025-04-17 11:55:34 +0200
commitbc2dbc4983afedd198490cca043798f57c93e9bf (patch)
tree4eb2126bc5c40faa3df9b05a6fd863f9004c8f8d /tools/testing/selftests/bpf/prog_tests/autoload.c
parentcf6ae7ed091059a8d1a70cf184f18ebfd18ab4af (diff)
downloadlinux-bc2dbc4983afedd198490cca043798f57c93e9bf.tar.gz
linux-bc2dbc4983afedd198490cca043798f57c93e9bf.tar.bz2
linux-bc2dbc4983afedd198490cca043798f57c93e9bf.zip
btrfs: avoid page_lockend underflow in btrfs_punch_hole_lock_range()
[BUG] When running btrfs/004 with 4K fs block size and 64K page size, sometimes fsstress workload can take 100% CPU for a while, but not long enough to trigger a 120s hang warning. [CAUSE] When such 100% CPU usage happens, btrfs_punch_hole_lock_range() is always in the call trace. One example when this problem happens, the function btrfs_punch_hole_lock_range() got the following parameters: lock_start = 4096, lockend = 20469 Then we calculate @page_lockstart by rounding up lock_start to page boundary, which is 64K (page size is 64K). For @page_lockend, we round down the value towards page boundary, which result 0. Then since we need to pass an inclusive end to filemap_range_has_page(), we subtract 1 from the rounded down value, resulting in (u64)-1. In the above case, the range is inside the same page, and we do not even need to call filemap_range_has_page(), not to mention to call it with (u64)-1 at the end. This behavior will cause btrfs_punch_hole_lock_range() to busy loop waiting for irrelevant range to have its pages dropped. [FIX] Calculate @page_lockend by just rounding down @lockend, without decreasing the value by one. So @page_lockend will no longer overflow. Then exit early if @page_lockend is no larger than @page_lockstart. As it means either the range is inside the same page, or the two pages are adjacent already. Finally only decrease @page_lockend when calling filemap_range_has_page(). Fixes: 0528476b6ac7 ("btrfs: fix the filemap_range_has_page() call in btrfs_punch_hole_lock_range()") Reviewed-by: Filipe Manana <fdmanana@suse.com> Signed-off-by: Qu Wenruo <wqu@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'tools/testing/selftests/bpf/prog_tests/autoload.c')
0 files changed, 0 insertions, 0 deletions