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;
+}
+
 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


Reply via email to