[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: AIX stackoverflow detection hang [was: Reporting m4 bug]
From: |
Bruno Haible |
Subject: |
Re: AIX stackoverflow detection hang [was: Reporting m4 bug] |
Date: |
Sun, 10 Jul 2022 23:34:49 +0200 |
Thanks for the report.
And thanks for the CC, Eric.
> > stopped in is_mapped at line 621 in file ""
> > is_mapped(addr = 9), line 621 in "stackvma.c"
> > is_unmapped(addr1 = 4, addr2 = 15), line 768 in "stackvma.c"
> > mincore_is_near_this(addr = 10, vma = 0x0000000111001fb8), line 793 in
> > "stackvma.c"
> > unnamed block in sigsegv.sigsegv_handler(sig = 11, sip =
> > 0x0000000111002310, ucp = 0x0000000111002060), line 973 in "sigsegv.c"
> > unnamed block in sigsegv.sigsegv_handler(sig = 11, sip =
> > 0x0000000111002310, ucp = 0x0000000111002060), line 973 in "sigsegv.c"
> > sigsegv.sigsegv_handler(sig = 11, sip = 0x0000000111002310, ucp =
> > 0x0000000111002060), line 973 in "sigsegv.c"
> > main(), line 183 in "test-sigsegv-catch-stackoverflow2.c"
> >
> > code snippet
> > location:/home/buildusr/rpmbuild/BUILD/m4-1.4.19/64bit/lib/stackvma.c
> > seems like its stuck here in for loop
> >
> > 754 for (;;)
> > 755 {
> > 756 uintptr_t addr_stepsize;
> > 757 uintptr_t i;
> > 758 uintptr_t addr;
> > 759
> > 760 stepsize = stepsize / 2;
> > 761 if (stepsize == 0)
> > 762 break;
> > 763 addr_stepsize = stepsize * pagesize;
> > 764 for (i = stepsize, addr = addr1 + addr_stepsize;
> > 765 i < count;
> > 766 i += 2 * stepsize, addr += 2 * addr_stepsize)
> > 767 /* Here addr = addr1 + i * pagesize. */
> > 768 if (is_mapped (addr))
> > 769 return 0;
> > 770 }
The comments, a few lines above, explain that this loop can be slow. In
64-bit mode, it can even be *very* slow.
But fortunately AIX 7 comes with a better primitive for enumerating the
VMAs, through the /proc file system. I have now added code in stackvma.c
to try this faster method first, before falling back on the slower mincore-
based approach:
https://git.savannah.gnu.org/gitweb/?p=gnulib.git;a=commitdiff;h=19435dc207e9279d744435ce72466f765c5358e2
In a week, there should be a new m4 snapshot available, that includes
this change. You can get it from https://gitlab.com/gnu-m4/ci-distcheck .
I expect that it will fix the test hang that you have seen.
Bruno