6c0556
commit 2208066603a136f95cfb815ca9281262e6465784
6c0556
Author: Szabolcs Nagy <szabolcs.nagy@arm.com>
6c0556
Date:   Thu Feb 11 13:24:47 2021 +0000
6c0556
6c0556
    elf: Remove lazy tlsdesc relocation related code
6c0556
    
6c0556
    Remove generic tlsdesc code related to lazy tlsdesc processing since
6c0556
    lazy tlsdesc relocation is no longer supported.  This includes removing
6c0556
    GL(dl_load_lock) from _dl_make_tlsdesc_dynamic which is only called at
6c0556
    load time when that lock is already held.
6c0556
    
6c0556
    Added a documentation comment too.
6c0556
    
6c0556
    Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
6c0556
6c0556
diff --git a/elf/tlsdeschtab.h b/elf/tlsdeschtab.h
6c0556
index fea9eefe72edcd6b..c20857e5b4264f00 100644
6c0556
--- a/elf/tlsdeschtab.h
6c0556
+++ b/elf/tlsdeschtab.h
6c0556
@@ -78,6 +78,10 @@ map_generation (struct link_map *map)
6c0556
   return GL(dl_tls_generation) + 1;
6c0556
 }
6c0556
 
6c0556
+/* Returns the data pointer for a given map and tls offset that is used
6c0556
+   to fill in one of the GOT entries referenced by a TLSDESC relocation
6c0556
+   when using dynamic TLS.  This requires allocation, returns NULL on
6c0556
+   allocation failure.  */
6c0556
 void *
6c0556
 _dl_make_tlsdesc_dynamic (struct link_map *map, size_t ti_offset)
6c0556
 {
6c0556
@@ -85,18 +89,12 @@ _dl_make_tlsdesc_dynamic (struct link_map *map, size_t ti_offset)
6c0556
   void **entry;
6c0556
   struct tlsdesc_dynamic_arg *td, test;
6c0556
 
6c0556
-  /* FIXME: We could use a per-map lock here, but is it worth it?  */
6c0556
-  __rtld_lock_lock_recursive (GL(dl_load_lock));
6c0556
-
6c0556
   ht = map->l_mach.tlsdesc_table;
6c0556
   if (! ht)
6c0556
     {
6c0556
       ht = htab_create ();
6c0556
       if (! ht)
6c0556
-	{
6c0556
-	  __rtld_lock_unlock_recursive (GL(dl_load_lock));
6c0556
-	  return 0;
6c0556
-	}
6c0556
+	return 0;
6c0556
       map->l_mach.tlsdesc_table = ht;
6c0556
     }
6c0556
 
6c0556
@@ -104,15 +102,11 @@ _dl_make_tlsdesc_dynamic (struct link_map *map, size_t ti_offset)
6c0556
   test.tlsinfo.ti_offset = ti_offset;
6c0556
   entry = htab_find_slot (ht, &test, 1, hash_tlsdesc, eq_tlsdesc);
6c0556
   if (! entry)
6c0556
-    {
6c0556
-      __rtld_lock_unlock_recursive (GL(dl_load_lock));
6c0556
-      return 0;
6c0556
-    }
6c0556
+    return 0;
6c0556
 
6c0556
   if (*entry)
6c0556
     {
6c0556
       td = *entry;
6c0556
-      __rtld_lock_unlock_recursive (GL(dl_load_lock));
6c0556
       return td;
6c0556
     }
6c0556
 
6c0556
@@ -122,44 +116,9 @@ _dl_make_tlsdesc_dynamic (struct link_map *map, size_t ti_offset)
6c0556
      thread.  */
6c0556
   td->gen_count = map_generation (map);
6c0556
   td->tlsinfo = test.tlsinfo;
6c0556
-
6c0556
-  __rtld_lock_unlock_recursive (GL(dl_load_lock));
6c0556
   return td;
6c0556
 }
6c0556
 
6c0556
 # endif /* SHARED */
6c0556
 
6c0556
-/* The idea of the following two functions is to stop multiple threads
6c0556
-   from attempting to resolve the same TLS descriptor without busy
6c0556
-   waiting.  Ideally, we should be able to release the lock right
6c0556
-   after changing td->entry, and then using say a condition variable
6c0556
-   or a futex wake to wake up any waiting threads, but let's try to
6c0556
-   avoid introducing such dependencies.  */
6c0556
-
6c0556
-static int
6c0556
-__attribute__ ((unused))
6c0556
-_dl_tlsdesc_resolve_early_return_p (struct tlsdesc volatile *td, void *caller)
6c0556
-{
6c0556
-  if (caller != atomic_load_relaxed (&td->entry))
6c0556
-    return 1;
6c0556
-
6c0556
-  __rtld_lock_lock_recursive (GL(dl_load_lock));
6c0556
-  if (caller != atomic_load_relaxed (&td->entry))
6c0556
-    {
6c0556
-      __rtld_lock_unlock_recursive (GL(dl_load_lock));
6c0556
-      return 1;
6c0556
-    }
6c0556
-
6c0556
-  atomic_store_relaxed (&td->entry, _dl_tlsdesc_resolve_hold);
6c0556
-
6c0556
-  return 0;
6c0556
-}
6c0556
-
6c0556
-static void
6c0556
-__attribute__ ((unused))
6c0556
-_dl_tlsdesc_wake_up_held_fixups (void)
6c0556
-{
6c0556
-  __rtld_lock_unlock_recursive (GL(dl_load_lock));
6c0556
-}
6c0556
-
6c0556
 #endif
6c0556
diff --git a/sysdeps/aarch64/tlsdesc.c b/sysdeps/aarch64/tlsdesc.c
6c0556
index 357465f23d76e2bd..1ead73ab8250e29c 100644
6c0556
--- a/sysdeps/aarch64/tlsdesc.c
6c0556
+++ b/sysdeps/aarch64/tlsdesc.c
6c0556
@@ -22,7 +22,6 @@
6c0556
 #include <tls.h>
6c0556
 #include <dl-tlsdesc.h>
6c0556
 #include <dl-unmap-segments.h>
6c0556
-#define _dl_tlsdesc_resolve_hold 0
6c0556
 #include <tlsdeschtab.h>
6c0556
 
6c0556
 /* Unmap the dynamic object, but also release its TLS descriptor table
6c0556
diff --git a/sysdeps/arm/tlsdesc.c b/sysdeps/arm/tlsdesc.c
6c0556
index d142d7a2c91e9adb..b78e3f65785bf587 100644
6c0556
--- a/sysdeps/arm/tlsdesc.c
6c0556
+++ b/sysdeps/arm/tlsdesc.c
6c0556
@@ -20,7 +20,6 @@
6c0556
 #include <tls.h>
6c0556
 #include <dl-tlsdesc.h>
6c0556
 #include <dl-unmap-segments.h>
6c0556
-#define _dl_tlsdesc_resolve_hold 0
6c0556
 #include <tlsdeschtab.h>
6c0556
 
6c0556
 /* Unmap the dynamic object, but also release its TLS descriptor table
6c0556
diff --git a/sysdeps/i386/tlsdesc.c b/sysdeps/i386/tlsdesc.c
6c0556
index 1b4227c8381e1b3d..c242ffce726d50e4 100644
6c0556
--- a/sysdeps/i386/tlsdesc.c
6c0556
+++ b/sysdeps/i386/tlsdesc.c
6c0556
@@ -20,7 +20,6 @@
6c0556
 #include <tls.h>
6c0556
 #include <dl-tlsdesc.h>
6c0556
 #include <dl-unmap-segments.h>
6c0556
-#define _dl_tlsdesc_resolve_hold 0
6c0556
 #include <tlsdeschtab.h>
6c0556
 
6c0556
 /* Unmap the dynamic object, but also release its TLS descriptor table
6c0556
diff --git a/sysdeps/x86_64/tlsdesc.c b/sysdeps/x86_64/tlsdesc.c
6c0556
index 61a19ae26944c84f..a9325827d0e5e31b 100644
6c0556
--- a/sysdeps/x86_64/tlsdesc.c
6c0556
+++ b/sysdeps/x86_64/tlsdesc.c
6c0556
@@ -20,7 +20,6 @@
6c0556
 #include <tls.h>
6c0556
 #include <dl-tlsdesc.h>
6c0556
 #include <dl-unmap-segments.h>
6c0556
-#define _dl_tlsdesc_resolve_hold 0
6c0556
 #include <tlsdeschtab.h>
6c0556
 
6c0556
 /* Unmap the dynamic object, but also release its TLS descriptor table