* Kwok Cheung Yeung:

> From 788687f87ad41e51258738ce068ee38d7b24defc Mon Sep 17 00:00:00 2001
> From: Kwok Cheung Yeung <k...@codesourcery.com>
> Date: Fri, 15 Jan 2021 04:49:36 -0800
> Subject: [PATCH] openmp: Add support for the OpenMP 5.0 task detach clause
Sorry, this appears to cause OpenMP task state corruption in RPM.  We
have only seen this on s390x.

The relevant code looks like this:

745      * (largest first) to help achieve an optimal load distribution.
746      */
747     rpmRC packageBinaries(rpmSpec spec, const char *cookie, int cheating)
748     {
749         rpmRC rc = RPMRC_OK;
750         Package pkg;
751         Package *tasks;
752         int npkgs = 0;
753
754         for (pkg = spec->packages; pkg != NULL; pkg = pkg->next)
755             npkgs++;
756         tasks = xcalloc(npkgs, sizeof(Package));
757
758         pkg = spec->packages;
759         for (int i = 0; i < npkgs; i++) {
760             tasks[i] = pkg;
761             pkg = pkg->next;
762         }
763         qsort(tasks, npkgs, sizeof(Package), compareBinaries);
764
765         #pragma omp parallel
766         #pragma omp single
767         for (int i = 0; i < npkgs; i++) {
768             Package pkg = tasks[i];
769             #pragma omp task untied priority(i)
770             {
771             pkg->rc = packageBinary(spec, pkg, cookie, cheating, 
&pkg->filename);
772             rpmlog(RPMLOG_DEBUG,
773                     _("Finished binary package job, result %d, filename 
%s\n"),
774                     pkg->rc, pkg->filename);
775             if (pkg->rc) {
776                 #pragma omp critical
777                 rc = pkg->rc;
778             }
779             } /* omp task */
780             if (rc)
781                 break;
782         }
783
784         /* Now check the package set if enabled */
785         if (rc == RPMRC_OK)
786             rc = checkPackageSet(spec->packages);
787
788         free(tasks);
789
790         return rc;
791     }

Backtrace looks like this:

Thread 1 "rpmbuild" received signal SIGSEGV, Segmentation fault.
0x000003fffde89e60 in packageBinaries._omp_fn.0 () at pack.c:780
780             if (rc)
(gdb) bt
#0  0x000003fffde89e60 in packageBinaries._omp_fn.0 () at pack.c:780
#1  0x000003fffca94806 in GOMP_parallel (
    fn=0x3fffde89d80 <packageBinaries._omp_fn.0>, data=0x3fffffff478, 
    num_threads=2, flags=<optimized out>) at ../../../libgomp/parallel.c:178
#2  0x000003fffde953fa in packageBinaries (cheating=0, cookie=0x0, 
    spec=0x2aa00065570) at pack.c:765
#3  buildSpec (ts=<optimized out>, buildArgs=<optimized out>, 
    spec=0x2aa00065570, what=<optimized out>) at build.c:411
#4  0x000003fffde98074 in rpmSpecBuild (ts=<optimized out>, 
    spec=<optimized out>, buildArgs=<optimized out>) at build.c:452
#5  0x000002aa00003e74 in buildForTarget (ts=0x2aa00069a80, 
    arg=<optimized out>, ba=0x2aa00007990 <rpmBTArgs>) at rpmbuild.c:500
#6  0x000002aa0000409a in build (ts=0x2aa00069a80, 
    arg=0x3fffffffe3a "/builddir/build/SPECS/compsize.spec", rcfile=0x0, 
    ba=0x2aa00007990 <rpmBTArgs>) at rpmbuild.c:552
#7  0x000002aa00002f84 in main (argc=<optimized out>, argv=<optimized out>)
    at rpmbuild.c:690

Debuginfo is a bit wonky, but the task pointer appears to be null.
Disassembly of the function around the crash site:

(gdb) disassemble 
Dump of assembler code for function packageBinaries._omp_fn.0:
   0x000003fffde89d80 <+0>:     stmg    %r6,%r15,48(%r15)
   0x000003fffde89d86 <+6>:     ear     %r1,%a0
   0x000003fffde89d8a <+10>:    lgr     %r14,%r15
   0x000003fffde89d8e <+14>:    lay     %r15,-280(%r15)
   0x000003fffde89d94 <+20>:    aghi    %r14,-24
   0x000003fffde89d98 <+24>:    std     %f8,0(%r14)
   0x000003fffde89d9c <+28>:    std     %f10,8(%r14)
   0x000003fffde89da0 <+32>:    std     %f14,16(%r14)
   0x000003fffde89da4 <+36>:    sllg    %r1,%r1,32
   0x000003fffde89daa <+42>:    ear     %r1,%a1
   0x000003fffde89dae <+46>:    l       %r11,32(%r2)
   0x000003fffde89db2 <+50>:    stg     %r1,200(%r15)
   0x000003fffde89db8 <+56>:    lg      %r10,16(%r2)
   0x000003fffde89dbe <+62>:    l       %r13,24(%r2)
   0x000003fffde89dc2 <+66>:    mvc     248(8,%r15),40(%r1)
   0x000003fffde89dc8 <+72>:    ld      %f8,8(%r2)
   0x000003fffde89dcc <+76>:    ld      %f10,0(%r2)
   0x000003fffde89dd0 <+80>:    lgr     %r8,%r2
   0x000003fffde89dd4 <+84>:    brasl   %r14,0x3fffde87530 
<GOMP_single_start@plt>
   0x000003fffde89dda <+90>:    cije    %r2,0,0x3fffde89e76 
<packageBinaries._omp_fn.0+246>
   0x000003fffde89de0 <+96>:    cijnh   %r11,0,0x3fffde89e76 
<packageBinaries._omp_fn.0+246>
   0x000003fffde89de6 <+102>:   stg     %r8,192(%r15)
   0x000003fffde89dec <+108>:   la      %r7,208(%r15)
   0x000003fffde89df0 <+112>:   la      %r1,28(%r8)
   0x000003fffde89df4 <+116>:   lgr     %r8,%r7
   0x000003fffde89df8 <+120>:   lgdr    %r7,%f8
   0x000003fffde89dfc <+124>:   ldgr    %f14,%r1
   0x000003fffde89e00 <+128>:   lhi     %r9,0
   0x000003fffde89e04 <+132>:   lg      %r1,0(%r10)
   0x000003fffde89e0a <+138>:   std     %f10,208(%r15)
   0x000003fffde89e0e <+142>:   std     %f14,224(%r15)
   0x000003fffde89e12 <+146>:   stg     %r1,232(%r15)
   0x000003fffde89e18 <+152>:   st      %r13,240(%r15)
   0x000003fffde89e1c <+156>:   stg     %r7,216(%r15)
   0x000003fffde89e22 <+162>:   lgfr    %r1,%r9
   0x000003fffde89e26 <+166>:   stg     %r1,184(%r15)
   0x000003fffde89e2c <+172>:   mvghi   176(%r15),0
   0x000003fffde89e32 <+178>:   mvghi   168(%r15),17
   0x000003fffde89e38 <+184>:   mvghi   160(%r15),1
   0x000003fffde89e3e <+190>:   lgr     %r3,%r8
   0x000003fffde89e42 <+194>:   lghi    %r6,8
   0x000003fffde89e46 <+198>:   lghi    %r5,40
   0x000003fffde89e4a <+202>:   lghi    %r4,0
   0x000003fffde89e4e <+206>:   larl    %r2,0x3fffde910c0 
<packageBinaries._omp_fn.1>
   0x000003fffde89e54 <+212>:   brasl   %r14,0x3fffde87c70 <GOMP_task@plt>
   0x000003fffde89e5a <+218>:   lg      %r1,192(%r15)
=> 0x000003fffde89e60 <+224>:   lt      %r1,28(%r1)
   0x000003fffde89e66 <+230>:   jne     0x3fffde89e76 
<packageBinaries._omp_fn.0+246>
   0x000003fffde89e6a <+234>:   ahi     %r9,1
   0x000003fffde89e6e <+238>:   aghi    %r10,8
   0x000003fffde89e72 <+242>:   brct    %r11,0x3fffde89e04 
<packageBinaries._omp_fn.0+132>
   0x000003fffde89e76 <+246>:   lg      %r1,200(%r15)
   0x000003fffde89e7c <+252>:   clc     248(8,%r15),40(%r1)
   0x000003fffde89e82 <+258>:   jne     0x3fffde89e9e 
<packageBinaries._omp_fn.0+286>
   0x000003fffde89e86 <+262>:   ld      %f8,256(%r15)
   0x000003fffde89e8a <+266>:   ld      %f10,264(%r15)
   0x000003fffde89e8e <+270>:   ld      %f14,272(%r15)
   0x000003fffde89e92 <+274>:   lmg     %r6,%r15,328(%r15)
   0x000003fffde89e98 <+280>:   jg      0x3fffde895f0 <GOMP_barrier@plt>
   0x000003fffde89e9e <+286>:   brasl   %r14,0x3fffde88810 
<__stack_chk_fail@plt>
(gdb) print/x $r1
$1 = 0x0

Confirmed via bisection on libgomp.so.1.  I did not rebuild rpmbuild.

Thanks,
Florian
-- 
Red Hat GmbH, https://de.redhat.com/ , Registered seat: Grasbrunn,
Commercial register: Amtsgericht Muenchen, HRB 153243,
Managing Directors: Charles Cachera, Brian Klemm, Laurie Krebs, Michael O'Neill

Reply via email to