Re: [RFC PATCH for 4.21 01/16] rseq/selftests: Add reference counter to coexist with glibc
From: Szabolcs Nagy <hidden>
Date: 2018-10-11 10:38:13
Also in:
lkml
From: Szabolcs Nagy <hidden>
Date: 2018-10-11 10:38:13
Also in:
lkml
On 10/10/18 20:19, Mathieu Desnoyers wrote:
In order to integrate rseq into user-space applications, add a reference counter field after the struct rseq TLS ABI so many rseq users can be linked into the same application (e.g. librseq and glibc). The reference count ensures that rseq syscall registration/unregistration happens only for the most early/late user for each thread, thus ensuring that rseq is registered across the lifetime of all rseq users for a given thread.
...
+__attribute__((visibility("hidden"))) __thread
+volatile struct libc_rseq __lib_rseq_abi = {...
+extern __attribute__((weak, alias("__lib_rseq_abi"))) __thread
+volatile struct rseq __rseq_abi;...
@@ -70,7 +86,7 @@ int rseq_register_current_thread(void) sigset_t oldset; signal_off_save(&oldset); - if (refcount++) + if (__lib_rseq_abi.refcount++) goto end; rc = sys_rseq(&__rseq_abi, sizeof(struct rseq), 0, RSEQ_SIG);
why do you use a local refcounter instead of the __rseq_abi one? what prevents calling rseq_register_current_thread more than 4G times? why cant the kernel see that the same address is registered again and succeed?