On Mon, 27 Jul 2026 10:52:19 +0100 Muhammad Usama Anjum <[email protected]> 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. > > Print each existing swapout diagnostic before the prerequisite check > so skip() completes a KTAP diagnostic line instead of emitting an > unprefixed message. > > Signed-off-by: Muhammad Usama Anjum <[email protected]> > --- > Changes since v1: > - Print swapout diagnostics before reporting no-swap skips. > --- > tools/testing/selftests/mm/khugepaged.c | 38 +++++++++++++++++++++++-- > 1 file changed, 36 insertions(+), 2 deletions(-) > > diff --git a/tools/testing/selftests/mm/khugepaged.c > b/tools/testing/selftests/mm/khugepaged.c > index 10e8dedcb087d..54e888eb48bbc 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; > +} > + Could is_swap_enabled() be moved to vm_util.c. This will definitely be reusable in other places. > static void save_settings(void) > { > ksft_print_msg("Save THP and khugepaged settings..."); > @@ -734,10 +756,16 @@ static void collapse_swapin_single_pte(struct > collapse_context *c, struct mem_op > { > void *p; > > + ksft_print_msg("Swapout one page..."); > + if (!is_swap_enabled()) { > + skip("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); > > - ksft_print_msg("Swapout one page..."); > if (madvise(p, page_size, MADV_PAGEOUT)) > ksft_exit_fail_perror("madvise(MADV_PAGEOUT)"); > if (check_swap(p, page_size)) { > @@ -760,10 +788,16 @@ 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; > > + ksft_print_msg("Swapout %d of %d pages...", max_ptes_swap + 1, > hpage_pmd_nr); > + if (!is_swap_enabled()) { > + skip("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); > > - ksft_print_msg("Swapout %d of %d pages...", max_ptes_swap + 1, > hpage_pmd_nr); > if (madvise(p, (max_ptes_swap + 1) * page_size, MADV_PAGEOUT)) > ksft_exit_fail_perror("madvise(MADV_PAGEOUT)"); > if (check_swap(p, (max_ptes_swap + 1) * page_size)) { > -- > 2.47.3 > >

