Message ID | 87lefaolfd.fsf@oldenburg.str.redhat.com |
---|---|
State | New |
Headers | show |
Series | [v2] nptl: Unconditionally use a 32-byte rseq area | expand |
On 7/20/23 07:46, Florian Weimer wrote: > 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. Yes, this change appears to be needed considering the way the upstream kernel uapi has evolved. Thanks, Mathieu > > Tested on x86_64-linux-gnu. Built with build-many-glibcs.py. > This needs to be backported all the way to glibc 2.35. > > --- > v2: Drop further struct rseq reference on ia64. Remove #include <sys/rseq.h>. > nptl/descr.h | 18 ++++++++++++++---- > 1 file changed, 14 insertions(+), 4 deletions(-) > > diff --git a/nptl/descr.h b/nptl/descr.h > index d06abd6ad9..0171576c23 100644 > --- a/nptl/descr.h > +++ b/nptl/descr.h > @@ -34,7 +34,6 @@ > #include <bits/types/res_state.h> > #include <kernel-features.h> > #include <tls-internal-struct.h> > -#include <sys/rseq.h> > #include <internal-sigset.h> > > #ifndef TCB_ALIGNMENT > @@ -405,14 +404,25 @@ 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. */ > #define PTHREAD_STRUCT_END_PADDING \ > (sizeof (struct pthread) - offsetof (struct pthread, rseq_area) \ > - + sizeof (struct rseq)) > + + sizeof ((struct pthread) {}.rseq_area)) > } __attribute ((aligned (TCB_ALIGNMENT))); > > static inline bool > > base-commit: 3edc4ff2ceff4a59587ebecb94148d3bcfa1df62 >
* Mathieu Desnoyers: > On 7/20/23 07:46, Florian Weimer wrote: >> 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. > > Yes, this change appears to be needed considering the way the upstream > kernel uapi has evolved. Andreas, is it okay to push this from an RM perspective? Thanks, Florian >> Tested on x86_64-linux-gnu. Built with build-many-glibcs.py. >> This needs to be backported all the way to glibc 2.35. >> --- >> v2: Drop further struct rseq reference on ia64. Remove #include <sys/rseq.h>. >> nptl/descr.h | 18 ++++++++++++++---- >> 1 file changed, 14 insertions(+), 4 deletions(-) >> diff --git a/nptl/descr.h b/nptl/descr.h >> index d06abd6ad9..0171576c23 100644 >> --- a/nptl/descr.h >> +++ b/nptl/descr.h >> @@ -34,7 +34,6 @@ >> #include <bits/types/res_state.h> >> #include <kernel-features.h> >> #include <tls-internal-struct.h> >> -#include <sys/rseq.h> >> #include <internal-sigset.h> >> #ifndef TCB_ALIGNMENT >> @@ -405,14 +404,25 @@ 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. */ >> #define PTHREAD_STRUCT_END_PADDING \ >> (sizeof (struct pthread) - offsetof (struct pthread, rseq_area) \ >> - + sizeof (struct rseq)) >> + + sizeof ((struct pthread) {}.rseq_area)) >> } __attribute ((aligned (TCB_ALIGNMENT))); >> static inline bool >> base-commit: 3edc4ff2ceff4a59587ebecb94148d3bcfa1df62 >>
Am Freitag, 21. Juli 2023, 16:01:51 CEST schrieb Florian Weimer: > * Mathieu Desnoyers: > > > On 7/20/23 07:46, Florian Weimer wrote: > >> 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. > > > > Yes, this change appears to be needed considering the way the upstream > > kernel uapi has evolved. > > Andreas, is it okay to push this from an RM perspective? Yes, please do it! Best, Andreas
diff --git a/nptl/descr.h b/nptl/descr.h index d06abd6ad9..0171576c23 100644 --- a/nptl/descr.h +++ b/nptl/descr.h @@ -34,7 +34,6 @@ #include <bits/types/res_state.h> #include <kernel-features.h> #include <tls-internal-struct.h> -#include <sys/rseq.h> #include <internal-sigset.h> #ifndef TCB_ALIGNMENT @@ -405,14 +404,25 @@ 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. */ #define PTHREAD_STRUCT_END_PADDING \ (sizeof (struct pthread) - offsetof (struct pthread, rseq_area) \ - + sizeof (struct rseq)) + + sizeof ((struct pthread) {}.rseq_area)) } __attribute ((aligned (TCB_ALIGNMENT))); static inline bool