[LTP] [PATCH 5/7] syscalls: mremap03: Convert to new API
Andrea Cervesato
andrea.cervesato@suse.com
Thu Jul 10 09:29:06 CEST 2025
Hi!
On 7/8/25 10:11 PM, Ricardo B. Marlière via ltp wrote:
> From: Ricardo B. Marlière <rbm@suse.com>
>
> Signed-off-by: Ricardo B. Marlière <rbm@suse.com>
> ---
> testcases/kernel/syscalls/mremap/mremap03.c | 196 ++++------------------------
> 1 file changed, 26 insertions(+), 170 deletions(-)
>
> diff --git a/testcases/kernel/syscalls/mremap/mremap03.c b/testcases/kernel/syscalls/mremap/mremap03.c
> index 02b79bc47bba0ac576182c00711ff2296aaeaf65..7e16af895e271dd5f14e892ae1a05c21f1d21dff 100644
> --- a/testcases/kernel/syscalls/mremap/mremap03.c
> +++ b/testcases/kernel/syscalls/mremap/mremap03.c
> @@ -1,187 +1,43 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> /*
> - *
> - * Copyright (c) International Business Machines Corp., 2001
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License as published by
> - * the Free Software Foundation; either version 2 of the License, or
> - * (at your option) any later version.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
> - * the GNU General Public License for more details.
> - *
> - * You should have received a copy of the GNU General Public License
> - * along with this program; if not, write to the Free Software
> - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> + * Copyright (c) International Business Machines Corp., 2001
> + * 07/2001 Ported by Wayne Boyer
> + * 11/09/2001 Manoj Iyer (manjo@austin.ibm.com)
> + * Copyright (c) 2025 SUSE LLC Ricardo B. Marlière <rbm@suse.com>
> */
>
> -/*
> - * Test Name: mremap03
> - *
> - * Test Description:
> - * Verify that,
> - * mremap() fails when used to expand the existing virtual memory mapped
> - * region to the requested size, if there already exists mappings that
> - * cover the whole address space requsted or the old address specified was
> - * not mapped.
> - *
> - * Expected Result:
> - * mremap() should return -1 and set errno to EFAULT.
> - *
> - * Algorithm:
> - * Setup:
> - * Setup signal handling.
> - * Pause for SIGUSR1 if option specified.
> - *
> - * Test:
> - * Loop if the proper options are given.
> - * Execute system call
> - * Check return code, if system call failed (return=-1)
> - * if errno set == expected errno
> - * Issue sys call fails with expected return value and errno.
> - * Otherwise,
> - * Issue sys call fails with unexpected errno.
> - * Otherwise,
> - * Issue sys call returns unexpected value.
> - *
> - * Cleanup:
> - * Print errno log and/or timing stats if options given
> - *
> - * Usage: <for command-line>
> - * mremap03 [-c n] [-e] [-i n] [-I x] [-P x] [-t]
> - * where, -c n : Run n copies concurrently.
> - * -e : Turn on errno logging.
> - * -i n : Execute test n times.
> - * -I x : Execute test for x seconds.
> - * -p x : Pause for x seconds between iterations.
> - * -t : Turn on syscall timing.
> - *
> - * HISTORY
> - * 07/2001 Ported by Wayne Boyer
> - *
> - * 11/09/2001 Manoj Iyer (manjo@austin.ibm.com)
> - * Modified.
> - * - #include <linux/mman.h> should not be included as per man page for
> - * mremap, #include <sys/mman.h> alone should do the job. But inorder
> - * to include definition of MREMAP_MAYMOVE defined in bits/mman.h
> - * (included by sys/mman.h) __USE_GNU needs to be defined.
> - * There may be a more elegant way of doing this...
> - *
> - *
> - * RESTRICTIONS:
> - * None.
> +/*\
> + * Verify that mremap() fails with EFAULT when used to expand the existing
> + * virtual memory mapped region to the requested size, if there already exists
> + * mappings that cover the whole address space requested or the old address
> + * specified was not mapped.
This is a really weird description. We should rewrite it in a better
way, also because test is not doing everything that it's supposed to be
written here.
According to man mremap(2):
EFAULT happens when:
1. some address in the range old_address to old_address+old_size is an
invalid virtual memory address for this process
2. if there exist mappings that cover the whole address space requested,
but those mappings are of different types.
In this test we only achieve the point 1. After achieving the 2. we
should write something like:
Verify that mremap() fails with EFAULT when:
- some address in the range old_address to old_address+old_size is an
invalid virtual memory address for this process
- if there exist mappings that cover the whole address space
requested, but those mappings are of different types.
> */
> +
> #define _GNU_SOURCE
> -#include <errno.h>
> -#include <unistd.h>
> -#include <fcntl.h>
> -#include <sys/mman.h>
>
> -#include "test.h"
> +#include "tst_test.h"
>
> -char *TCID = "mremap03";
> -int TST_TOTAL = 1;
> static char *bad_addr;
> -static char *addr; /* addr of memory mapped region */
> -int memsize; /* memory mapped size */
> -int newsize; /* new size of virtual memory block */
> +static int memsize;
>
> -void setup(); /* Main setup function of test */
> -void cleanup(); /* cleanup function for the test */
> -
> -int main(int ac, char **av)
> +static void run(void)
> {
> - int lc;
> -
> - tst_parse_opts(ac, av, NULL, NULL);
> -
> - setup();
> -
> - for (lc = 0; TEST_LOOPING(lc); lc++) {
> -
> - tst_count = 0;
> -
> - /*
> - * Attempt to expand the existing mapped
> - * memory region (memsize) by newsize limits
> - * using mremap() should fail as specified old
> - * virtual address was not mapped.
> - */
> - errno = 0;
> - addr = mremap(bad_addr, memsize, newsize, MREMAP_MAYMOVE);
> - TEST_ERRNO = errno;
> -
> - /* Check for the return value of mremap() */
> - if (addr != MAP_FAILED) {
> - tst_resm(TFAIL,
> - "mremap returned invalid value, expected: -1");
> -
> - /* Unmap the mapped memory region */
> - if (munmap(addr, newsize) != 0) {
> - tst_brkm(TFAIL, cleanup, "munmap fails to "
> - "unmap the expanded memory region, "
> - " error=%d", errno);
> - }
> - continue;
> - }
> -
> - /* Check for the expected errno */
> - if (errno == EFAULT) {
> - tst_resm(TPASS, "mremap() Fails, 'old region not "
> - "mapped', errno %d", TEST_ERRNO);
> - } else {
> - tst_resm(TFAIL, "mremap() Fails, "
> - "'Unexpected errno %d", TEST_ERRNO);
> - }
> - }
> -
> - cleanup();
> - tst_exit();
> + TST_EXP_FAIL_PTR_VOID(
> + mremap(bad_addr, memsize, memsize * 2, MREMAP_MAYMOVE), EFAULT);
>
> + if (TST_RET_PTR != MAP_FAILED)
> + SAFE_MUNMAP(TST_RET_PTR, memsize);
> }
>
> -/*
> - * setup() - performs all ONE TIME setup for this test.
> - *
> - * Get system page size.
> - * Set the old address point some high address which is not mapped.
> - */
> -void setup(void)
> +static void setup(void)
> {
> - int page_sz; /* system page size */
> -
> - tst_sig(FORK, DEF_HANDLER, cleanup);
> -
> - TEST_PAUSE;
> -
> - /* Get the system page size */
> - if ((page_sz = getpagesize()) < 0) {
> - tst_brkm(TFAIL, NULL,
> - "getpagesize() fails to get system page size");
> - }
> -
> - /* Get the size of virtual memory area to be mapped */
> - memsize = (1000 * page_sz);
> -
> - /* Get the New size of virtual memory block after resize */
> - newsize = (memsize * 2);
> + size_t page_sz = SAFE_SYSCONF(_SC_PAGESIZE);
>
> - /*
> - * Set the old virtual address point to some address
> - * which is not mapped.
> - */
> - bad_addr = tst_get_bad_addr(cleanup);
> + memsize = 1000 * page_sz;
Also here we should define the number of pages inside a macro.
> + bad_addr = tst_get_bad_addr(NULL);
> }
>
> -/*
> - * cleanup() - performs all ONE TIME cleanup for this test at
> - * completion or premature exit.
> - */
> -void cleanup(void)
> -{
> -
> - /* Exit the program */
> -
> -}
> +static struct tst_test test = {
> + .test_all = run,
> + .setup = setup,
> +};
- Andrea
More information about the ltp
mailing list