From a4af538ce732be5eb211650c31a141713ab93e9c Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Tue, 20 May 2025 12:56:31 +0200 Subject: [PATCH] 5.10-stable patches added patches: btrfs-don-t-bug_on-when-0-reference-count-at-btrfs_lookup_extent_info.patch selftests-mm-compaction_test-support-platform-with-huge-mount-of-memory.patch --- ...ce-count-at-btrfs_lookup_extent_info.patch | 72 +++++++++++++++++++ ...t-platform-with-huge-mount-of-memory.patch | 72 +++++++++++++++++++ queue-5.10/series | 2 + 3 files changed, 146 insertions(+) create mode 100644 queue-5.10/btrfs-don-t-bug_on-when-0-reference-count-at-btrfs_lookup_extent_info.patch create mode 100644 queue-5.10/selftests-mm-compaction_test-support-platform-with-huge-mount-of-memory.patch diff --git a/queue-5.10/btrfs-don-t-bug_on-when-0-reference-count-at-btrfs_lookup_extent_info.patch b/queue-5.10/btrfs-don-t-bug_on-when-0-reference-count-at-btrfs_lookup_extent_info.patch new file mode 100644 index 0000000000..48f9c22507 --- /dev/null +++ b/queue-5.10/btrfs-don-t-bug_on-when-0-reference-count-at-btrfs_lookup_extent_info.patch @@ -0,0 +1,72 @@ +From 28cb13f29faf6290597b24b728dc3100c019356f Mon Sep 17 00:00:00 2001 +From: Filipe Manana +Date: Tue, 18 Jun 2024 12:15:01 +0100 +Subject: btrfs: don't BUG_ON() when 0 reference count at btrfs_lookup_extent_info() + +From: Filipe Manana + +commit 28cb13f29faf6290597b24b728dc3100c019356f upstream. + +Instead of doing a BUG_ON() handle the error by returning -EUCLEAN, +aborting the transaction and logging an error message. + +Reviewed-by: Qu Wenruo +Signed-off-by: Filipe Manana +Signed-off-by: David Sterba +[Minor conflict resolved due to code context change.] +Signed-off-by: Jianqi Ren +Signed-off-by: He Zhe +Signed-off-by: Greg Kroah-Hartman +--- + fs/btrfs/extent-tree.c | 25 ++++++++++++++++++++----- + 1 file changed, 20 insertions(+), 5 deletions(-) + +--- a/fs/btrfs/extent-tree.c ++++ b/fs/btrfs/extent-tree.c +@@ -174,6 +174,14 @@ search_again: + ei = btrfs_item_ptr(leaf, path->slots[0], + struct btrfs_extent_item); + num_refs = btrfs_extent_refs(leaf, ei); ++ if (unlikely(num_refs == 0)) { ++ ret = -EUCLEAN; ++ btrfs_err(fs_info, ++ "unexpected zero reference count for extent item (%llu %u %llu)", ++ key.objectid, key.type, key.offset); ++ btrfs_abort_transaction(trans, ret); ++ goto out_free; ++ } + extent_flags = btrfs_extent_flags(leaf, ei); + } else { + ret = -EINVAL; +@@ -185,8 +193,6 @@ search_again: + + goto out_free; + } +- +- BUG_ON(num_refs == 0); + } else { + num_refs = 0; + extent_flags = 0; +@@ -216,10 +222,19 @@ search_again: + goto search_again; + } + spin_lock(&head->lock); +- if (head->extent_op && head->extent_op->update_flags) ++ if (head->extent_op && head->extent_op->update_flags) { + extent_flags |= head->extent_op->flags_to_set; +- else +- BUG_ON(num_refs == 0); ++ } else if (unlikely(num_refs == 0)) { ++ spin_unlock(&head->lock); ++ mutex_unlock(&head->mutex); ++ spin_unlock(&delayed_refs->lock); ++ ret = -EUCLEAN; ++ btrfs_err(fs_info, ++ "unexpected zero reference count for extent %llu (%s)", ++ bytenr, metadata ? "metadata" : "data"); ++ btrfs_abort_transaction(trans, ret); ++ goto out_free; ++ } + + num_refs += head->ref_mod; + spin_unlock(&head->lock); diff --git a/queue-5.10/selftests-mm-compaction_test-support-platform-with-huge-mount-of-memory.patch b/queue-5.10/selftests-mm-compaction_test-support-platform-with-huge-mount-of-memory.patch new file mode 100644 index 0000000000..489b9bff38 --- /dev/null +++ b/queue-5.10/selftests-mm-compaction_test-support-platform-with-huge-mount-of-memory.patch @@ -0,0 +1,72 @@ +From ab00ddd802f80e31fc9639c652d736fe3913feae Mon Sep 17 00:00:00 2001 +From: Feng Tang +Date: Wed, 23 Apr 2025 18:36:45 +0800 +Subject: selftests/mm: compaction_test: support platform with huge mount of memory + +From: Feng Tang + +commit ab00ddd802f80e31fc9639c652d736fe3913feae upstream. + +When running mm selftest to verify mm patches, 'compaction_test' case +failed on an x86 server with 1TB memory. And the root cause is that it +has too much free memory than what the test supports. + +The test case tries to allocate 100000 huge pages, which is about 200 GB +for that x86 server, and when it succeeds, it expects it's large than 1/3 +of 80% of the free memory in system. This logic only works for platform +with 750 GB ( 200 / (1/3) / 80% ) or less free memory, and may raise false +alarm for others. + +Fix it by changing the fixed page number to self-adjustable number +according to the real number of free memory. + +Link: https://lkml.kernel.org/r/20250423103645.2758-1-feng.tang@linux.alibaba.com +Fixes: bd67d5c15cc1 ("Test compaction of mlocked memory") +Signed-off-by: Feng Tang +Acked-by: Dev Jain +Reviewed-by: Baolin Wang +Tested-by: Baolin Wang +Cc: Shuah Khan +Cc: Sri Jayaramappa +Cc: +Signed-off-by: Andrew Morton +Signed-off-by: Greg Kroah-Hartman +--- + tools/testing/selftests/vm/compaction_test.c | 19 ++++++++++++++----- + 1 file changed, 14 insertions(+), 5 deletions(-) + +--- a/tools/testing/selftests/vm/compaction_test.c ++++ b/tools/testing/selftests/vm/compaction_test.c +@@ -89,6 +89,8 @@ int check_compaction(unsigned long mem_f + int compaction_index = 0; + char initial_nr_hugepages[20] = {0}; + char nr_hugepages[20] = {0}; ++ char target_nr_hugepages[24] = {0}; ++ int slen; + + /* We want to test with 80% of available memory. Else, OOM killer comes + in to play */ +@@ -118,11 +120,18 @@ int check_compaction(unsigned long mem_f + + lseek(fd, 0, SEEK_SET); + +- /* Request a large number of huge pages. The Kernel will allocate +- as much as it can */ +- if (write(fd, "100000", (6*sizeof(char))) != (6*sizeof(char))) { +- ksft_test_result_fail("Failed to write 100000 to /proc/sys/vm/nr_hugepages: %s\n", +- strerror(errno)); ++ /* ++ * Request huge pages for about half of the free memory. The Kernel ++ * will allocate as much as it can, and we expect it will get at least 1/3 ++ */ ++ nr_hugepages_ul = mem_free / hugepage_size / 2; ++ snprintf(target_nr_hugepages, sizeof(target_nr_hugepages), ++ "%lu", nr_hugepages_ul); ++ ++ slen = strlen(target_nr_hugepages); ++ if (write(fd, target_nr_hugepages, slen) != slen) { ++ ksft_test_result_fail("Failed to write %lu to /proc/sys/vm/nr_hugepages: %s\n", ++ nr_hugepages_ul, strerror(errno)); + goto close_fd; + } + diff --git a/queue-5.10/series b/queue-5.10/series index 31542be45a..b2c8433efe 100644 --- a/queue-5.10/series +++ b/queue-5.10/series @@ -107,3 +107,5 @@ drm-vmwgfx-fix-a-deadlock-in-dma-buf-fence-polling.patch usb-typec-altmodes-displayport-create-sysfs-nodes-as-driver-s-default-device-attribute-group.patch usb-typec-fix-potential-array-underflow-in-ucsi_ccg_sync_control.patch usb-typec-fix-pm-usage-counter-imbalance-in-ucsi_ccg_sync_control.patch +selftests-mm-compaction_test-support-platform-with-huge-mount-of-memory.patch +btrfs-don-t-bug_on-when-0-reference-count-at-btrfs_lookup_extent_info.patch -- 2.47.3