This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH][BZ #15533] Avoid unnecessary slowdown from profiling with audit


Ping.  URL to the original submission:
http://sourceware.org/ml/libc-alpha/2013-05/msg00888.html

The patch still applies as posted and passes testing (on x86_64-linux).

On Sat, 25 May 2013, Alexander Monakov wrote:

> Hello,
> 
> Presently, using the rtld-audit interfaces introduces a slowdown due to
> enabling profiling instrumentation (as if LD_AUDIT implied LD_PROFILE).
> However, instrumenting is only necessary if one of audit libraries provides
> PLT hooks (la_plt{enter,exit} symbols).  Otherwise, the slowdown can be
> avoided.
> 
> In the synthetic test attached to the bugzilla issue, the slowdown is 19x.  On
> another application I tested, the slowdown from profiling was 10%.  The
> current behavior strongly discourages using the audit interface when
> compromising performance is not desired.
> 
> The following patch adjusts the logic that enables profiling to iterate over
> all audit modules and check if any of those provides a PLT hook.
> 
> I have an FSF copyright assignment as a GCC contributor (but I do not have
> commit access in glibc).
> 
> Thanks.
> 
> 
> 2013-05-25  Alexander Monakov  <amonakov@ispras.ru>
> 
> 	* elf/dl-reloc.c (_dl_relocate_object): Enable profiling only if one
> 	of audit libraries provides PLT hooks.
> 
> diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
> index 73d98f8..675e15b 100644
> --- a/elf/dl-reloc.c
> +++ b/elf/dl-reloc.c
> @@ -167,7 +167,16 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
>  #ifdef SHARED
>    /* If we are auditing, install the same handlers we need for profiling.  */
>    if ((reloc_mode & __RTLD_AUDIT) == 0)
> -    consider_profiling |= GLRO(dl_audit) != NULL;
> +    {
> +      struct audit_ifaces *afct = GLRO(dl_audit);
> +      for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
> +	{
> +	  /* Profiling is needed only if PLT hooks are provided.  */
> +	  if (afct->ARCH_LA_PLTENTER != NULL || afct->ARCH_LA_PLTEXIT != NULL)
> +	    consider_profiling = 1;
> +	  afct = afct->next;
> +	}
> +    }
>  #elif defined PROF
>    /* Never use dynamic linker profiling for gprof profiling code.  */
>  # define consider_profiling 0
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]