Hi Usama!
On 7/22/26 2:41 PM, Muhammad Usama Anjum wrote:
> collapse_swapin_single_pte and collapse_max_ptes_swap require
> MADV_PAGEOUT to replace anonymous pages with swap entries. On swapless
> systems there is no backing store with which to create those entries, so
> check_swap() reports missing setup rather than broken khugepaged behavior.
>
> Swapless configurations are common on Android and other constrained
> test devices. Failing these cases obscures actionable results from the
> rest of the khugepaged suite.
>
> Check /proc/swaps before either swap-dependent case and skip when no
> active swap area exists. With swap present, retain the existing
> MADV_PAGEOUT and swap-entry assertions unchanged.
>
> Signed-off-by: Muhammad Usama Anjum <[email protected]>
> ---
> tools/testing/selftests/mm/khugepaged.c | 34 +++++++++++++++++++++++++
> 1 file changed, 34 insertions(+)
>
> diff --git a/tools/testing/selftests/mm/khugepaged.c
> b/tools/testing/selftests/mm/khugepaged.c
> index 10e8dedcb087d..a152cec59fcbd 100644
> --- a/tools/testing/selftests/mm/khugepaged.c
> +++ b/tools/testing/selftests/mm/khugepaged.c
> @@ -100,6 +100,28 @@ static void skip(const char *msg)
> exit_status = KSFT_SKIP;
> }
>
> +static bool is_swap_enabled(void)
> +{
> + char buf[MAX_LINE_LENGTH];
> + FILE *file;
> + bool enabled = false;
> +
> + file = fopen("/proc/swaps", "r");
> + if (!file)
> + return false;
> +
> + if (!fgets(buf, sizeof(buf), file))
> + goto out;
> +
> + /* Check for first active swap entry. */
> + if (fgets(buf, sizeof(buf), file))
> + enabled = true;
> +
> +out:
> + fclose(file);
> + return enabled;
> +}
> +
> static void save_settings(void)
> {
> ksft_print_msg("Save THP and khugepaged settings...");
> @@ -734,6 +756,12 @@ static void collapse_swapin_single_pte(struct
> collapse_context *c, struct mem_op
> {
> void *p;
>
> + if (!is_swap_enabled()) {
> + skip("No active swap");
Can we prefix this skip message with a #, as recommended for KTAP
output? Right now it is printing like this:
# Run test: collapse_swapin_single_pte (khugepaged:anon)
No active swap
ok 16 # SKIP collapse_swapin_single_pte
#
# Run test: collapse_swapin_single_pte (madvise:anon)
No active swap
ok 17 # SKIP collapse_swapin_single_pte
#
# Run test: collapse_max_ptes_swap (khugepaged:anon)
No active swap
ok 18 # SKIP collapse_max_ptes_swap
#
# Run test: collapse_max_ptes_swap (madvise:anon)
No active swap
> + ksft_test_result_report(exit_status, "%s\n", __func__);
> + return;
> + }
> +
> p = ops->setup_area(1);
> ops->fault(p, 0, hpage_pmd_size);
>
> @@ -760,6 +788,12 @@ static void collapse_max_ptes_swap(struct
> collapse_context *c, struct mem_ops *o
> int max_ptes_swap = thp_read_num("khugepaged/max_ptes_swap");
> void *p;
>
> + if (!is_swap_enabled()) {
> + skip("No active swap");
Same here.
> + ksft_test_result_report(exit_status, "%s\n", __func__);
> + return;
> + }
> +
> p = ops->setup_area(1);
> ops->fault(p, 0, hpage_pmd_size);
>