From patchwork Sat Oct 17 01:02:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 40742 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 2D22C3897004; Sat, 17 Oct 2020 01:02:15 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2D22C3897004 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1602896535; bh=qRHbZ3p2CQyi8o1CYYihL9TsAgk6Yybi6KwBdB2h21A=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=NMj4GWEsojrNdPed3XiWQqBt+hbN4iy5izmV9TCTwTn5uDeZltfDuTzNGDbuBznda puGVEa12uoTXFKKeozSsY+mPO9oMMPjAic9N8Y9TxeinwY6FxEFah5q4CgwKRhRQxc 3/VgyMEsSyMA6JmeTVClTXHP5qUAaH3LQu96+7M8= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pj1-x1044.google.com (mail-pj1-x1044.google.com [IPv6:2607:f8b0:4864:20::1044]) by sourceware.org (Postfix) with ESMTPS id E28B038618F9 for ; Sat, 17 Oct 2020 01:02:11 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org E28B038618F9 Received: by mail-pj1-x1044.google.com with SMTP id a17so2262691pju.1 for ; Fri, 16 Oct 2020 18:02:11 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=qRHbZ3p2CQyi8o1CYYihL9TsAgk6Yybi6KwBdB2h21A=; b=GQjy+bJsSc77ZINeKpBXutBR7ZqKlsitSjEvWFN4gCZmNJZz3z1GWrzbwmNWuU78kH /hWJ1N63YA5mDz9BiF0crdLg1Ah5mPPahrD31E1hXl0AnvUAcOdKQI704QxlDb3smxGi 2/W/PK5epjWFPXTxvborHChpKjblYVADsCwBqftfHk3Uz0eU/yMhmb0APl1nuKruVTOH 5B5uihk+DE6GO5mokvVdejNKasSV7H24XTchNiQxdI/ppn7o1xNf6J+Y90hR5ll/9TYA i4jR4ujeGV3g7tfp+nnnxIAhvbShYNnD/cJsH1x7bgN/dHh7tv8+VL2LkCsarSf75FpZ mExA== X-Gm-Message-State: AOAM530gfMGnTGb7QAc1NtY7IC25fiiRnWbybfvW3LiehUSGjJ+vntOq c/9CjMJlxece3BbJbDfiX7Q= X-Google-Smtp-Source: ABdhPJyHW/X23rMFG6Iqde5+Xc5L4qaTxOjIdF9+kAp3tfw/ViR3LRDH6m4zIk6TXb/463hwVRLivg== X-Received: by 2002:a17:90a:a008:: with SMTP id q8mr6658334pjp.211.1602896531009; Fri, 16 Oct 2020 18:02:11 -0700 (PDT) Received: from gnu-cfl-2.localdomain (c-69-181-90-243.hsd1.ca.comcast.net. [69.181.90.243]) by smtp.gmail.com with ESMTPSA id u4sm2069694pjy.19.2020.10.16.18.02.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Oct 2020 18:02:09 -0700 (PDT) Received: from gnu-cfl-2.localdomain (localhost [IPv6:::1]) by gnu-cfl-2.localdomain (Postfix) with ESMTP id F0DC01A0155; Fri, 16 Oct 2020 18:02:07 -0700 (PDT) To: libc-alpha@sourceware.org Subject: V3 [PATCH 2/2] ld.so: Add --list-tunables to print tunable values Date: Fri, 16 Oct 2020 18:02:07 -0700 Message-Id: <20201017010207.6074-3-hjl.tools@gmail.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20201017010207.6074-1-hjl.tools@gmail.com> References: <20201017010207.6074-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3041.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, 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-Patchwork-Original-From: "H.J. Lu via Libc-alpha" From: "H.J. Lu" Reply-To: "H.J. Lu" Cc: Florian Weimer Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" 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 6eb577a669..fed8d87313 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. + * 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. 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) 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 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++) + { + tunable_t *cur = &tunable_list[i]; + _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 (); + } + } +} + /* 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) 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\ 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 + #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) + { + __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: +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: +glibc.cpu.hwcaps: +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