On Sat, Apr 27 2019, Nathanael Rensen <[email protected]> wrote:
> The diff below speeds up ld.so library loading where the dependency tree
> is broad and deep, such as samba's smbd which links over 100 libraries.
>
> See for example https://marc.info/?l=openbsd-misc&m=155007285712913&w=2
>
> The timings below are for ldd /usr/local/sbin/smbd:
>
> Timing without diff: 2m02.50s real 2m02.48s user 0m00.02s system
> Timing with diff : 0m00.03s real 0m00.02s user 0m00.01s system
>
> Note that these timings are for a build of a recent samba master tree
> (linked with kerberos) which is probably slower than the OpenBSD port.
>
> While this diff speeds up loading (e.g. ldd) a second diff (part 2) is
> also helpful to speed up library initialisation.
Any news regarding this diff? Nathanael, Martin: you've discussed
alternative approaches but afaik the first diff (inlined below) is still
correct. What is needed to get this in?
Index: libexec/ld.so/dlfcn.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/dlfcn.c,v
retrieving revision 1.102
diff -u -p -r1.102 dlfcn.c
--- libexec/ld.so/dlfcn.c 22 Oct 2018 01:59:08 -0000 1.102
+++ libexec/ld.so/dlfcn.c 27 Jun 2019 22:42:24 -0000
@@ -93,7 +93,7 @@ dlopen(const char *libname, int flags)
/* if opened but grpsym_list has not been created */
if (OBJECT_DLREF_CNT(object) == 1) {
/* add first object manually */
- _dl_link_grpsym(object, 1);
+ _dl_link_grpsym(object);
_dl_cache_grpsym_list(object);
}
goto loaded;
Index: libexec/ld.so/library_subr.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/library_subr.c,v
retrieving revision 1.48
diff -u -p -r1.48 library_subr.c
--- libexec/ld.so/library_subr.c 28 Aug 2017 14:06:22 -0000 1.48
+++ libexec/ld.so/library_subr.c 27 Jun 2019 22:42:24 -0000
@@ -527,19 +527,13 @@ _dl_link_child(elf_object_t *dep, elf_ob
static unsigned int _dl_grpsym_gen = 0;
void
-_dl_link_grpsym(elf_object_t *object, int checklist)
+_dl_link_grpsym(elf_object_t *object)
{
struct dep_node *n;
- if (checklist) {
- TAILQ_FOREACH(n, &_dl_loading_object->grpsym_list, next_sib)
- if (n->data == object)
- return; /* found, dont bother adding */
- } else {
- if (object->grpsym_gen == _dl_grpsym_gen) {
+ TAILQ_FOREACH(n, &_dl_loading_object->grpsym_list, next_sib)
+ if (n->data == object)
return; /* found, dont bother adding */
- }
- }
object->grpsym_gen = _dl_grpsym_gen;
n = _dl_malloc(sizeof *n);
@@ -572,6 +566,7 @@ _dl_cache_grpsym_list_setup(elf_object_t
void
_dl_cache_grpsym_list(elf_object_t *object)
{
+ int recurse = 0;
struct dep_node *n;
/*
@@ -581,8 +576,12 @@ _dl_cache_grpsym_list(elf_object_t *obje
*/
TAILQ_FOREACH(n, &object->child_list, next_sib)
- _dl_link_grpsym(n->data, 0);
+ if (n->data->grpsym_gen != _dl_grpsym_gen) {
+ _dl_link_grpsym(n->data);
+ recurse = 1;
+ }
- TAILQ_FOREACH(n, &object->child_list, next_sib)
- _dl_cache_grpsym_list(n->data);
+ if (recurse)
+ TAILQ_FOREACH(n, &object->child_list, next_sib)
+ _dl_cache_grpsym_list(n->data);
}
Index: libexec/ld.so/loader.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/loader.c,v
retrieving revision 1.182
diff -u -p -r1.182 loader.c
--- libexec/ld.so/loader.c 7 Jun 2019 16:27:47 -0000 1.182
+++ libexec/ld.so/loader.c 27 Jun 2019 22:42:25 -0000
@@ -396,7 +396,7 @@ _dl_load_dep_libs(elf_object_t *object,
}
/* add first object manually */
- _dl_link_grpsym(object, 1);
+ _dl_link_grpsym(object);
_dl_cache_grpsym_list_setup(object);
return(0);
@@ -583,7 +583,7 @@ _dl_boot(const char **argv, char **envp,
_dl_add_object(dyn_obj);
dyn_obj->refcount++;
- _dl_link_grpsym(dyn_obj, 1);
+ _dl_link_grpsym(dyn_obj);
dyn_obj->status |= STAT_RELOC_DONE;
_dl_set_sod(dyn_obj->load_name, &dyn_obj->sod);
Index: libexec/ld.so/resolve.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/resolve.h,v
retrieving revision 1.92
diff -u -p -r1.92 resolve.h
--- libexec/ld.so/resolve.h 11 May 2019 21:02:35 -0000 1.92
+++ libexec/ld.so/resolve.h 27 Jun 2019 22:42:25 -0000
@@ -286,7 +286,7 @@ int _dl_load_dep_libs(elf_object_t *obje
int _dl_rtld(elf_object_t *object);
void _dl_call_init(elf_object_t *object);
void _dl_link_child(elf_object_t *dep, elf_object_t *p);
-void _dl_link_grpsym(elf_object_t *object, int checklist);
+void _dl_link_grpsym(elf_object_t *object);
void _dl_cache_grpsym_list(elf_object_t *object);
void _dl_cache_grpsym_list_setup(elf_object_t *object);
void _dl_link_grpref(elf_object_t *load_group, elf_object_t *load_object);
--
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE