]> git.ipfire.org Git - thirdparty/glibc.git/commit
RFC elf: Fix slow tls access after dlopen [BZ #19924] nsz/bug19329-v2
authorSzabolcs Nagy <szabolcs.nagy@arm.com>
Tue, 16 Feb 2021 12:55:13 +0000 (12:55 +0000)
committerSzabolcs Nagy <szabolcs.nagy@arm.com>
Tue, 13 Apr 2021 07:43:40 +0000 (08:43 +0100)
commitb116855de71098ef7dd2875dd3237f8f3ecc12c2
tree6da94b9ca548a5042d743626fdbe1990fa5221a2
parentf8ea2b9982e39fd950d157f5dba31121ceb51df3
RFC elf: Fix slow tls access after dlopen [BZ #19924]

In short: __tls_get_addr checks the global generation counter,
_dl_update_slotinfo updates up to the generation of the accessed
module. If the global generation is newer than geneneration of the
module then __tls_get_addr keeps hitting the slow path that updates
the dtv.

Possible approaches i can see:

1. update to global generation instead of module,
2. check the module generation in the fast path.

This patch is 1.: it needs additional sync (load acquire) so the
slotinfo list is up to date with the observed global generation.

Approach 2. would require walking the slotinfo list at all times.
I don't know how to make that fast with many modules.

Note: in the x86_64 version of dl-tls.c the generation is only loaded
once, since relaxed mo is not faster than acquire mo load.

I have not benchmarked this yet.
elf/dl-close.c
elf/dl-open.c
elf/dl-reloc.c
elf/dl-tls.c
sysdeps/generic/ldsodefs.h
sysdeps/x86_64/dl-tls.c