From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-qk1-x72e.google.com (mail-qk1-x72e.google.com [IPv6:2607:f8b0:4864:20::72e]) by sourceware.org (Postfix) with ESMTPS id C6B50385481C for ; Thu, 14 Jan 2021 18:35:47 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org C6B50385481C Received: by mail-qk1-x72e.google.com with SMTP id c7so9236525qke.1 for ; Thu, 14 Jan 2021 10:35:47 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:to:references:from:autocrypt:cc:subject :message-id:date:user-agent:mime-version:in-reply-to :content-language:content-transfer-encoding; bh=NlNlm866SnqI90UB2Zm9ekrNXKvzbXABNX7vUGPbWQM=; b=AlYPCBR4ZlaJcRnWK9YvGtxi/rARympLiGDXb9MGfymhfefjjxEk9+JkGOcetWldDi 5I2n0S7233vrlntKOpXTfY8oYrRCwf1lHQZA2AViaePFuzg5TXVXprfvpCSJ6rYIdRCl kTmM3cQjM1EYPMNgJX/NsyFUcWAJVax+0951O8eIprY6nGljCkNvxVJCpUxpOLsjPlLw hvMwYSyGqMekTFY8nCW0qgv1WAihjxilwelFZQJyA/wyM9Zsq9WfBlKVDYHTv4woITPP iEh39Tpg5yVp6Myb1XXOiTvSLL9Vl+0j+ynvYMYvvysDc5LvYDuoX7kJDJeUIvMoIfdO ml1w== X-Gm-Message-State: AOAM53083VltKocrfVfhkmJ13fFOPHS517k6Mlgy6TKQf58VakSODHnu 7NffVz+WjJX8u58ZtyE2kdbicg== X-Google-Smtp-Source: ABdhPJxtCr0QQ74gvcbLLQmSiSjLdc2yOrP6AhzVWmtVBO6IOiHGTYNuIWwaXQGvnPfY4U/cL6kQHA== X-Received: by 2002:ae9:e411:: with SMTP id q17mr8591191qkc.287.1610649347217; Thu, 14 Jan 2021 10:35:47 -0800 (PST) Received: from [192.168.1.4] ([177.194.48.209]) by smtp.googlemail.com with ESMTPSA id j23sm3271410qtr.79.2021.01.14.10.35.45 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 14 Jan 2021 10:35:46 -0800 (PST) To: libc-alpha@sourceware.org, "H.J. Lu" References: <20201031154437.2689427-1-hjl.tools@gmail.com> <20201031154437.2689427-3-hjl.tools@gmail.com> From: Adhemerval Zanella Autocrypt: addr=adhemerval.zanella@linaro.org; prefer-encrypt=mutual; keydata= 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 Cc: Florian Weimer Subject: Re: V4 [PATCH 2/2] ld.so: Add --list-tunables to print tunable values Message-ID: <211802d5-3c89-b153-5854-4f72d3e60b39@linaro.org> Date: Thu, 14 Jan 2021 15:35:43 -0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 MIME-Version: 1.0 In-Reply-To: <20201031154437.2689427-3-hjl.tools@gmail.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-13.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, NICE_REPLY_A, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 14 Jan 2021 18:35:49 -0000 On 31/10/2020 12:44, H.J. Lu via Libc-alpha wrote: > Pass --list-tunables to ld.so to print tunables with min and max values. > --- > NEWS | 2 ++ > elf/Makefile | 8 ++++++++ > elf/dl-main.h | 2 +- > elf/dl-tunables.c | 36 ++++++++++++++++++++++++++++++++++++ > elf/dl-tunables.h | 2 ++ > elf/dl-usage.c | 7 ++++++- > elf/rtld.c | 23 +++++++++++++++++++++++ > manual/tunables.texi | 37 +++++++++++++++++++++++++++++++++++++ > 8 files changed, 115 insertions(+), 2 deletions(-) > > diff --git a/NEWS b/NEWS > index 4307c4b1b0..a62e7307ef 100644 > --- a/NEWS > +++ b/NEWS > @@ -9,6 +9,8 @@ Version 2.33 > > Major new features: > > +* Pass --list-tunables to ld.so to print tunable values. > + Maybe use a similar sentence as for argv0: * The dynamic linker accepts the --list-tunables argument which prints all the supported tunables. This option is disable is glibc is configured with tunables disabled (--enable-tunables=no). > * The dynamic linker accepts the --argv0 argument and provides opportunity > to change argv[0] string. > > diff --git a/elf/Makefile b/elf/Makefile > index f10cc59e7c..86b282a32b 100644 > --- a/elf/Makefile > +++ b/elf/Makefile > @@ -44,6 +44,10 @@ dl-routines += dl-tunables > tunables-type = $(addprefix TUNABLES_FRONTEND_,$(have-tunables)) > CPPFLAGS-dl-tunables.c += -DTUNABLES_FRONTEND=$(tunables-type) > > +ifeq (yesyes,$(build-shared)$(run-built-tests)) > +tests-special += $(objpfx)list-tunables.out > +endif > + > # Make sure that the compiler does not insert any library calls in tunables > # code paths. Ok, it is enabled iff 'ifneq (no,$(have-tunables))'. > ifeq (yes,$(have-loop-to-function)) > @@ -1812,3 +1816,7 @@ $(objpfx)argv0test.out: tst-rtld-argv0.sh $(objpfx)ld.so \ > '$(test-wrapper-env)' '$(run_program_env)' \ > '$(rpath-link)' 'test-argv0' > $@; \ > $(evaluate-test) > + > +$(objpfx)list-tunables.out: $(objpfx)ld.so > + $(objpfx)ld.so --list-tunables > $@; \ > + $(evaluate-test) Maybe at least check for a tunable with a default value which be equal to all architecture, like glibc.rtld.nns, glibc.malloc.perturb, etc? > diff --git a/elf/dl-main.h b/elf/dl-main.h > index b51256d3b4..f229867b8e 100644 > --- a/elf/dl-main.h > +++ b/elf/dl-main.h > @@ -63,7 +63,7 @@ struct audit_list > enum rtld_mode > { > rtld_mode_normal, rtld_mode_list, rtld_mode_verify, rtld_mode_trace, > - rtld_mode_help, > + rtld_mode_list_tunables, rtld_mode_help, > }; > > /* Aggregated state information extracted from environment variables Ok. > diff --git a/elf/dl-tunables.c b/elf/dl-tunables.c > index 2ba2844075..048601b704 100644 > --- a/elf/dl-tunables.c > +++ b/elf/dl-tunables.c > @@ -398,6 +398,42 @@ __tunables_init (char **envp) > } > } > > +void > +__tunables_print (void) > +{ > + for (int i = 0; i < sizeof (tunable_list) / sizeof (tunable_t); i++) Use array_length here. > + { > + tunable_t *cur = &tunable_list[i]; Maybe use a const modifier here. > + _dl_printf ("%s: ", cur->name); > + switch (cur->type.type_code) > + { > + case TUNABLE_TYPE_INT_32: > + _dl_printf ("%d (min: %d, max: %d)\n", > + (int) cur->val.numval, > + (int) cur->type.min, > + (int) cur->type.max); > + break; > + case TUNABLE_TYPE_UINT_64: > + _dl_printf ("0x%lx (min: 0x%lx, max: 0x%lx)\n", > + (long int) cur->val.numval, > + (long int) cur->type.min, > + (long int) cur->type.max); > + break; > + case TUNABLE_TYPE_SIZE_T: > + _dl_printf ("0x%Zx (min: 0x%Zx, max: 0x%Zx)\n", > + (size_t) cur->val.numval, > + (size_t) cur->type.min, > + (size_t) cur->type.max); > + break; > + case TUNABLE_TYPE_STRING: > + _dl_printf ("%s\n", cur->val.strval ? cur->val.strval : ""); > + break; > + default: > + __builtin_unreachable (); > + } > + } > +} > + Ok, it should be ok to use '%d' for signed and 'lx' for unsigned. > /* Set the tunable value. This is called by the module that the tunable exists > in. */ > void > diff --git a/elf/dl-tunables.h b/elf/dl-tunables.h > index 550b0cc7f4..4a0c90f3e0 100644 > --- a/elf/dl-tunables.h > +++ b/elf/dl-tunables.h > @@ -69,9 +69,11 @@ typedef struct _tunable tunable_t; > # include "dl-tunable-list.h" > > extern void __tunables_init (char **); > +extern void __tunables_print (void); > extern void __tunable_get_val (tunable_id_t, void *, tunable_callback_t); > extern void __tunable_set_val (tunable_id_t, void *, void *, void *); > rtld_hidden_proto (__tunables_init) > +rtld_hidden_proto (__tunables_print) > rtld_hidden_proto (__tunable_get_val) > rtld_hidden_proto (__tunable_set_val) > Ok. > diff --git a/elf/dl-usage.c b/elf/dl-usage.c > index 796ad38b43..3ce19fb892 100644 > --- a/elf/dl-usage.c > +++ b/elf/dl-usage.c > @@ -190,7 +190,12 @@ setting environment variables (which would be inherited by subprocesses).\n\ > in LIST\n\ > --audit LIST use objects named in LIST as auditors\n\ > --preload LIST preload objects named in LIST\n\ > - --argv0 STRING set argv[0] to STRING before running\n\ > + --argv0 STRING set argv[0] to STRING before running\n" > +#if HAVE_TUNABLES > +"\ > + --list-tunables list all tunables with minimum and maximum values\n" > +#endif > +"\ > --help display this help and exit\n\ > --version output version information and exit\n\ > \n\ Ok. > diff --git a/elf/rtld.c b/elf/rtld.c > index 5d117d0d2c..33993a6f8b 100644 > --- a/elf/rtld.c > +++ b/elf/rtld.c > @@ -49,6 +49,10 @@ > #include > #include > > +#if HAVE_TUNABLES > +# include > +#endif > + You can include this header regadless of HAVE_TUNABLES (it handles it internally). > #include > > /* Only enables rtld profiling for architectures which provides non generic > @@ -1248,6 +1252,16 @@ dl_main (const ElfW(Phdr) *phdr, > _dl_argc -= 2; > _dl_argv += 2; > } > +#if HAVE_TUNABLES > + else if (! strcmp (_dl_argv[1], "--list-tunables")) > + { > + state.mode = rtld_mode_list_tunables; > + > + ++_dl_skip_args; > + --_dl_argc; > + ++_dl_argv; > + } > +#endif > else if (strcmp (_dl_argv[1], "--help") == 0) > { > state.mode = rtld_mode_help; > @@ -1268,6 +1282,15 @@ dl_main (const ElfW(Phdr) *phdr, > else > break; > > +#if HAVE_TUNABLES > + if (__builtin_expect (state.mode, rtld_mode_normal) > + == rtld_mode_list_tunables) Use if (__glibc_unlikely (state.mode == rtld_mode_list_tunables) > + { > + __tunables_print (); > + _exit (0); > + } > +#endif > + > /* If we have no further argument the program was called incorrectly. > Grant the user some education. */ > if (_dl_argc < 2) > diff --git a/manual/tunables.texi b/manual/tunables.texi > index d72d7a5ec0..924dac8876 100644 > --- a/manual/tunables.texi > +++ b/manual/tunables.texi > @@ -28,6 +28,43 @@ Finally, the set of tunables available may vary between distributions as > the tunables feature allows distributions to add their own tunables under > their own namespace. > > +Passing @option{--list-tunables} to the dynamic loader to print all > +tunables with minimum and maximum values: > + > +@example > +$ /lib64/ld-linux-x86-64.so.2 --list-tunables > +glibc.rtld.nns: 0x4 (min: 0x1, max: 0x10) > +glibc.elision.skip_lock_after_retries: 3 (min: -2147483648, max: 2147483647) > +glibc.malloc.trim_threshold: 0x0 (min: 0x0, max: 0xffffffffffffffff) > +glibc.malloc.perturb: 0 (min: 0, max: 255) > +glibc.cpu.x86_shared_cache_size: 0x100000 (min: 0x0, max: 0xffffffffffffffff) > +glibc.elision.tries: 3 (min: -2147483648, max: 2147483647) > +glibc.elision.enable: 0 (min: 0, max: 1) > +glibc.cpu.x86_rep_movsb_threshold: 0x800 (min: 0x100, max: 0xffffffffffffffff) > +glibc.malloc.mxfast: 0x0 (min: 0x0, max: 0xffffffffffffffff) > +glibc.elision.skip_lock_busy: 3 (min: -2147483648, max: 2147483647) > +glibc.malloc.top_pad: 0x0 (min: 0x0, max: 0xffffffffffffffff) > +glibc.cpu.x86_rep_stosb_threshold: 0x800 (min: 0x1, max: 0xffffffffffffffff) > +glibc.cpu.x86_non_temporal_threshold: 0xc0000 (min: 0x0, max: 0xffffffffffffffff) > +glibc.cpu.x86_shstk: Trailing whitespace. > +glibc.cpu.hwcap_mask: 0x6 (min: 0x0, max: 0xffffffffffffffff) > +glibc.malloc.mmap_max: 0 (min: -2147483648, max: 2147483647) > +glibc.elision.skip_trylock_internal_abort: 3 (min: -2147483648, max: 2147483647) > +glibc.malloc.tcache_unsorted_limit: 0x0 (min: 0x0, max: 0xffffffffffffffff) > +glibc.cpu.x86_ibt: Ditto. > +glibc.cpu.hwcaps: Ditto. > +glibc.elision.skip_lock_internal_abort: 3 (min: -2147483648, max: 2147483647) > +glibc.malloc.arena_max: 0x0 (min: 0x1, max: 0xffffffffffffffff) > +glibc.malloc.mmap_threshold: 0x0 (min: 0x0, max: 0xffffffffffffffff) > +glibc.cpu.x86_data_cache_size: 0x8000 (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: 100 (min: 0, max: 32767) > +glibc.rtld.optional_static_tls: 0x200 (min: 0x0, max: 0xffffffffffffffff) > +glibc.malloc.tcache_max: 0x0 (min: 0x0, max: 0xffffffffffffffff) > +glibc.malloc.check: 0 (min: 0, max: 3) > +@end example > + > @menu > * Tunable names:: The structure of a tunable name > * Memory Allocation Tunables:: Tunables in the memory allocation subsystem >