On Sun, Aug 16, 2026 at 11:45:15PM +0100, Kiryl Shutsemau wrote:
> From: "Kiryl Shutsemau (Meta)" <[email protected]>
>
> Preparation for building the new collapse engine in its own file.  The
> engine and khugepaged.c need to agree on what a collapse result is and
> what state a scan carries.
>
> Move enum scan_result and struct collapse_control into a new
> mm/collapse.h.
>
> No functional change intended.
>
> Assisted-by: Claude-Code:claude-opus-5
> Signed-off-by: Kiryl Shutsemau (Meta) <[email protected]>

Any change that introduces a new file should in the same change update
MAINTAINERS (in the THP section to which this belongs :)

> ---
>  mm/collapse.h   | 60 +++++++++++++++++++++++++++++++++++++++++++++++++
>  mm/khugepaged.c | 52 +-----------------------------------------
>  2 files changed, 61 insertions(+), 51 deletions(-)
>  create mode 100644 mm/collapse.h
>
> diff --git a/mm/collapse.h b/mm/collapse.h
> new file mode 100644
> index 000000000000..26dbac7beddd
> --- /dev/null
> +++ b/mm/collapse.h
> @@ -0,0 +1,60 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +#ifndef __MM_COLLAPSE_H
> +#define __MM_COLLAPSE_H
> +
> +#include <linux/nodemask.h>
> +#include <linux/pgtable.h>
> +#include <linux/types.h>
> +
> +enum scan_result {
> +     SCAN_FAIL,
> +     SCAN_SUCCEED,
> +     SCAN_NO_PTE_TABLE,
> +     SCAN_PMD_MAPPED,
> +     SCAN_EXCEED_NONE_PTE,
> +     SCAN_EXCEED_SWAP_PTE,
> +     SCAN_EXCEED_SHARED_PTE,
> +     SCAN_PTE_NON_PRESENT,
> +     SCAN_PTE_UFFD,
> +     SCAN_PTE_MAPPED_HUGEPAGE,
> +     SCAN_LACK_REFERENCED_PAGE,
> +     SCAN_PAGE_NULL,
> +     SCAN_SCAN_ABORT,
> +     SCAN_PAGE_COUNT,
> +     SCAN_PAGE_LRU,
> +     SCAN_PAGE_LOCK,
> +     SCAN_PAGE_ANON,
> +     SCAN_PAGE_LAZYFREE,
> +     SCAN_PAGE_COMPOUND,
> +     SCAN_ANY_PROCESS,
> +     SCAN_VMA_NULL,
> +     SCAN_VMA_CHECK,
> +     SCAN_ADDRESS_RANGE,
> +     SCAN_DEL_PAGE_LRU,
> +     SCAN_ALLOC_HUGE_PAGE_FAIL,
> +     SCAN_CGROUP_CHARGE_FAIL,
> +     SCAN_TRUNCATED,
> +     SCAN_PAGE_HAS_PRIVATE,
> +     SCAN_STORE_FAILED,
> +     SCAN_COPY_MC,
> +     SCAN_PAGE_FILLED,
> +     SCAN_PAGE_DIRTY_OR_WRITEBACK,
> +};
> +
> +struct collapse_control {
> +     bool is_khugepaged;
> +
> +     /* Num pages scanned per node */
> +     u32 node_load[MAX_NUMNODES];
> +
> +     /* Num pages scanned (see khugepaged_pages_to_scan) */
> +     unsigned int progress;
> +
> +     /* nodemask for allocation fallback */
> +     nodemask_t alloc_nmask;
> +
> +     /* Each bit represents a single occupied (!none/zero) page. */
> +     DECLARE_BITMAP(mthp_present_ptes, MAX_PTRS_PER_PTE);
> +};
> +
> +#endif       /* __MM_COLLAPSE_H */
> diff --git a/mm/khugepaged.c b/mm/khugepaged.c
> index 5f7126cf42f5..804b1d35f52a 100644
> --- a/mm/khugepaged.c
> +++ b/mm/khugepaged.c
> @@ -26,45 +26,11 @@
>  #include <linux/cleanup.h>
>
>  #include <asm/tlb.h>
> +#include "collapse.h"
>  #include "internal.h"
>  #include "page_alloc.h"
>  #include "mm_slot.h"
>
> -enum scan_result {
> -     SCAN_FAIL,
> -     SCAN_SUCCEED,
> -     SCAN_NO_PTE_TABLE,
> -     SCAN_PMD_MAPPED,
> -     SCAN_EXCEED_NONE_PTE,
> -     SCAN_EXCEED_SWAP_PTE,
> -     SCAN_EXCEED_SHARED_PTE,
> -     SCAN_PTE_NON_PRESENT,
> -     SCAN_PTE_UFFD,
> -     SCAN_PTE_MAPPED_HUGEPAGE,
> -     SCAN_LACK_REFERENCED_PAGE,
> -     SCAN_PAGE_NULL,
> -     SCAN_SCAN_ABORT,
> -     SCAN_PAGE_COUNT,
> -     SCAN_PAGE_LRU,
> -     SCAN_PAGE_LOCK,
> -     SCAN_PAGE_ANON,
> -     SCAN_PAGE_LAZYFREE,
> -     SCAN_PAGE_COMPOUND,
> -     SCAN_ANY_PROCESS,
> -     SCAN_VMA_NULL,
> -     SCAN_VMA_CHECK,
> -     SCAN_ADDRESS_RANGE,
> -     SCAN_DEL_PAGE_LRU,
> -     SCAN_ALLOC_HUGE_PAGE_FAIL,
> -     SCAN_CGROUP_CHARGE_FAIL,
> -     SCAN_TRUNCATED,
> -     SCAN_PAGE_HAS_PRIVATE,
> -     SCAN_STORE_FAILED,
> -     SCAN_COPY_MC,
> -     SCAN_PAGE_FILLED,
> -     SCAN_PAGE_DIRTY_OR_WRITEBACK,
> -};
> -
>  #define CREATE_TRACE_POINTS
>  #include <trace/events/huge_memory.h>
>
> @@ -103,22 +69,6 @@ static struct kmem_cache *mm_slot_cache __ro_after_init;
>
>  #define KHUGEPAGED_MIN_MTHP_ORDER    2
>
> -struct collapse_control {
> -     bool is_khugepaged;
> -
> -     /* Num pages scanned per node */
> -     u32 node_load[MAX_NUMNODES];
> -
> -     /* Num pages scanned (see khugepaged_pages_to_scan) */
> -     unsigned int progress;
> -
> -     /* nodemask for allocation fallback */
> -     nodemask_t alloc_nmask;
> -
> -     /* Each bit represents a single occupied (!none/zero) page. */
> -     DECLARE_BITMAP(mthp_present_ptes, MAX_PTRS_PER_PTE);
> -};
> -
>  /**
>   * struct khugepaged_scan - cursor for scanning
>   * @mm_head: the head of the mm list to scan
> --
> 2.54.0
>

--
Cheers, Lorenzo

Reply via email to