[LTP] [PATCH v4 1/1] swapon03: Try to swapon() as many files until it fails
Li Wang
liwang@redhat.com
Fri Dec 19 14:06:46 CET 2025
On Fri, Dec 19, 2025 at 5:42 PM Petr Vorel <pvorel@suse.cz> wrote:
> Previously tst_max_swapfiles() had fine tuning for a specific kernel
> version which was fragile due various backports in enterprise kernels.
>
> Let's try to create and use as many swap files until swapon() fails.
> Then check for expected EPERM.
>
> It was required to increase cmd_buffer size to avoid directive output
> may be truncated warning.
>
> Suggested-by: Michal Hocko <mhocko@suse.com>
> Signed-off-by: Petr Vorel <pvorel@suse.cz>
> ---
> Changes v3->v4:
> * Do *not* skip testing when expected minimum swap files was already
> used in SUT (Cyril)
> * Rename variables (Cyril)
> * Run test only once (remove -i2 from runtest file)
>
> Link to v3:
> https://lore.kernel.org/ltp/20251118143607.45308-3-pvorel@suse.cz/
>
> https://patchwork.ozlabs.org/project/ltp/patch/20251118143607.45308-3-pvorel@suse.cz/
> testcases/kernel/syscalls/swapon/swapon03.c | 49 ++++++++++++---------
> 1 file changed, 27 insertions(+), 22 deletions(-)
>
> diff --git a/testcases/kernel/syscalls/swapon/swapon03.c
> b/testcases/kernel/syscalls/swapon/swapon03.c
> index c014a48912..e8dca1e283 100644
> --- a/testcases/kernel/syscalls/swapon/swapon03.c
> +++ b/testcases/kernel/syscalls/swapon/swapon03.c
> @@ -6,9 +6,12 @@
> */
>
> /*\
> - * This test case checks whether swapon(2) system call returns:
> + * Test checks whether :man2:`swapon` system call returns EPERM when the
> maximum
> + * number of swap files are already in use.
> *
> - * - EPERM when there are more than MAX_SWAPFILES already in use.
> + * NOTE: test does not try to calculate MAX_SWAPFILES from the internal
> + * kernel implementation, instead make sure at least 15 swaps were created
> + * before the maximum of swaps was reached.
> */
>
> #include <stdio.h>
> @@ -20,6 +23,13 @@
> #include "lapi/syscalls.h"
> #include "libswap.h"
>
> +/*
> + * MAX_SWAPFILES from the internal kernel implementation is currently
> <23, 29>,
> + * depending on kernel configuration (see man swapon(2). Chose small
> enough
> + * value for future changes.
> + */
> +#define MIN_SWAP_FILES 15
> +
> #define MNTPOINT "mntpoint"
> #define TEST_FILE MNTPOINT"/testswap"
>
> @@ -27,31 +37,28 @@ static int swapfiles;
>
> static int setup_swap(void)
> {
> - int j, max_swapfiles, used_swapfiles;
> + int used_swapfiles, min_swapfiles;
> char filename[FILENAME_MAX];
>
> - /* Determine how many more files are to be created */
> - max_swapfiles = tst_max_swapfiles();
> used_swapfiles = tst_count_swaps();
> - swapfiles = max_swapfiles - used_swapfiles;
> - if (swapfiles > max_swapfiles)
> - swapfiles = max_swapfiles;
> -
> - /*create and turn on remaining swapfiles */
> - for (j = 0; j < swapfiles; j++) {
> + min_swapfiles = MIN_SWAP_FILES - used_swapfiles;
>
I can assume a potential issue here is: if a test system already
contains swapfiles more than MIN_SWAP_FILES, here min_swapfile
will be a negative value.
It sounds weird to mount a negative number of file for test.
What about:
min_swapfiles = MIN_SWAP_FILES > used_swapfiles ? \
(MIN_SWAP_FILES - used_swapfiles) : 0;
>
> + while (true) {
>
There is another issue in the infinite loop, if a kernel bug makes more
swapfile does not return EPERM but any others, here not report failure
and only keep looping forever.
Maybe we should set a uplimit (e.g MAX_TRIES) to avoid that happening.
/* Create the swapfile */
> - snprintf(filename, sizeof(filename), "%s%02d", TEST_FILE,
> j + 2);
> - SAFE_MAKE_SMALL_SWAPFILE(filename);
> + snprintf(filename, sizeof(filename), "%s%02d", TEST_FILE,
> swapfiles);
> + MAKE_SMALL_SWAPFILE(filename);
> +
> + /* Quit on a first swap file over max, check for EPERM */
> + if (swapon(filename, 0) == -1) {
> + if (errno == EPERM && swapfiles > min_swapfiles)
> + break;
>
> - /* turn on the swap file */
> - TST_EXP_PASS_SILENT(swapon(filename, 0));
> - if (!TST_PASS)
> - tst_brk(TFAIL, "Failed to setup swap files");
> + tst_res(TFAIL | TERRNO, "swapon(%s, 0)", filename);
> + }
> + swapfiles++;
> }
>
> tst_res(TINFO, "Successfully created %d swap files", swapfiles);
> - MAKE_SMALL_SWAPFILE(TEST_FILE);
>
> return 0;
> }
> @@ -61,7 +68,7 @@ static int setup_swap(void)
> */
> static int check_and_swapoff(const char *filename)
> {
> - char cmd_buffer[256];
> + char cmd_buffer[FILENAME_MAX+28];
> int rc = -1;
>
Here we'd better initialize 'rc = 0' though the return value is not used
anywhere.
>
> snprintf(cmd_buffer, sizeof(cmd_buffer), "grep -q '%s.*file'
> /proc/swaps", filename);
> @@ -83,11 +90,9 @@ static void clean_swap(void)
> char filename[FILENAME_MAX];
>
> for (j = 0; j < swapfiles; j++) {
> - snprintf(filename, sizeof(filename), "%s%02d", TEST_FILE,
> j + 2);
> + snprintf(filename, sizeof(filename), "%s%02d", TEST_FILE,
> j);
> check_and_swapoff(filename);
> }
> -
> - check_and_swapoff(TEST_FILE);
> }
>
> static void verify_swapon(void)
> --
> 2.51.0
>
>
--
Regards,
Li Wang
More information about the ltp
mailing list