On Mon, Jun 1, 2020 at 7:08 PM Carlos O'Donell wrote: > > On Mon, Jun 1, 2020 at 6:44 PM H.J. Lu wrote: > > Tunables are designed to pass info from user to glibc, not the other > > way around. When __libc_main is called, init_cacheinfo is never > > called. I can call init_cacheinfo from __libc_main. But there is no > > interface to update min and max values from init_cacheinfo. I don't > > think --list-tunables will work here without changes to tunables. > > You have a dynamic threshold. > > You have to tell the user what that minimum is, otherwise they can't > use the tunable reliably. > > This is the first instance of a min/max that is dynamically determined. > > You must fetch the cache info ahead of the tunable initialization, that > is you must call init_cacheinfo before __init_tunables. > > You can initialize the tunable data dynamically like this: > > /* Dynamically set the min and max of glibc.foo.bar. */ > tunable_id_t id = TUNABLE_ENUM_NAME (glibc, foo, bar); > tunable_list[id].type.min = lowval; > tunable_list[id].type.max = highval; > > We do something similar for maybe_enable_malloc_check. > > Then once the tunables are parsed, and the cpu features are loaded > you can print the tunables, and the printed tunables will have meaningful > min and max values. > > If you have circular dependency, then you must process the cpu features > first without reading from the tunables, then allow the tunables to be > initialized from the system, *then* process the tunables to alter the existing > cpu feature settings. > How about this? I got [hjl@gnu-cfl-2 build-x86_64-linux]$ ./elf/ld.so ./libc.so --list-tunables tunables: glibc.elision.skip_lock_after_retries: 0x3 (min: 0x80000000, max: 0x7fffffff) glibc.malloc.trim_threshold: 0x0 (min: 0x0, max: 0xffffffffffffffff) glibc.malloc.perturb: 0x0 (min: 0x0, max: 0xff) glibc.cpu.x86_shared_cache_size: 0x0 (min: 0x0, max: 0xffffffffffffffff) glibc.elision.tries: 0x3 (min: 0x80000000, max: 0x7fffffff) glibc.elision.enable: 0x0 (min: 0x0, max: 0x1) glibc.cpu.x86_rep_movsb_threshold: 0x1000 (min: 0x100, max: 0xffffffffffffffff) glibc.malloc.mxfast: 0x0 (min: 0x0, max: 0xffffffffffffffff) glibc.elision.skip_lock_busy: 0x3 (min: 0x80000000, max: 0x7fffffff) glibc.malloc.top_pad: 0x0 (min: 0x0, max: 0xffffffffffffffff) glibc.cpu.x86_rep_stosb_threshold: 0x800 (min: 0x0, max: 0xffffffffffffffff) glibc.cpu.x86_non_temporal_threshold: 0x600000 (min: 0x0, max: 0xffffffffffffffff) glibc.cpu.x86_shstk: glibc.cpu.hwcap_mask: 0x6 (min: 0x0, max: 0xffffffffffffffff) glibc.malloc.mmap_max: 0x0 (min: 0x80000000, max: 0x7fffffff) glibc.elision.skip_trylock_internal_abort: 0x3 (min: 0x80000000, max: 0x7fffffff) glibc.malloc.tcache_unsorted_limit: 0x0 (min: 0x0, max: 0xffffffffffffffff) glibc.cpu.x86_ibt: glibc.cpu.hwcaps: glibc.elision.skip_lock_internal_abort: 0x3 (min: 0x80000000, max: 0x7fffffff) glibc.malloc.arena_max: 0x0 (min: 0x1, max: 0xffffffffffffffff) glibc.malloc.mmap_threshold: 0x0 (min: 0x0, max: 0xffffffffffffffff) glibc.cpu.x86_data_cache_size: 0x0 (min: 0x0, max: 0xffffffffffffffff) glibc.malloc.tcache_count: 0x0 (min: 0x0, max: 0xffffffffffffffff) glibc.malloc.arena_test: 0x0 (min: 0x1, max: 0xffffffffffffffff) glibc.pthread.mutex_spin_count: 0x64 (min: 0x0, max: 0x7fff) glibc.malloc.tcache_max: 0x0 (min: 0x0, max: 0xffffffffffffffff) glibc.malloc.check: 0x0 (min: 0x0, max: 0x3) [hjl@gnu-cfl-2 build-x86_64-linux]$ -- H.J.