Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

mm/huge_memory: only get folio_order() once during __folio_split()

Before splitting folio, its order keeps the same.

It is only necessary to get folio_order() once.

Also rename order to old_order to represent the original folio order.

Link: https://lkml.kernel.org/r/20251010141142.1349-1-richard.weiyang@gmail.com
Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
Acked-by: Lance Yang <lance.yang@linux.dev>
Acked-by: David Hildenbrand <david@redhat.com>
Cc: Zi Yan <ziy@nvidia.com>
Cc: Dev Jain <dev.jain@arm.com>
Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Cc: Baolin Wang <baolin.wang@linux.alibaba.com>
Cc: "Liam R. Howlett" <Liam.Howlett@oracle.com>
Cc: Nico Pache <npache@redhat.com>
Cc: Ryan Roberts <ryan.roberts@arm.com>
Cc: Barry Song <baohua@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Wei Yang and committed by
Andrew Morton
d87f4a8f ac775677

+9 -9
+9 -9
mm/huge_memory.c
··· 3682 3682 bool is_anon = folio_test_anon(folio); 3683 3683 struct address_space *mapping = NULL; 3684 3684 struct anon_vma *anon_vma = NULL; 3685 - int order = folio_order(folio); 3685 + int old_order = folio_order(folio); 3686 3686 struct folio *new_folio, *next; 3687 3687 int nr_shmem_dropped = 0; 3688 3688 int remap_flags = 0; ··· 3706 3706 if (!is_anon && !folio->mapping) 3707 3707 return -EBUSY; 3708 3708 3709 - if (new_order >= folio_order(folio)) 3709 + if (new_order >= old_order) 3710 3710 return -EINVAL; 3711 3711 3712 3712 if (uniform_split && !uniform_split_supported(folio, new_order, true)) ··· 3764 3764 3765 3765 if (uniform_split) { 3766 3766 xas_set_order(&xas, folio->index, new_order); 3767 - xas_split_alloc(&xas, folio, folio_order(folio), gfp); 3767 + xas_split_alloc(&xas, folio, old_order, gfp); 3768 3768 if (xas_error(&xas)) { 3769 3769 ret = xas_error(&xas); 3770 3770 goto out; ··· 3820 3820 struct lruvec *lruvec; 3821 3821 int expected_refs; 3822 3822 3823 - if (folio_order(folio) > 1 && 3823 + if (old_order > 1 && 3824 3824 !list_empty(&folio->_deferred_list)) { 3825 3825 ds_queue->split_queue_len--; 3826 3826 if (folio_test_partially_mapped(folio)) { 3827 3827 folio_clear_partially_mapped(folio); 3828 - mod_mthp_stat(folio_order(folio), 3829 - MTHP_STAT_NR_ANON_PARTIALLY_MAPPED, -1); 3828 + mod_mthp_stat(old_order, 3829 + MTHP_STAT_NR_ANON_PARTIALLY_MAPPED, -1); 3830 3830 } 3831 3831 /* 3832 3832 * Reinitialize page_deferred_list after removing the ··· 3954 3954 if (!ret && is_anon && !folio_is_device_private(folio)) 3955 3955 remap_flags = RMP_USE_SHARED_ZEROPAGE; 3956 3956 3957 - remap_page(folio, 1 << order, remap_flags); 3957 + remap_page(folio, 1 << old_order, remap_flags); 3958 3958 3959 3959 /* 3960 3960 * Unlock all after-split folios except the one containing ··· 3985 3985 i_mmap_unlock_read(mapping); 3986 3986 out: 3987 3987 xas_destroy(&xas); 3988 - if (order == HPAGE_PMD_ORDER) 3988 + if (old_order == HPAGE_PMD_ORDER) 3989 3989 count_vm_event(!ret ? THP_SPLIT_PAGE : THP_SPLIT_PAGE_FAILED); 3990 - count_mthp_stat(order, !ret ? MTHP_STAT_SPLIT : MTHP_STAT_SPLIT_FAILED); 3990 + count_mthp_stat(old_order, !ret ? MTHP_STAT_SPLIT : MTHP_STAT_SPLIT_FAILED); 3991 3991 return ret; 3992 3992 } 3993 3993