[LTP] [PATCH] Migrating the libhugetlbfs/testcases/stack_grow_into_huge.c test
Cyril Hrubis
chrubis@suse.cz
Fri Sep 8 14:22:17 CEST 2023
Hi!
First of all the whitespaces in the test are messed up, please make sure
to run 'make check' and fix all the reported problems.
> +void do_child(void *stop_address)
> +{
> + struct rlimit r;
> + volatile int *x;
> +
> + /* corefile from this process is not interesting and limiting
> + * its size can save a lot of time. '1' is a special value,
> + * that will also abort dumping via pipe, which by default
> + * sets limit to RLIM_INFINITY. */
> + r.rlim_cur = 1;
> + r.rlim_max = 1;
> + SAFE_SETRLIMIT(RLIMIT_CORE, &r);
> +
> + do {
> + x = alloca(STACK_ALLOCATION_SIZE);
> + *x = 1;
> + } while ((void *)x >= stop_address);
> +}
> +
> +static void run_test(void)
> +{
> + int pid, status, sig;
> + char *b;
> + void *stack_address, *mmap_address, *heap_address;
> + stack_address = alloca(0);
> + heap_address = sbrk(0);
> + /*
> + * paranoia: start mapping two hugepages below the start of the stack,
> + * in case the alignment would cause us to map over something if we
> + * only used a gap of one hugepage.
> + */
> + mmap_address = PALIGN(stack_address - 2 * hpage_size, hpage_size);
> + do {
> + b = SAFE_MMAP(mmap_address, hpage_size, PROT_READ|PROT_WRITE,
> + MAP_FIXED|MAP_SHARED, fd, 0);
> + mmap_address -= hpage_size;
> + /*
> + * if we get all the way down to the heap, stop trying
> + */
> + if (mmap_address <= heap_address)
> + break;
> + } while (b == MAP_FAILED);
This definitelly wouldn't work as expected, SAFE_MMAP() cannot fail, it
does exit the test if it fails.
> + if (b == MAP_FAILED)
> + tst_res(TFAIL, "mmap() at unexpected address %p instead of %p\n", b,
> + mmap_address);
> +
> + pid = SAFE_FORK();
> + if (pid == 0) {
> + do_child(mmap_address);
> + exit(0);
> + }
> + SAFE_WAITPID(pid, &status, 0);
> +
> + if (WIFSIGNALED(status)) {
> + sig = WTERMSIG(status);
> +
> + if (sig == SIGSEGV) {
> + tst_res(TPASS, "Test Passed");
> + exit(0);
> + } else {
> + tst_res(TFAIL, "Got unexpected signal: %s", strsignal(sig));
> + exit(1);
No calls to exit(1) in the test, the tst_res() is used to report test
results.
> + }
> + }
> + tst_res(TFAIL, "Child not signalled");
This should use tst_strstatus() to print what has happened to the child.
Have a look at syscalls/mmap/mmap18.c how it's done.
> +}
> +
> +void setup(void)
> +{
> + struct rlimit r;
> + page_size = getpagesize();
> + hpage_size = tst_get_hugepage_size();
> + /*
> + * Setting the stack size to unlimited.
> + */
> + r.rlim_cur = RLIM_INFINITY;
> + r.rlim_max = RLIM_INFINITY;
> + SAFE_SETRLIMIT(RLIMIT_STACK, &r);
> +
> + SAFE_GETRLIMIT(RLIMIT_STACK, &r);
> + if (r.rlim_cur != RLIM_INFINITY)
> + tst_brk(TCONF, "Stack rlimit must be 'unlimited'");
> + fd = tst_creat_unlinked(MNTPOINT, 0);
> +}
> +
> +void cleanup(void)
> +{
> + if (fd > 0)
> + SAFE_CLOSE(fd);
> +}
> +
> +static struct tst_test test = {
> + .tags = (struct tst_tag[]) {
> + {"linux-git", "0d59a01bc461"},
> + {}
> + },
> + .needs_root = 1,
> + .mntpoint = MNTPOINT,
> + .needs_hugetlbfs = 1,
> + .needs_tmpdir = 1,
> + .setup = setup,
> + .cleanup = cleanup,
> + .test_all = run_test,
> + .hugepages = {2, TST_NEEDS},
> + .forks_child = 1,
> +};
> --
> 2.39.3
>
>
> --
> Mailing list info: https://lists.linux.it/listinfo/ltp
--
Cyril Hrubis
chrubis@suse.cz
More information about the ltp
mailing list