Re: [PATCH v2 1/1] Add system-wide tunables: implement overridability

Adhemerval Zanella Netto <[email protected]>
Newsgroups gmane.comp.lib.glibc.alpha
Organization Linaro
Message-ID <[email protected]>

On 02/07/26 12:19, DJ Delorie wrote:
> 
> Andreas Schwab <[email protected]> writes:
>> That proves to be pretty fragile.
> 
> How about this?
> 
>     Add system-wide tunables: implement overridability
>     
>     Implement the overridability/nonoverridability flags
>     for tunables.
> 
> diff --git a/elf/Makefile b/elf/Makefile
> index 789c504da9..7b00a0b931 100644
> --- a/elf/Makefile
> +++ b/elf/Makefile
> @@ -347,7 +347,11 @@ tests-static += \
>    tst-tls9-static \
>    # tests-static
>  
> -tst-tunconf1-TUNABLES-only = glibc.malloc.tcache_count=5
> +tst-tunconf1-TUNABLES-only = \
> +   glibc.malloc.tcache_count=5 \
> +  :glibc.malloc.perturb=41 \
> +  :glibc.malloc.mmap_threshold=10002 \
> +  :glibc.malloc.trim_threshold=10002

No need to add ':' for each tunable, the TUNABLES rule already handles it.

The rest looks ok.

>  
>  static-dlopen-environment = \
>    LD_LIBRARY_PATH=$(ld-library-path):$(common-objpfx)dlfcn
> diff --git a/elf/dl-tunable-types.h b/elf/dl-tunable-types.h
> index f421c01c26..3506eee512 100644
> --- a/elf/dl-tunable-types.h
> +++ b/elf/dl-tunable-types.h
> @@ -65,6 +65,8 @@ struct _tunable
>    tunable_val_t val;			/* The value.  */
>    bool initialized;			/* Flag to indicate that the tunable is
>  					   initialized.  */
> +  bool locked;				/* If set, modifications are not
> +					   allowed.  */
>    /* Compatibility elements.  */
>    const char env_alias[TUNABLE_ALIAS_MAX]; /* The compatibility environment
>  					   variable name.  */
> diff --git a/elf/dl-tunables.c b/elf/dl-tunables.c
> index 197d940d38..d19c2358c1 100644
> --- a/elf/dl-tunables.c
> +++ b/elf/dl-tunables.c
> @@ -72,6 +72,9 @@ do_tunable_update_val (tunable_t *cur, const tunable_val_t *valp,
>  {
>    tunable_num_t val, min, max;
>  
> +  if (cur->locked)
> +    return;
> +
>    switch (cur->type.type_code)
>      {
>      case TUNABLE_TYPE_STRING:
> @@ -409,6 +412,12 @@ __tunables_init (char **envp, char **argv)
>  	    goto skip_due_to_filter;
>  	  }
>  
> +	  /* If the tunable is set here, any previously set
> +	     overridability flag is discarded.  We need to reset the
> +	     overridability flag here so we can change the tunable,
> +	     and may set it later if this tunable also locks it.  */
> +	  tunable_list[tid].locked = false;
> +
>  	  /* See if the parsed type matches the desired type.  */
>  	  if (tunable_list[tid].type.type_code == TUNABLE_TYPE_STRING)
>  	    {
> @@ -435,6 +444,12 @@ __tunables_init (char **envp, char **argv)
>  		}
>  	    }
>  
> +	  /* The overriability flag only applies to tunables
> +	     which aren't filtered out.  */
> +	  if ((tec->flags & TUNCONF_FLAG_OVERRIDABLE)
> +	      == TUNCONF_OVERRIDE_DENY)
> +	    tunable_list[tid].locked = true;
> +
>  	skip_due_to_filter:;
>  	}
>      }
> diff --git a/elf/tst-tunconf1.c b/elf/tst-tunconf1.c
> index c95a7cb8ba..74f596d913 100644
> --- a/elf/tst-tunconf1.c
> +++ b/elf/tst-tunconf1.c
> @@ -26,10 +26,30 @@ do_test (void)
>  {
>    size_t tcache_count = TUNABLE_GET_FULL (glibc, malloc, tcache_count, size_t, NULL);
>    size_t tcache_max = TUNABLE_GET_FULL (glibc, malloc, tcache_max, size_t, NULL);
> +  size_t perturb = TUNABLE_GET_FULL (glibc, malloc, perturb, size_t, NULL);
> +  size_t mmap_threshold = TUNABLE_GET_FULL (glibc, malloc, mmap_threshold, size_t, NULL);
> +  size_t trim_threshold = TUNABLE_GET_FULL (glibc, malloc, trim_threshold, size_t, NULL);
> +
>    printf("tcache count is %ld (should be 5, from env)\n", (long)tcache_count);
>    TEST_COMPARE ((long)tcache_count, 5);
>    printf("tcache max is %ld (should be 4, from /etc)\n", (long)tcache_max);
>    TEST_COMPARE ((long)tcache_max, 4);
> +
> +  /* This is set by the environment but blocked by the config.  */
> +  printf("perturb is %ld (should be 42, from /etc)\n",
> +	 (long)perturb);
> +  TEST_COMPARE ((long)perturb, 42);
> +
> +  /* This is blocked by the general config, enabled by filter, set in env.  */
> +  printf("mmap_threshold is %ld (should be 10002, from env)\n",
> +	 (long)mmap_threshold);
> +  TEST_COMPARE ((long)mmap_threshold, 10002);
> +
> +  /* This is allowed by the general config, blocked by filter, set in env.  */
> +  printf("trim_threshold is %ld (should be 10001, from filter)\n",
> +	 (long)trim_threshold);
> +  TEST_COMPARE ((long)trim_threshold, 10001);
> +
>    return 0;
>  }
>  
> diff --git a/elf/tst-tunconf1.root/etc/tunables.conf b/elf/tst-tunconf1.root/etc/tunables.conf
> index f373a67902..f708a8fce4 100644
> --- a/elf/tst-tunconf1.root/etc/tunables.conf
> +++ b/elf/tst-tunconf1.root/etc/tunables.conf
> @@ -8,7 +8,15 @@ $glibc.test_unsecure=1
>  # These are checked inside the test case
>  glibc.malloc.tcache_max=6
>  $glibc.malloc.tcache_count=3
> +
> +-glibc.malloc.perturb=42
> +-glibc.malloc.mmap_threshold=10000
> +overridable glibc.malloc.trim_threshold=10000
> +
>  [proc:/bin/ls]
>  glibc.malloc.tcache_max=7
> +
>  [proc:tst-tunconf1]
>  glibc.malloc.tcache_max=4
> ++glibc.malloc.mmap_threshold=10001
> +nonoverridable glibc.malloc.trim_threshold=10001
> diff --git a/elf/tunconf.c b/elf/tunconf.c
> index a5ca755abd..c27b50b1de 100644
> --- a/elf/tunconf.c
> +++ b/elf/tunconf.c
> @@ -194,34 +194,40 @@ add_tunable (char *line, const char *filename, int lineno)
>    /* Parse modifiers.  */
>    while (*line)
>      {
> -      if (strncmp (line, "overridable ", 13) == 0)
> +      int prefix_len;
> +
> +#define TUN_PREFIX(s)				\
> +      prefix_len = sizeof(s) - 1,			\
> +	strncmp (line, s " ", prefix_len + 1) == 0
> +
> +      if (TUN_PREFIX("overridable"))
>  	{
>  	  top = TOP_ALLOW;
>  	  /* The line++ below skips the space.  */
> -	  line += 12;
> +	  line += prefix_len;
>  	}
> -      else if (strncmp (line, "nonoverridable ", 16) == 0)
> +      else if (TUN_PREFIX ("nonoverridable"))
>  	{
>  	  top = TOP_DENY;
> -	  line += 15;
> +	  line += prefix_len;
>  	}
> -      else if (strncmp (line, "onlysecure ", 11) == 0)
> +      else if (TUN_PREFIX ("onlysecure"))
>  	{
>  	  exclude_nonsecure = 1;
>  	  exclude_secure = 0;
> -	  line += 10;
> +	  line += prefix_len;
>  	}
> -      else if (strncmp (line, "nonsecure ", 10) == 0)
> +      else if (TUN_PREFIX ("nonsecure"))
>  	{
>  	  exclude_secure = 1;
>  	  exclude_nonsecure = 0;
> -	  line += 9;
> +	  line += prefix_len;
>  	}
> -      else if (strncmp (line, "anysecure ", 10) == 0)
> +      else if (TUN_PREFIX ("anysecure"))
>  	{
>  	  exclude_secure = 0;
>  	  exclude_nonsecure = 0;
> -	  line += 9;
> +	  line += prefix_len;
>  	}
>        else switch (*line)
>  	{
> diff --git a/scripts/gen-tunables.awk b/scripts/gen-tunables.awk
> index 5d34075c16..7c832303db 100644
> --- a/scripts/gen-tunables.awk
> +++ b/scripts/gen-tunables.awk
> @@ -169,7 +169,7 @@ END {
>      n = indices[2];
>      m = indices[3];
>      printf ("  {TUNABLE_NAME_S(%s, %s, %s)", t, n, m)
> -    printf (", {TUNABLE_TYPE_%s, %s, %s}, {%s}, {%s}, false, %s},\n",
> +    printf (", {TUNABLE_TYPE_%s, %s, %s}, {%s}, {%s}, false, false, %s},\n",
>  	    types[t,n,m], minvals[t,n,m], maxvals[t,n,m], default_val[t,n,m],
>  	    default_val[t,n,m], env_alias[t,n,m]);
>    }
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.