From patchwork Wed Sep 27 19:08:26 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Rogers X-Patchwork-Id: 76809 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 398AF38618A7 for ; Wed, 27 Sep 2023 19:09:06 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by sourceware.org (Postfix) with ESMTPS id D22DD3858C41 for ; Wed, 27 Sep 2023 19:08:51 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org D22DD3858C41 Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Received: by mail-yb1-xb49.google.com with SMTP id 3f1490d57ef6-d84acda47aeso20053626276.3 for ; Wed, 27 Sep 2023 12:08:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1695841731; x=1696446531; darn=sourceware.org; h=cc:to:from:subject:mime-version:message-id:date:from:to:cc:subject :date:message-id:reply-to; bh=gH+WJoaoluYiC4tGNwUyG6fvogT6TErTJxZKEGWbdxI=; b=E8iyam2JMhIvlVZzBxJCNuH2FoIX7yrbLaSqYQtLp052e7O7yesk8o295FFL6zEHis EgA+RU2J8uG7njPRPpTaNHlQiknvOryRFIawOoduD/zdyJZzbntY86YdNJghcgu+1MB0 O6Szga6RaS0h2zwfluE/2491I/uE7dPnMUs01je6s5rkXVnrj3GKQFGToucrJMU4Pzjv x0/2iIsz3+3wvp2TDXFSqX5uA1G3VAiheAibQ5hzhwczzdesx86X40TVSM+tJ3I4j+Rj jP7tP2D2lPLcovyDHl6gL0ajs4NnQiibeFGT4zLgBsZ3YPlZb3Cd8KwqAVQu/9FwaUiT waOQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695841731; x=1696446531; h=cc:to:from:subject:mime-version:message-id:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=gH+WJoaoluYiC4tGNwUyG6fvogT6TErTJxZKEGWbdxI=; b=oksf7uZoJ7Q+w03Rwoxy5MUz1sQn7t9L1hQ/CZfW8AePPraOZYRmcYWdfEa7KEs94K Pl1rAOmf+R1KSkeem3VBREsTM8Hs8fyTIn0j8ysaiXkwDftEZT0+A0csYqXZrLpgkEMD sk7DhAV+B5aymDfe3uUDY12MOB4TenjtKd/Tf7H85SGeXtjc3fCs+tWeL1h4I1rUHV/0 qDNeK1/t+HX6f2BBUgzZNuIiaILIINTGEgXIw4yRFq1qAY/CSO9EMvuN5W7XXxtC5mnw ZuMvAhBSuK06HHQ8A9cqZAq3PRTpGutKEphRExUhcySoxgslyGbhXZtQN5c/90Q/snuo YWBg== X-Gm-Message-State: AOJu0YxqnT9/I2ROK8clWPJDYb8LQ8EAar9PvLbdnxTGMwyQsaHAkIXg TipoT4DsvVR08N8jKUNYG2/PzcozkSrJXVoVlLPQ664Z0gyoUOPRyk7/YQoq/ODd7XIm+VsrVf4 0LijJkzkTuA+xIj1JXA/T8XpZ94bbH04vwE+z/VQ90SOdlnf9tJFrlFrXkbulXppUCQ+L X-Google-Smtp-Source: AGHT+IH6pbXuf5sAxsNRUhQ+WqKprrB6JhG+EL0BVFdJ9FYxRsl1BIXKOerHHIBTfiYsMshqNg+U8H4jcBpv X-Received: from irogers.svl.corp.google.com ([2620:15c:2a3:200:247a:7324:7470:3619]) (user=irogers job=sendgmr) by 2002:a25:cc57:0:b0:d4d:8ade:4dfa with SMTP id l84-20020a25cc57000000b00d4d8ade4dfamr43124ybf.1.1695841731131; Wed, 27 Sep 2023 12:08:51 -0700 (PDT) Date: Wed, 27 Sep 2023 12:08:26 -0700 Message-Id: <20230927190826.1805917-1-irogers@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.42.0.515.g380fc7ccd1-goog Subject: [RFC PATCH] pthread_create: Name stacks in /proc//maps From: Ian Rogers To: libc-alpha@sourceware.org, Adhemerval Zanella Netto Cc: Ian Rogers X-Spam-Status: No, score=-21.5 required=5.0 tests=BAYES_00, DKIMWL_WL_MED, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Linux 4.5 removed thread stack annotations due to the complexity of computing them: https://github.com/torvalds/linux/commit/65376df582174ffcec9e6471bf5b0dd79ba05e4a This untested (other than building) RFC patch uses PR_SET_VMA_ANON_NAME to name stacks again as part of thread creation. PR_SET_VMA_ANON_NAME was added in Linux 5.17: https://github.com/torvalds/linux/commit/9a10064f5625d5572c3626c1516e0bebc6c9fe9b The patch is intended to create discussion and possibly serve as an implementation. When I try to test it current I get unrelated failures and so guidance would be appreciated. The naming of stacks can be useful in situations like debugging and profiling, for example, to differentiate stack from heap memory accesses. --- include/sys/prctl.h | 5 +++++ nptl/allocatestack.c | 24 ++++++++++++++++++++++++ nptl/pthread_create.c | 5 +++++ 3 files changed, 34 insertions(+) diff --git a/include/sys/prctl.h b/include/sys/prctl.h index d33f3a290e..8968a632d3 100644 --- a/include/sys/prctl.h +++ b/include/sys/prctl.h @@ -3,6 +3,11 @@ # ifndef _ISOMAC +# ifndef PR_SET_VMA +# define PR_SET_VMA 0x53564d41 +# define PR_SET_VMA_ANON_NAME 0 +# endif + extern int __prctl (int __option, ...); libc_hidden_proto (__prctl) diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c index f9d8cdfd08..60ad5c18b0 100644 --- a/nptl/allocatestack.c +++ b/nptl/allocatestack.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -33,6 +34,7 @@ #include #include #include +#include "intprops.h" /* Default alignment of stack. */ #ifndef STACK_ALIGN @@ -577,3 +579,25 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, return 0; } + +/* Use PR_SET_VMA_ANON_NAME to name the thread's stack stack: */ +static void +name_stack_maps (struct pthread *pd, bool set) +{ + void *stack = THREAD_GETMEM (pd, stackblock); + size_t stacksize = THREAD_GETMEM (pd, stackblock_size); + + if (!set) + __prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, stack, stacksize, NULL); + else + { +#define STACK_MAPS_PREFIX "stack:" + char stack_name[sizeof(STACK_MAPS_PREFIX) + + INT_BUFSIZE_BOUND(unsigned int)]; + + __snprintf(stack_name, sizeof(stack_name), STACK_MAPS_PREFIX "%u", + (unsigned int)THREAD_GETMEM (pd, tid)); + __prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, stack, stacksize, stack_name); +#undef STACK_MAPS_PREFIX + } +} diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c index 6a41d50109..7249513a80 100644 --- a/nptl/pthread_create.c +++ b/nptl/pthread_create.c @@ -369,6 +369,9 @@ start_thread (void *arg) /* Initialize pointers to locale data. */ __ctype_init (); + /* Set up /proc//maps entry for stack to stack:tid. */ + name_stack_maps (pd, true); + /* Register rseq TLS to the kernel. */ { bool do_rseq = THREAD_GETMEM (pd, flags) & ATTR_FLAG_DO_RSEQ; @@ -571,6 +574,8 @@ start_thread (void *arg) /* Free the TCB. */ __nptl_free_tcb (pd); + /* Release name for /proc//maps. */ + name_stack_maps (pd, false); out: /* We cannot call '_exit' here. '_exit' will terminate the process.