When porting librseq commit:
commit c7b45750fa85 ("Adapt to glibc __rseq_size feature detection")
from librseq to the kernel selftests, the following line was missed at the end of rseq_init():
rseq_size = get_rseq_kernel_feature_size();
which effectively leaves rseq_size initialized to -1U when glibc does not have rseq support. glibc supports rseq from version 2.35 onwards.
In a following librseq commit
commit c67d198627c2 ("Only set 'rseq_size' on first thread registration")
to mimic the libc behavior, a new approach is taken: don't set the feature size in 'rseq_size' until at least one thread has successfully registered. This allows using 'rseq_size' in fast-paths to test for both registration status and available features. The caveat is that on libc either all threads are registered or none are, while with bare librseq it is the responsability of the user to register all threads using rseq.
This combines the changes from the following librseq commits:
commit c7b45750fa85 ("Adapt to glibc __rseq_size feature detection") commit c67d198627c2 ("Only set 'rseq_size' on first thread registration")
Fixes: 73a4f5a704a2 ("selftests/rseq: Fix mm_cid test failure") Signed-off-by: Mathieu Desnoyers mathieu.desnoyers@efficios.com Cc: Raghavendra Rao Ananta rananta@google.com Cc: Shuah Khan skhan@linuxfoundation.org Cc: Peter Zijlstra peterz@infradead.org Cc: Boqun Feng boqun.feng@gmail.com Cc: "Paul E. McKenney" paulmck@kernel.org Cc: Carlos O'Donell carlos@redhat.com Cc: Florian Weimer fweimer@redhat.com Cc: Michael Jeanson mjeanson@efficios.com Cc: linux-kselftest@vger.kernel.org Cc: stable@vger.kernel.org --- tools/testing/selftests/rseq/rseq.c | 32 ++++++++++++++++++++++------- tools/testing/selftests/rseq/rseq.h | 9 +++++++- 2 files changed, 33 insertions(+), 8 deletions(-)
diff --git a/tools/testing/selftests/rseq/rseq.c b/tools/testing/selftests/rseq/rseq.c index 5b9772cdf265..f6156790c3b4 100644 --- a/tools/testing/selftests/rseq/rseq.c +++ b/tools/testing/selftests/rseq/rseq.c @@ -61,7 +61,6 @@ unsigned int rseq_size = -1U; unsigned int rseq_flags;
static int rseq_ownership; -static int rseq_reg_success; /* At least one rseq registration has succeded. */
/* Allocate a large area for the TLS. */ #define RSEQ_THREAD_AREA_ALLOC_SIZE 1024 @@ -152,14 +151,27 @@ int rseq_register_current_thread(void) } rc = sys_rseq(&__rseq_abi, get_rseq_min_alloc_size(), 0, RSEQ_SIG); if (rc) { - if (RSEQ_READ_ONCE(rseq_reg_success)) { + /* + * After at least one thread has registered successfully + * (rseq_size > 0), the registration of other threads should + * never fail. + */ + if (RSEQ_READ_ONCE(rseq_size) > 0) { /* Incoherent success/failure within process. */ abort(); } return -1; } assert(rseq_current_cpu_raw() >= 0); - RSEQ_WRITE_ONCE(rseq_reg_success, 1); + + /* + * The first thread to register sets the rseq_size to mimic the libc + * behavior. + */ + if (RSEQ_READ_ONCE(rseq_size) == 0) { + RSEQ_WRITE_ONCE(rseq_size, get_rseq_kernel_feature_size()); + } + return 0; }
@@ -235,12 +247,18 @@ void rseq_init(void) return; } rseq_ownership = 1; - if (!rseq_available()) { - rseq_size = 0; - return; - } + + /* Calculate the offset of the rseq area from the thread pointer. */ rseq_offset = (void *)&__rseq_abi - rseq_thread_pointer(); + + /* rseq flags are deprecated, always set to 0. */ rseq_flags = 0; + + /* + * Set the size to 0 until at least one thread registers to mimic the + * libc behavior. + */ + rseq_size = 0; }
static __attribute__((destructor)) diff --git a/tools/testing/selftests/rseq/rseq.h b/tools/testing/selftests/rseq/rseq.h index 4e217b620e0c..062d10925a10 100644 --- a/tools/testing/selftests/rseq/rseq.h +++ b/tools/testing/selftests/rseq/rseq.h @@ -60,7 +60,14 @@ extern ptrdiff_t rseq_offset;
/* - * Size of the registered rseq area. 0 if the registration was + * The rseq ABI is composed of extensible feature fields. The extensions + * are done by appending additional fields at the end of the structure. + * The rseq_size defines the size of the active feature set which can be + * used by the application for the current rseq registration. Features + * starting at offset >= rseq_size are inactive and should not be used. + * + * The rseq_size is the intersection between the available allocation + * size for the rseq area and the feature size supported by the kernel. * unsuccessful. */ extern unsigned int rseq_size;
On 1/14/25 07:51, Mathieu Desnoyers wrote:
When porting librseq commit:
commit c7b45750fa85 ("Adapt to glibc __rseq_size feature detection")
from librseq to the kernel selftests, the following line was missed at the end of rseq_init():
rseq_size = get_rseq_kernel_feature_size();
which effectively leaves rseq_size initialized to -1U when glibc does not have rseq support. glibc supports rseq from version 2.35 onwards.
In a following librseq commit
commit c67d198627c2 ("Only set 'rseq_size' on first thread registration")
to mimic the libc behavior, a new approach is taken: don't set the feature size in 'rseq_size' until at least one thread has successfully registered. This allows using 'rseq_size' in fast-paths to test for both registration status and available features. The caveat is that on libc either all threads are registered or none are, while with bare librseq it is the responsability of the user to register all threads using rseq.
This combines the changes from the following librseq commits:
commit c7b45750fa85 ("Adapt to glibc __rseq_size feature detection") commit c67d198627c2 ("Only set 'rseq_size' on first thread registration")
Fixes: 73a4f5a704a2 ("selftests/rseq: Fix mm_cid test failure") Signed-off-by: Mathieu Desnoyers mathieu.desnoyers@efficios.com
Hi Mathieu,
Can you double check these commits and make sure these are right ones in the mainline rc7?
I am seeing "Unknown commit id" warnings on all of these - my repo is at 6.13 rc7
Also would you like to add Reported-by for Raghavendra Rao Ananta?
thanks, -- Shuah
On 2025-01-14 19:14, Shuah Khan wrote:
On 1/14/25 07:51, Mathieu Desnoyers wrote:
When porting librseq commit:
commit c7b45750fa85 ("Adapt to glibc __rseq_size feature detection")
from librseq to the kernel selftests, the following line was missed at the end of rseq_init():
rseq_size = get_rseq_kernel_feature_size();
which effectively leaves rseq_size initialized to -1U when glibc does not have rseq support. glibc supports rseq from version 2.35 onwards.
In a following librseq commit
commit c67d198627c2 ("Only set 'rseq_size' on first thread registration")
to mimic the libc behavior, a new approach is taken: don't set the feature size in 'rseq_size' until at least one thread has successfully registered. This allows using 'rseq_size' in fast-paths to test for both registration status and available features. The caveat is that on libc either all threads are registered or none are, while with bare librseq it is the responsability of the user to register all threads using rseq.
This combines the changes from the following librseq commits:
commit c7b45750fa85 ("Adapt to glibc __rseq_size feature detection") commit c67d198627c2 ("Only set 'rseq_size' on first thread registration")
Fixes: 73a4f5a704a2 ("selftests/rseq: Fix mm_cid test failure") Signed-off-by: Mathieu Desnoyers mathieu.desnoyers@efficios.com
Hi Mathieu,
Can you double check these commits and make sure these are right ones in the mainline rc7?
I am seeing "Unknown commit id" warnings on all of these - my repo is at 6.13 rc7
This is because those are commits in the librseq project at https://git.kernel.org/pub/scm/libs/librseq/librseq.git/ which is a different tree from the Linux kernel. I am not sure what is the preferred approach when citing a commit ID from a different project ?
I've been keeping both rseq selftests and librseq in sync since 2018. I plan to eventually add a dependency of the rseq selftests on librseq, but this cannot happen until we freeze the API and cut a librseq release.
This was premature before we reached the major milestone of having extensible rseq support in glibc.
Now that it's merged into glibc (as of last week), we can start looking forward to a librseq release, which should eventually eliminate code duplication with rseq selftests.
Perhaps we should add a Link: to the librseq repository ?
Also would you like to add Reported-by for Raghavendra Rao Ananta?
Yes, please. Can you add it as you merge my patch ?
Thanks,
Mathieu
thanks, -- Shuah
On 1/14/25 17:45, Mathieu Desnoyers wrote:
On 2025-01-14 19:14, Shuah Khan wrote:
On 1/14/25 07:51, Mathieu Desnoyers wrote:
When porting librseq commit:
commit c7b45750fa85 ("Adapt to glibc __rseq_size feature detection")
from librseq to the kernel selftests, the following line was missed at the end of rseq_init():
rseq_size = get_rseq_kernel_feature_size();
which effectively leaves rseq_size initialized to -1U when glibc does not have rseq support. glibc supports rseq from version 2.35 onwards.
In a following librseq commit
commit c67d198627c2 ("Only set 'rseq_size' on first thread registration")
to mimic the libc behavior, a new approach is taken: don't set the feature size in 'rseq_size' until at least one thread has successfully registered. This allows using 'rseq_size' in fast-paths to test for both registration status and available features. The caveat is that on libc either all threads are registered or none are, while with bare librseq it is the responsability of the user to register all threads using rseq.
This combines the changes from the following librseq commits:
commit c7b45750fa85 ("Adapt to glibc __rseq_size feature detection") commit c67d198627c2 ("Only set 'rseq_size' on first thread registration")
Fixes: 73a4f5a704a2 ("selftests/rseq: Fix mm_cid test failure")
Fixed this commit id commit c7b45750fa85 ("Adapt to glibc __rseq_size feature detection")
Signed-off-by: Mathieu Desnoyers mathieu.desnoyers@efficios.com
Hi Mathieu,
Can you double check these commits and make sure these are right ones in the mainline rc7?
I am seeing "Unknown commit id" warnings on all of these - my repo is at 6.13 rc7
This is because those are commits in the librseq project at https://git.kernel.org/pub/scm/libs/librseq/librseq.git/ which is a different tree from the Linux kernel. I am not sure what is the preferred approach when citing a commit ID from a different project ?
I've been keeping both rseq selftests and librseq in sync since 2018. I plan to eventually add a dependency of the rseq selftests on librseq, but this cannot happen until we freeze the API and cut a librseq release.
This was premature before we reached the major milestone of having extensible rseq support in glibc.
Now that it's merged into glibc (as of last week), we can start looking forward to a librseq release, which should eventually eliminate code duplication with rseq selftests.
Perhaps we should add a Link: to the librseq repository ?
Also would you like to add Reported-by for Raghavendra Rao Ananta?
Added. The patch is now in linux-kselftest next
thanks, -- Shuah
On 2025-01-15 12:57, Shuah Khan wrote:
On 1/14/25 17:45, Mathieu Desnoyers wrote:
On 2025-01-14 19:14, Shuah Khan wrote:
On 1/14/25 07:51, Mathieu Desnoyers wrote:
When porting librseq commit:
commit c7b45750fa85 ("Adapt to glibc __rseq_size feature detection")
from librseq to the kernel selftests, the following line was missed at the end of rseq_init():
rseq_size = get_rseq_kernel_feature_size();
which effectively leaves rseq_size initialized to -1U when glibc does not have rseq support. glibc supports rseq from version 2.35 onwards.
In a following librseq commit
commit c67d198627c2 ("Only set 'rseq_size' on first thread registration")
to mimic the libc behavior, a new approach is taken: don't set the feature size in 'rseq_size' until at least one thread has successfully registered. This allows using 'rseq_size' in fast-paths to test for both registration status and available features. The caveat is that on libc either all threads are registered or none are, while with bare librseq it is the responsability of the user to register all threads using rseq.
This combines the changes from the following librseq commits:
commit c7b45750fa85 ("Adapt to glibc __rseq_size feature detection") commit c67d198627c2 ("Only set 'rseq_size' on first thread registration")
Fixes: 73a4f5a704a2 ("selftests/rseq: Fix mm_cid test failure")
Fixed this commit id commit c7b45750fa85 ("Adapt to glibc __rseq_size feature detection")
Just pointing out that you did the right thing in the commit that ends up in linux-kselftest next:
https://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git/co...
Fixes: a0cc649353bb ("selftests/rseq: Fix mm_cid test failure")
Which is fine.
Thanks!
Mathieu
Signed-off-by: Mathieu Desnoyers mathieu.desnoyers@efficios.com
Hi Mathieu,
Can you double check these commits and make sure these are right ones in the mainline rc7?
I am seeing "Unknown commit id" warnings on all of these - my repo is at 6.13 rc7
This is because those are commits in the librseq project at https://git.kernel.org/pub/scm/libs/librseq/librseq.git/ which is a different tree from the Linux kernel. I am not sure what is the preferred approach when citing a commit ID from a different project ?
I've been keeping both rseq selftests and librseq in sync since 2018. I plan to eventually add a dependency of the rseq selftests on librseq, but this cannot happen until we freeze the API and cut a librseq release.
This was premature before we reached the major milestone of having extensible rseq support in glibc.
Now that it's merged into glibc (as of last week), we can start looking forward to a librseq release, which should eventually eliminate code duplication with rseq selftests.
Perhaps we should add a Link: to the librseq repository ?
Also would you like to add Reported-by for Raghavendra Rao Ananta?
Added. The patch is now in linux-kselftest next
thanks, -- Shuah
linux-stable-mirror@lists.linaro.org