On Sat, Apr 27, 2019 at 09:55:33PM +0800, Nathanael Rensen wrote:
> The diff below speeds up ld.so library intialisation 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
>
> See https://marc.info/?l=openbsd-tech&m=155637285221396&w=2 for part 1
> that speeds up library loading.
>
> The timings below are for /usr/local/sbin/smbd --version:
>
> Timing without either diff : 6m45.67s real 6m45.65s user 0m00.02s system
> Timing with part 1 diff only: 4m42.88s real 4m42.85s user 0m00.02s system
> Timing with part 2 diff only: 2m02.61s real 2m02.60s user 0m00.01s system
> Timing with both diffs : 0m00.03s real 0m00.03s user 0m00.00s 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.
>
> Nathanael
Wow. Tried your part1 and part2 diffs and the difference is indeed insane!
mail/evolution always took 10+ seconds to start for me and now it's almost
instant...
Crazy... But this sounds too good to be true ;-)
What are the potential regressions?
> Index: libexec/ld.so/loader.c
> ===================================================================
> RCS file: /cvs/src/libexec/ld.so/loader.c,v
> retrieving revision 1.177
> diff -u -p -p -u -r1.177 loader.c
> --- libexec/ld.so/loader.c 3 Dec 2018 05:29:56 -0000 1.177
> +++ libexec/ld.so/loader.c 27 Apr 2019 13:24:02 -0000
> @@ -749,15 +749,15 @@ _dl_call_init_recurse(elf_object_t *obje
> {
> struct dep_node *n;
>
> - object->status |= STAT_VISITED;
> + int visited_flag = initfirst ? STAT_VISITED_1 : STAT_VISITED_2;
> +
> + object->status |= visited_flag;
>
> TAILQ_FOREACH(n, &object->child_list, next_sib) {
> - if (n->data->status & STAT_VISITED)
> + if (n->data->status & visited_flag)
> continue;
> _dl_call_init_recurse(n->data, initfirst);
> }
> -
> - object->status &= ~STAT_VISITED;
>
> if (object->status & STAT_INIT_DONE)
> return;
> Index: libexec/ld.so/resolve.h
> ===================================================================
> RCS file: /cvs/src/libexec/ld.so/resolve.h,v
> retrieving revision 1.90
> diff -u -p -p -u -r1.90 resolve.h
> --- libexec/ld.so/resolve.h 21 Apr 2019 04:11:42 -0000 1.90
> +++ libexec/ld.so/resolve.h 27 Apr 2019 13:24:02 -0000
> @@ -125,8 +125,9 @@ struct elf_object {
> #define STAT_FINI_READY 0x10
> #define STAT_UNLOADED 0x20
> #define STAT_NODELETE 0x40
> -#define STAT_VISITED 0x80
> +#define STAT_VISITED_1 0x80
> #define STAT_GNU_HASH 0x100
> +#define STAT_VISITED_2 0x200
>
> Elf_Phdr *phdrp;
> int phdrc;
>
--
Antoine