Message ID | 87tttyooi6.fsf@oldenburg.str.redhat.com |
---|---|
State | New |
Headers | show |
Series | nptl: Unconditionally use a 32-byte rseq area | expand |
* Florian Weimer: > If the kernel headers provide a larger struct rseq, we used that > size as the argument to the rseq system call. As a result, > rseq registration would fail on older kernels which only accept > size 32. > > Tested on x86_64-linux-gnu. Built with build-many-glibcs.py. > This needs to be backported all the way to glibc 2.35. > > --- > nptl/descr.h | 15 +++++++++++++-- > 1 file changed, 13 insertions(+), 2 deletions(-) > > diff --git a/nptl/descr.h b/nptl/descr.h > index d06abd6ad9..abc9282ef7 100644 > --- a/nptl/descr.h > +++ b/nptl/descr.h > @@ -405,8 +405,19 @@ struct pthread > /* Used on strsignal. */ > struct tls_internal_t tls_state; > > - /* rseq area registered with the kernel. */ > - struct rseq rseq_area; > + /* rseq area registered with the kernel. Use a custom definition > + here to isolate from kernel struct rseq changes. The > + implementation of sched_getcpu needs acccess to the cpu_id field; > + the other fields are unused and not included here. */ > + union > + { > + struct > + { > + uint32_t cpu_id_start; > + uint32_t cpu_id; > + }; > + char pad[32]; /* Original rseq area size. */ > + } rseq_area __attribute__ ((aligned (32))); > > /* Amount of end padding, if any, in this structure. > This definition relies on rseq_area being last. */ > > base-commit: 3edc4ff2ceff4a59587ebecb94148d3bcfa1df62 Meh, disregard that, the patch is buggy. Thanks, Florian
diff --git a/nptl/descr.h b/nptl/descr.h index d06abd6ad9..abc9282ef7 100644 --- a/nptl/descr.h +++ b/nptl/descr.h @@ -405,8 +405,19 @@ struct pthread /* Used on strsignal. */ struct tls_internal_t tls_state; - /* rseq area registered with the kernel. */ - struct rseq rseq_area; + /* rseq area registered with the kernel. Use a custom definition + here to isolate from kernel struct rseq changes. The + implementation of sched_getcpu needs acccess to the cpu_id field; + the other fields are unused and not included here. */ + union + { + struct + { + uint32_t cpu_id_start; + uint32_t cpu_id; + }; + char pad[32]; /* Original rseq area size. */ + } rseq_area __attribute__ ((aligned (32))); /* Amount of end padding, if any, in this structure. This definition relies on rseq_area being last. */