diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2020-06-01 14:11:32 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2020-09-29 09:03:47 -0700 |
commit | dfb8e514cf4d770a9ce4e7858a351b9a2893614d (patch) | |
tree | c6d59af2a286ae6a241c23ce26be7d97223741d3 /elf/dl-tunables.c | |
parent | c6702789344043fa998923c8f32ed0bdb2edfa9c (diff) | |
download | glibc-dfb8e514cf4d770a9ce4e7858a351b9a2893614d.zip glibc-dfb8e514cf4d770a9ce4e7858a351b9a2893614d.tar.gz glibc-dfb8e514cf4d770a9ce4e7858a351b9a2893614d.tar.bz2 |
Set tunable value as well as min/max values
Some tunable values and their minimum/maximum values must be determinted
at run-time. Add TUNABLE_SET_WITH_BOUNDS and TUNABLE_SET_WITH_BOUNDS_FULL
to update tunable value together with minimum and maximum values.
__tunable_set_val is updated to set tunable value as well as min/max
values.
Diffstat (limited to 'elf/dl-tunables.c')
-rw-r--r-- | elf/dl-tunables.c | 45 |
1 files changed, 41 insertions, 4 deletions
diff --git a/elf/dl-tunables.c b/elf/dl-tunables.c index 26e6e26..2ba2844 100644 --- a/elf/dl-tunables.c +++ b/elf/dl-tunables.c @@ -100,8 +100,42 @@ get_next_env (char **envp, char **name, size_t *namelen, char **val, } \ }) +#define TUNABLE_SET_BOUNDS_IF_VALID(__cur, __minp, __maxp, __type) \ +({ \ + if (__minp != NULL) \ + { \ + /* MIN is specified. */ \ + __type min = *((__type *) __minp); \ + if (__maxp != NULL) \ + { \ + /* Both MIN and MAX are specified. */ \ + __type max = *((__type *) __maxp); \ + if (max >= min \ + && max <= (__cur)->type.max \ + && min >= (__cur)->type.min) \ + { \ + (__cur)->type.min = min; \ + (__cur)->type.max = max; \ + } \ + } \ + else if (min > (__cur)->type.min && min <= (__cur)->type.max) \ + { \ + /* Only MIN is specified. */ \ + (__cur)->type.min = min; \ + } \ + } \ + else if (__maxp != NULL) \ + { \ + /* Only MAX is specified. */ \ + __type max = *((__type *) __maxp); \ + if (max < (__cur)->type.max && max >= (__cur)->type.min) \ + (__cur)->type.max = max; \ + } \ +}) + static void -do_tunable_update_val (tunable_t *cur, const void *valp) +do_tunable_update_val (tunable_t *cur, const void *valp, + const void *minp, const void *maxp) { uint64_t val; @@ -112,16 +146,19 @@ do_tunable_update_val (tunable_t *cur, const void *valp) { case TUNABLE_TYPE_INT_32: { + TUNABLE_SET_BOUNDS_IF_VALID (cur, minp, maxp, int64_t); TUNABLE_SET_VAL_IF_VALID_RANGE (cur, val, int64_t); break; } case TUNABLE_TYPE_UINT_64: { + TUNABLE_SET_BOUNDS_IF_VALID (cur, minp, maxp, uint64_t); TUNABLE_SET_VAL_IF_VALID_RANGE (cur, val, uint64_t); break; } case TUNABLE_TYPE_SIZE_T: { + TUNABLE_SET_BOUNDS_IF_VALID (cur, minp, maxp, uint64_t); TUNABLE_SET_VAL_IF_VALID_RANGE (cur, val, uint64_t); break; } @@ -153,15 +190,15 @@ tunable_initialize (tunable_t *cur, const char *strval) cur->initialized = true; valp = strval; } - do_tunable_update_val (cur, valp); + do_tunable_update_val (cur, valp, NULL, NULL); } void -__tunable_set_val (tunable_id_t id, void *valp) +__tunable_set_val (tunable_id_t id, void *valp, void *minp, void *maxp) { tunable_t *cur = &tunable_list[id]; - do_tunable_update_val (cur, valp); + do_tunable_update_val (cur, valp, minp, maxp); } #if TUNABLES_FRONTEND == TUNABLES_FRONTEND_valstring |