From patchwork Sun Jul 12 14:24:46 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: 40041 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 94401385701F; Sun, 12 Jul 2020 14:24:52 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 94401385701F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1594563892; bh=Fw+FaD+3h5l9ZjwwBWYf1i6d5opyWLYmDQpGaP74obo=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=f18xsF/kNe2OzIgEmup++gHAMd9lyho2PDv2O1n6v8s6YjEstpDt+IU4/gni5UFap 4gqevJqAaMtI9jen4D84oVmO5joXKIGr7P9/QyAZfU2e6aAo8yWI68b2L4iTLeWdPD CQvzI30Azgnp5IbkHug/rpS6gQPZBh5Wq3x+2uR4= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pf1-x442.google.com (mail-pf1-x442.google.com [IPv6:2607:f8b0:4864:20::442]) by sourceware.org (Postfix) with ESMTPS id 41A573857C5F for ; Sun, 12 Jul 2020 14:24:49 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 41A573857C5F Received: by mail-pf1-x442.google.com with SMTP id x72so4827810pfc.6 for ; Sun, 12 Jul 2020 07:24:49 -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:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Fw+FaD+3h5l9ZjwwBWYf1i6d5opyWLYmDQpGaP74obo=; b=EJnob3l9UlCkMzXNkAmvHUEU60XHMTMMoa9nKCNwdlUKHcPuC+ULcbkFeTRSCt2ICW jBRtMXHY0UvPP2LFFb7NSQeiutwNhdBReN/4+5JJJFufu7Tr7pr9vF03zXM84WotPEiq AFBB5TGDPidfb3RRZ0mAmqTwLlDLBS788Gh3YlPuFFBwG4oQBv3B1vUNgMWpGkfLbFSS cVfD00sXf7dAU4qTZqeQ/JEy2aoUF4RK0i9Wr81+UM5INHelPe2dcqt59IGkdwHXWIjB s2eA3i/pfJjaZV6tGUzpH8pBKpomqJzT/cOl37B3lnx6Fp8zNC6wRadonhC2VULki0I7 tdsg== X-Gm-Message-State: AOAM532siqHo0WiXFm/Pxn7SjMs7AFV4n4THGvToBbk4IvOV7KG274qB aao/S8a5m7TZPd3Rlab9xQioZOg/ljI= X-Google-Smtp-Source: ABdhPJwnmLK6UEZIEHVMW5rt6nPFG4pEKzfCJicTYDCezXRY+Np6fZKzuUF5zdfCK8TzrfDW6ExsDQ== X-Received: by 2002:a05:6a00:5c:: with SMTP id i28mr55044478pfk.274.1594563888089; Sun, 12 Jul 2020 07:24:48 -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 a2sm11445804pgf.53.2020.07.12.07.24.47 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Jul 2020 07:24:47 -0700 (PDT) Received: from gnu-cfl-2.localdomain (localhost [IPv6:::1]) by gnu-cfl-2.localdomain (Postfix) with ESMTP id 7D1471A0267 for ; Sun, 12 Jul 2020 07:24:46 -0700 (PDT) To: libc-alpha@sourceware.org Subject: [PATCH 3/3] ld.so: Add --list-tunables to print tunable values Date: Sun, 12 Jul 2020 07:24:46 -0700 Message-Id: <20200712142446.2184885-4-hjl.tools@gmail.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200712142446.2184885-1-hjl.tools@gmail.com> References: <20200712142446.2184885-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-12.8 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" Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" Pass --list-tunables to ld.so to print tunables with min and max values. --- elf/Makefile | 6 +++++- elf/dl-tunables.c | 36 ++++++++++++++++++++++++++++++++++++ elf/dl-tunables.h | 2 ++ elf/rtld.c | 37 +++++++++++++++++++++++++++++++++++-- manual/tunables.texi | 37 +++++++++++++++++++++++++++++++++++++ 5 files changed, 115 insertions(+), 3 deletions(-) diff --git a/elf/Makefile b/elf/Makefile index a2c3b12007..b70ea3c834 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -414,7 +414,7 @@ endif ifeq (yes,$(build-shared)) ifeq ($(run-built-tests),yes) tests-special += $(objpfx)tst-pathopt.out $(objpfx)tst-rtld-load-self.out \ - $(objpfx)tst-rtld-preload.out + $(objpfx)tst-rtld-preload.out $(objpfx)list-tunables.out endif tests-special += $(objpfx)check-textrel.out $(objpfx)check-execstack.out \ $(objpfx)check-wx-segment.out \ @@ -962,6 +962,10 @@ $(objpfx)tst-rtld-preload.out: tst-rtld-preload.sh $(objpfx)ld.so \ '$(rpath-link)' '$(tst-rtld-preload-OBJS)' > $@; \ $(evaluate-test) +$(objpfx)list-tunables.out: $(objpfx)ld.so + $(objpfx)ld.so --list-tunables > $@; \ + $(evaluate-test) + $(objpfx)initfirst: $(libdl) $(objpfx)initfirst.out: $(objpfx)firstobj.so diff --git a/elf/dl-tunables.c b/elf/dl-tunables.c index b44174fe71..53226ef258 100644 --- a/elf/dl-tunables.c +++ b/elf/dl-tunables.c @@ -368,6 +368,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 b1add3184f..a2c728f0dd 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/rtld.c b/elf/rtld.c index 5b882163fa..705bca504f 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -48,6 +48,10 @@ #include #include +#if HAVE_TUNABLES +# include +#endif + #include /* Only enables rtld profiling for architectures which provides non generic @@ -168,7 +172,7 @@ static void audit_list_add_dynamic_tag (struct audit_list *, static const char *audit_list_next (struct audit_list *); /* This is a list of all the modes the dynamic loader can be in. */ -enum mode { normal, list, verify, trace }; +enum mode { normal, list, verify, trace, list_tunables }; /* Process all environments variables the dynamic linker must recognize. Since all of them start with `LD_' we are a bit smarter while finding @@ -1263,13 +1267,37 @@ dl_main (const ElfW(Phdr) *phdr, _dl_argc -= 2; _dl_argv += 2; } +#if HAVE_TUNABLES + else if (! strcmp (_dl_argv[1], "--list-tunables")) + { + mode = list_tunables; + + ++_dl_skip_args; + --_dl_argc; + ++_dl_argv; + } +#endif else break; +#if HAVE_TUNABLES + if (__builtin_expect (mode, normal) == 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) - _dl_fatal_printf ("\ + { +#if HAVE_TUNABLES + _dl_printf +#else + _dl_fatal_printf +#endif + ("\ Usage: ld.so [OPTION]... EXECUTABLE-FILE [ARGS-FOR-PROGRAM...]\n\ You have invoked `ld.so', the helper program for shared library executables.\n\ This program usually lives in the file `/lib/ld.so', and special directives\n\ @@ -1293,6 +1321,11 @@ of this helper program; chances are you did not intend to run this program.\n\ in LIST\n\ --audit LIST use objects named in LIST as auditors\n\ --preload LIST preload objects named in LIST\n"); +#if HAVE_TUNABLES + _dl_fatal_printf ("\ + --list-tunables list all tunables with minimum and maximum values\n"); +#endif + } ++_dl_skip_args; --_dl_argc; diff --git a/manual/tunables.texi b/manual/tunables.texi index 23ef0d40e7..38c8578229 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: 0x600000 (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