Re: [LTP] Question on hugemmap34

Jan Stancek
2024-12-11T06:46:42Z

On Wed, Dec 11, 2024 at 4:21 AM Wei Gao <wegao@suse.com> wrote:
>
> Hi Jan
>
> Thanks for your quick support.
> Since i use a kernel with my debug enabled so the test case timeout first time, when i use normal kernel run the test case with your patch, the test result show pass.
> Then i guess you will send new separate patch for fix this later?

I'm thinking if we can rewrite it with clone(), so that we can set up
stack and hugepage for the child reliably.

Right now, "the mmap search" is slow, and we end up with address
that's "too far". In your example
the child crashes long before it comes near the area test mapped.

Also the original test is mapping from libhugetlfs and LTP port just
maps a temp file.

>
> Regards
> Gao Wei
>
> On Tue, Dec 10, 2024 at 10:22 PM Wei Gao <wegao@suse.com> wrote:
>>
>> On Tue, Dec 10, 2024 at 02:25:06PM +0100, Jan Stancek wrote:
>> > On Tue, Dec 10, 2024 at 1:54 PM Jan Stancek <jstancek@redhat.com> wrote:
>> > >
>> > > On Tue, Dec 10, 2024 at 12:53 PM Wei Gao <wegao@suse.com> wrote:
>> > > >
>> > > > Hi ALL
>> > > >
>> > > > Is there any special config needed for this test case? Since the test failed with the following output on my test setup(opensuse15.5 with 6.12 kernel):
>> > > >
>> > > > tst_hugepage.c:84: TINFO: 1 hugepage(s) reserved
>> > > > tst_tmpdir.c:317: TINFO: Using /tmp/LTP_hugLSJb7r as tmpdir (btrfs filesystem)
>> > > > tst_test.c:1100: TINFO: Mounting none to /tmp/LTP_hugLSJb7r/hugetlbfs fstyp=hugetlbfs flags=0
>> > > > tst_test.c:1890: TINFO: LTP version: 20240930
>> > > > tst_test.c:1894: TINFO: Tested kernel: 6.12.3-lp155.11.g78b0030-vanilla #1 SMP Fri Dec 6 08:56:39 UTC 2024 (78b0030) ppc64le
>> > > > tst_test.c:1727: TINFO: Timeout per run is 0h 00m 30s
>> > > > tst_coredump.c:32: TINFO: Avoid dumping corefile for process(pid=6671)
>> > > > hugemmap34.c:88: TBROK: waitpid(0,0x7fffd8baa220,0) failed: ECHILD (10)
>> > >
>> > > There's missing exit() in do_child(), but that's not the only issue
>> > > with the test.
>> >
>> > Could you give this patch a try?
>> >
>> > diff --git a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap34.c
>> > b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap34.c
>> > index a7a88fbb2..818697be8 100644
>> > --- a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap34.c
>> > +++ b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap34.c
>> > @@ -51,16 +51,23 @@ void do_child(void *stop_address)
>> > x = alloca(STACK_ALLOCATION_SIZE);
>> > *x = 1;
>> > } while ((void *)x >= stop_address);
>> > + exit(0);
>> > }
>> >
>> > static void run_test(void)
>> > {
>> > int pid, status;
>> > void *stack_address, *mmap_address, *heap_address, *map;
>> > + char tmp[128];
>> >
>> > stack_address = alloca(0);
>> > heap_address = sbrk(0);
>> >
>> > + tst_res(TINFO, "heap is at: %p", heap_address);
>> > + tst_res(TINFO, "stack is at: %p", stack_address);
>> > + sprintf(tmp, "cat /proc/%d/maps", getpid());
>> > + TST_EXP_PASS_SILENT(system(tmp));
>> > +
>> > /*
>> > * paranoia: start mapping two hugepages below the start of the stack,
>> > * in case the alignment would cause us to map over something if we
>> > @@ -70,6 +77,9 @@ static void run_test(void)
>> > do {
>> > map = mmap(mmap_address, hpage_size, PROT_READ|PROT_WRITE,
>> > MAP_SHARED | MAP_FIXED_NOREPLACE, fd, 0);
>> > + if (map == mmap_address)
>> > + break;
>> > +
>> > if (map == MAP_FAILED) {
>> > if (errno == ENOMEM) {
>> > tst_res(TCONF, "There is no enough
>> > memory in the system to do mmap");
>> > @@ -80,7 +90,12 @@ static void run_test(void)
>> > /*
>> > * if we get all the way down to the heap, stop trying
>> > */
>> > - } while (mmap_address <= heap_address);
>> > + } while (mmap_address > heap_address);
>> > +
>> > + if (map == MAP_FAILED)
>> > + tst_brk(TBROK, "failed to map hpage_size area before
>> > hitting heap");
>> > + tst_res(TINFO, "mapped at %p", mmap);
>> > +
>> > pid = SAFE_FORK();
>> > if (pid == 0)
>> > do_child(mmap_address);
>> >
>>
>> Test will timeout if use default timeout so i do quick hack change for setup:
>> .forks_child = 1,
>> + .max_runtime = 3600,
>>
>> Test result:
>>
>> make -C "/root/ltp/lib" -f "/root/ltp/lib/Makefile" all
>> make[1]: Entering directory '/root/ltp/lib'
>> GEN ltp-version.h
>> make[2]: Nothing to be done for 'all'.
>> make[2]: Nothing to be done for 'all'.
>> make[1]: Leaving directory '/root/ltp/lib'
>> hugemmap34.c:150:1: warning: missing initializer for field ‘needs_cmds’ of ‘struct tst_test’ [-Wmissing-field-initializers]
>> };
>> ^
>> In file included from /root/ltp/testcases/kernel/mem/hugetlb/hugemmap/../lib/hugetlb.h:19:0,
>> from hugemmap34.c:24:
>> ../../../../../include/tst_test.h:593:21: note: ‘needs_cmds’ declared here
>> const char *const *needs_cmds;
>> ^~~~~~~~~~
>> CC testcases/kernel/mem/hugetlb/hugemmap/hugemmap34
>> tst_hugepage.c:84: TINFO: 1 hugepage(s) reserved
>> tst_tmpdir.c:317: TINFO: Using /tmp/LTP_hugkoiPEG as tmpdir (btrfs filesystem)
>> tst_test.c:1100: TINFO: Mounting none to /tmp/LTP_hugkoiPEG/hugetlbfs fstyp=hugetlbfs flags=0
>> tst_test.c:1890: TINFO: LTP version: 20240930
>> tst_test.c:1894: TINFO: Tested kernel: 6.12.3-lp155.11.g78b0030-vanilla #1 SMP Fri Dec 6 08:56:39 UTC 2024 (78b0030) ppc64le
>> tst_test.c:1727: TINFO: Timeout per run is 1h 00m 30s
>> hugemmap34.c:66: TINFO: heap is at: 0x1002af30000
>> hugemmap34.c:67: TINFO: stack is at: 0x7ffff97cab30
>> 10000000-10040000 r-xp 00000000 00:29 11656 /root/ltp/testcases/kernel/mem/hugetlb/hugemmap/hugemmap34
>> 10040000-10050000 r--p 00030000 00:29 11656 /root/ltp/testcases/kernel/mem/hugetlb/hugemmap/hugemmap34
>> 10050000-10060000 rw-p 00040000 00:29 11656 /root/ltp/testcases/kernel/mem/hugetlb/hugemmap/hugemmap34
>> 10060000-10070000 rw-p 00000000 00:00 0
>> 1002af00000-1002af30000 rw-p 00000000 00:00 0 [heap]
>> 7fff94b20000-7fff94d20000 r-xp 00000000 00:29 11464 /lib64/libc-2.31.so
>> 7fff94d20000-7fff94d30000 r--p 001f0000 00:29 11464 /lib64/libc-2.31.so
>> 7fff94d30000-7fff94d40000 rw-p 00200000 00:29 11464 /lib64/libc-2.31.so
>> 7fff94d40000-7fff94d70000 r-xp 00000000 00:29 11482 /lib64/libpthread-2.31.so
>> 7fff94d70000-7fff94d80000 r--p 00020000 00:29 11482 /lib64/libpthread-2.31.so
>> 7fff94d80000-7fff94d90000 rw-p 00030000 00:29 11482 /lib64/libpthread-2.31.so
>> 7fff94da0000-7fff94db0000 rw-s 00000000 00:17 9 /dev/shm/ltp_hugemmap34_7730 (deleted)
>> 7fff94db0000-7fff94dd0000 r--p 00000000 00:00 0 [vvar]
>> 7fff94dd0000-7fff94de0000 r-xp 00000000 00:00 0 [vdso]
>> 7fff94de0000-7fff94e20000 r-xp 00000000 00:29 11457 /lib64/ld-2.31.so
>> 7fff94e20000-7fff94e30000 r--p 00030000 00:29 11457 /lib64/ld-2.31.so
>> 7fff94e30000-7fff94e40000 rw-p 00040000 00:29 11457 /lib64/ld-2.31.so
>> 7ffff97a0000-7ffff97d0000 rw-p 00000000 00:00 0 [stack]
>> hugemmap34.c:97: TINFO: mapped at 0x7fff94c51e80
>> tst_coredump.c:32: TINFO: Avoid dumping corefile for process(pid=7752)
>> hugemmap34.c:105: TPASS: Child killed by SIGSEGV as expected
>>
>> Summary:
>> passed 1
>> failed 0
>> broken 0
>> skipped 0
>> warnings 0
>>