From: Donggeun Yoo <donggeunyoo.kernel@gmail.com>
To: sashiko-reviews@lists.linux.dev,
Steven Rostedt <rostedt@goodmis.org>,
Masami Hiramatsu <mhiramat@kernel.org>
Cc: Donggeun Yoo <donggeunyoo.kernel@gmail.com>,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
Namhyung Kim <namhyung@kernel.org>,
Tom Zanussi <zanussi@kernel.org>,
linux-trace-kernel@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 1/4] tracing: Print the bucket size as unsigned
Date: Thu, 17 Sep 2026 14:21:30 +0900 [thread overview]
Message-ID: <20260917052130.371970-1-donggeunyoo.kernel@gmail.com> (raw)
In-Reply-To: <20260914054614.82A9B1F000FF@smtp.kernel.org>
On Mon, 14 Sep 2026 05:46:14 +0000, sashiko-bot@kernel.org wrote:
> [Severity: High]
> This isn't a bug introduced by this patch, but does the unsigned division
> in hist_field_bucket() break the bucketing logic for negative numbers?
>
> If the field is signed and negative, its 2's complement representation is
> large. Performing unsigned division via div64_ul() or an unsigned cast
> without checking hist_field->is_signed seems like it would calculate the
> remainder incorrectly. This would happen whenever a histogram is configured
> with buckets over a signed field that takes negative values, mapping them
> to the wrong bucket intervals.
Yes, and the two other issues in this mail are real as well. The 32-bit
truncation in DEFINE_HIST_FIELD_FN() and the one in hist_field_log2() are
posted:
https://lore.kernel.org/all/20260917015532.103081-1-donggeunyoo.kernel@gmail.com/
https://lore.kernel.org/all/20260917023834.216893-1-donggeunyoo.kernel@gmail.com/
This one I have not posted. When I went to write it, it turned out to need
more change than either of those, and I would rather hear what people think
of the approach first.
What it looks like today. The largest multiple of ten that fits in a u64 is
2^64 - 6, so with .buckets=10 over a signed field the groups below zero are
-6..-1, then -16..-7, then -26..-17: none of the boundaries fall on a
multiple of ten and the group next to zero holds six values. At the end of
the range the two ends meet. S64_MAX and S64_MIN are 9223372036854775807
and 9223372036854775808 unsigned, and both divide down to
9223372036854775800, so one group holds both.
One detail in the report is off. hist_field->is_signed is 0 on a .buckets
key even over a signed field. create_hist_field() takes the modifier
branch, copies size and type from operands[0] and stops. hist_debug on
"keys=arg.buckets=10" over an s32 field prints
type: s32 ... is_signed: 0
The member that does carry it is hist_field->field->is_signed, which is
already what create_tracing_map_fields() passes to tracing_map_cmp_num() to
pick the sort comparator - so the tree orders such a key signed today while
grouping and printing it unsigned.
The rendering half of that is posted separately:
https://lore.kernel.org/all/20260917045918.370993-1-donggeunyoo.kernel@gmail.com/
What I have for the grouping:
- Take the signedness from hist_field->field->is_signed, so the grouping,
the sort and the rendering all come from one place.
- For a negative value, round toward negative infinity instead of dividing
the two's complement. Boundaries then stay on multiples of the size on
both sides of zero, so .buckets=10 groups -10..-1 and 0..9.
- Clamp the lowest group at S64_MIN. The boundary below it is not
representable in the u64 a key is stored in, so that group is short,
the same way .buckets already has a short group at the top of an
unsigned range. Its printed end has to come from the true boundary
rather than start + size - 1, or it overlaps the group above it. With
.buckets=10 it prints as
{ arg: ~ -9223372036854775808--9223372036854775801 } hitcount: 2
and the next group starts at -9223372036854775800. With a size that
divides 2^63 nothing is short.
- Print the range signed, which cannot be done on its own: rendering
today's grouping signed would name a range that does not contain
S64_MIN.
Three things I would like an opinion on.
Should .buckets interpret signedness at all? histogram.rst says "in general
the semantics of a given field aren't interpreted when applying a modifier
to it", which reads against this. On the other side, the sort comparator is
already chosen from field->is_signed, so the tree does interpret it, just
not for grouping.
Is the short group at S64_MIN acceptable? I do not see a way to avoid it
that keeps the boundaries on multiples of the size, and anchoring the grid
at S64_MIN instead puts zero inside a group.
Is this a fix or a change? It alters what .buckets prints for any signed
field holding negative values. No ftrace selftest uses .buckets, but it is
still visible output, so I am not sure a Fixes: tag is the right framing.
I have it written and measured against three arms in QEMU if an RFC posting
would be more useful than this description.
Thanks,
Donggeun
next prev parent reply other threads:[~2026-09-17 5:21 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-14 5:34 [PATCH v3 0/4] tracing: Fix NULL dereference when copying keys for a field variable Donggeun Yoo
2026-09-14 5:34 ` [PATCH v3 1/4] tracing: Print the bucket size as unsigned Donggeun Yoo
[not found] ` <20260914054614.82A9B1F000FF@smtp.kernel.org>
2026-09-17 5:21 ` Donggeun Yoo [this message]
2026-09-14 5:34 ` [PATCH v3 2/4] tracing: Add the bucket size to expr_field_str() Donggeun Yoo
2026-09-14 5:34 ` [PATCH v3 3/4] tracing: Only report the stacktrace modifier on a real field Donggeun Yoo
2026-09-14 5:34 ` [PATCH v3 4/4] tracing: Fix NULL dereference when copying keys for a field variable Donggeun Yoo
2026-09-14 20:01 ` [PATCH v3 0/4] " Tom Zanussi
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=20260917052130.371970-1-donggeunyoo.kernel@gmail.com \
--to=donggeunyoo.kernel@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=mhiramat@kernel.org \
--cc=namhyung@kernel.org \
--cc=rostedt@goodmis.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=zanussi@kernel.org \
/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
all inboxes | Powered by JetHome®