From: "Derrick Stolee via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: gitster@pobox.com, Taylor Blau <ttaylorr@openai.com>,
Derrick Stolee <stolee@gmail.com>,
Derrick Stolee <stolee@gmail.com>
Subject: [PATCH v2 6/7] trace2: remove use of ALLOC_GROW()
Date: Tue, 25 Aug 2026 18:56:20 +0000 [thread overview]
Message-ID: <120cf1967bde4e719a781c391b285c718553ad58.1787684181.git.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.2178.v2.git.1787684181.gitgitgadget@gmail.com>
From: Derrick Stolee <stolee@gmail.com>
The ALLOC_GROW() helper can call die() on a failed memory allocation.
We need to remove this from the trace2 API code to prevent a recursive
die() handler.
This helper is used to track the nested region stack. Use a new
skipped_regions member to track how many times a region was entered
without being added to the stack, and decrease that amount as we leave
each region. This allows us to avoid a failure and instead stop
deepening the stack, giving as much nesting behavior as possible without
failing the entire process.
Signed-off-by: Derrick Stolee <stolee@gmail.com>
---
banned-die.h | 3 +++
trace2/tr2_tls.c | 34 +++++++++++++++++++++++++++++++++-
trace2/tr2_tls.h | 1 +
3 files changed, 37 insertions(+), 1 deletion(-)
diff --git a/banned-die.h b/banned-die.h
index 14aecfdc7a..423e7b607d 100644
--- a/banned-die.h
+++ b/banned-die.h
@@ -23,4 +23,7 @@
#undef ALLOC_ARRAY
#define ALLOC_ARRAY(x, alloc) BANNED(ALLOC_ARRAY)
+#undef ALLOC_GROW
+#define ALLOC_GROW(x, nr, alloc) BANNED(ALLOC_GROW)
+
#endif /* BANNED_DIE_H */
diff --git a/trace2/tr2_tls.c b/trace2/tr2_tls.c
index ae2d39d2f5..8596292a94 100644
--- a/trace2/tr2_tls.c
+++ b/trace2/tr2_tls.c
@@ -108,8 +108,33 @@ void tr2tls_unset_self(void)
void tr2tls_push_self(uint64_t us_now)
{
struct tr2tls_thread_ctx *ctx = tr2tls_get_self();
+ uint64_t *new_array;
+ size_t new_alloc;
+
+ if (ctx->nr_skipped_regions) {
+ ctx->nr_skipped_regions++;
+ return;
+ }
+
+ if (ctx->nr_open_regions < ctx->alloc)
+ return;
+
+ if (ctx->alloc > SIZE_MAX / (2 * sizeof(*ctx->array_us_start))) {
+ ctx->nr_skipped_regions++;
+ return;
+ }
+ new_alloc = ctx->alloc * 2;
+
+ new_array = realloc(ctx->array_us_start,
+ new_alloc * sizeof(*ctx->array_us_start));
+ if (!new_array) {
+ ctx->nr_skipped_regions++;
+ return;
+ }
+
+ ctx->array_us_start = new_array;
+ ctx->alloc = new_alloc;
- ALLOC_GROW(ctx->array_us_start, ctx->nr_open_regions + 1, ctx->alloc);
ctx->array_us_start[ctx->nr_open_regions++] = us_now;
}
@@ -117,6 +142,11 @@ void tr2tls_pop_self(void)
{
struct tr2tls_thread_ctx *ctx = tr2tls_get_self();
+ if (ctx->nr_skipped_regions) {
+ ctx->nr_skipped_regions--;
+ return;
+ }
+
if (!ctx->nr_open_regions)
BUG("no open regions in thread '%s'", ctx->thread_name);
@@ -137,6 +167,8 @@ uint64_t tr2tls_region_elasped_self(uint64_t us)
uint64_t us_start;
ctx = tr2tls_get_self();
+ if (ctx->nr_skipped_regions)
+ return 0;
if (!ctx->nr_open_regions)
return 0;
diff --git a/trace2/tr2_tls.h b/trace2/tr2_tls.h
index 3bdbf4d275..c365017923 100644
--- a/trace2/tr2_tls.h
+++ b/trace2/tr2_tls.h
@@ -20,6 +20,7 @@ struct tr2tls_thread_ctx {
uint64_t *array_us_start;
size_t alloc;
size_t nr_open_regions; /* plays role of "nr" in ALLOC_GROW */
+ size_t nr_skipped_regions;
int thread_id;
struct tr2_timer_block timer_block;
struct tr2_counter_block counter_block;
--
gitgitgadget
next prev parent reply other threads:[~2026-08-25 18:56 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-15 16:12 [PATCH] trace2: tolerate failed timestamp formatting Derrick Stolee via GitGitGadget
2026-07-17 16:24 ` Taylor Blau
2026-07-18 15:01 ` Derrick Stolee
2026-07-20 14:29 ` Junio C Hamano
2026-07-20 14:37 ` Taylor Blau
2026-07-29 21:35 ` Junio C Hamano
2026-07-31 13:26 ` Derrick Stolee
2026-07-31 15:57 ` Junio C Hamano
2026-08-25 18:56 ` [PATCH v2 0/7] trace2: stop allowing die() Derrick Stolee via GitGitGadget
2026-08-25 18:56 ` [PATCH v2 1/7] banned-die: create header for banning of functions Derrick Stolee via GitGitGadget
2026-08-25 20:34 ` Junio C Hamano
2026-08-25 22:14 ` Elijah Newren
2026-08-27 5:10 ` Jeff King
2026-08-25 18:56 ` [PATCH v2 2/7] trace2: tolerate failed timestamp formatting Derrick Stolee via GitGitGadget
2026-08-25 18:56 ` [PATCH v2 3/7] trace2: remove use of xstrdup() Derrick Stolee via GitGitGadget
2026-08-25 22:14 ` Elijah Newren
2026-08-25 18:56 ` [PATCH v2 4/7] trace2: remove use of ALLOC_ARRAY() Derrick Stolee via GitGitGadget
2026-08-25 18:56 ` [PATCH v2 5/7] trace2: remove use of xstrfmt() Derrick Stolee via GitGitGadget
2026-08-25 22:14 ` Elijah Newren
2026-08-25 22:36 ` Junio C Hamano
2026-08-25 18:56 ` Derrick Stolee via GitGitGadget [this message]
2026-08-25 22:14 ` [PATCH v2 6/7] trace2: remove use of ALLOC_GROW() Elijah Newren
2026-08-25 18:56 ` [PATCH v2 7/7] trace2: remove use of xcalloc() Derrick Stolee via GitGitGadget
2026-08-27 5:23 ` [PATCH v2 0/7] trace2: stop allowing die() Jeff King
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=120cf1967bde4e719a781c391b285c718553ad58.1787684181.git.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=stolee@gmail.com \
--cc=ttaylorr@openai.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox