From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: "André Przywara" <andre.przywara@arm.com>
Cc: Leo Yan <leo.yan@linaro.org>, Dave Martin <Dave.Martin@arm.com>,
James Clark <james.clark@arm.com>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Mark Rutland <mark.rutland@arm.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Jiri Olsa <jolsa@redhat.com>, Namhyung Kim <namhyung@kernel.org>,
Al Grant <Al.Grant@arm.com>, Wei Li <liwei391@huawei.com>,
John Garry <john.garry@huawei.com>, Will Deacon <will@kernel.org>,
Mathieu Poirier <mathieu.poirier@linaro.org>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v8 06/22] perf arm-spe: Refactor printing string to buffer
Date: Wed, 11 Nov 2020 14:39:22 -0300 [thread overview]
Message-ID: <20201111173922.GA380127@kernel.org> (raw)
In-Reply-To: <a1ca3412-3815-e2a8-0334-f3059802df6a@arm.com>
Em Wed, Nov 11, 2020 at 03:45:23PM +0000, André Przywara escreveu:
> On 11/11/2020 15:35, Arnaldo Carvalho de Melo wrote:
>
> Hi Arnaldo,
>
> thanks for taking a look!
>
> > Em Wed, Nov 11, 2020 at 03:11:33PM +0800, Leo Yan escreveu:
> >> When outputs strings to the decoding buffer with function snprintf(),
> >> SPE decoder needs to detects if any error returns from snprintf() and if
> >> so needs to directly bail out. If snprintf() returns success, it needs
> >> to update buffer pointer and reduce the buffer length so can continue to
> >> output the next string into the consequent memory space.
> >>
> >> This complex logics are spreading in the function arm_spe_pkt_desc() so
> >> there has many duplicate codes for handling error detecting, increment
> >> buffer pointer and decrement buffer size.
> >>
> >> To avoid the duplicate code, this patch introduces a new helper function
> >> arm_spe_pkt_snprintf() which is used to wrap up the complex logics, and
> >> it's used by the caller arm_spe_pkt_desc().
> >>
> >> This patch also moves the variable 'blen' as the function's local
> >> variable, this allows to remove the unnecessary braces and improve the
> >> readability.
> >>
> >> Suggested-by: Dave Martin <Dave.Martin@arm.com>
> >> Signed-off-by: Leo Yan <leo.yan@linaro.org>
> >> Reviewed-by: Andre Przywara <andre.przywara@arm.com>
> >> ---
> >> .../arm-spe-decoder/arm-spe-pkt-decoder.c | 260 +++++++++---------
> >> 1 file changed, 126 insertions(+), 134 deletions(-)
> >>
> >> diff --git a/tools/perf/util/arm-spe-decoder/arm-spe-pkt-decoder.c b/tools/perf/util/arm-spe-decoder/arm-spe-pkt-decoder.c
> >> index 04fd7fd7c15f..1970686f7020 100644
> >> --- a/tools/perf/util/arm-spe-decoder/arm-spe-pkt-decoder.c
> >> +++ b/tools/perf/util/arm-spe-decoder/arm-spe-pkt-decoder.c
> >> @@ -9,6 +9,7 @@
> >> #include <endian.h>
> >> #include <byteswap.h>
> >> #include <linux/bitops.h>
> >> +#include <stdarg.h>
> >>
> >> #include "arm-spe-pkt-decoder.h"
> >>
> >> @@ -258,192 +259,183 @@ int arm_spe_get_packet(const unsigned char *buf, size_t len,
> >> return ret;
> >> }
> >>
> >> +static int arm_spe_pkt_snprintf(int *err, char **buf_p, size_t *blen,
> >> + const char *fmt, ...)
> >> +{
> >> + va_list ap;
> >> + int ret;
> >> +
> >> + /* Bail out if any error occurred */
> >> + if (err && *err)
> >> + return *err;
> >> +
> >> + va_start(ap, fmt);
> >> + ret = vsnprintf(*buf_p, *blen, fmt, ap);
> >> + va_end(ap);
> >> +
> >> + if (ret < 0) {
> >> + if (err && !*err)
> >> + *err = ret;
> >> +
> >> + /*
> >> + * A return value of (*blen - 1) or more means that the
> >> + * output was truncated and the buffer is overrun.
> >> + */
> >> + } else if (ret >= ((int)*blen - 1)) {
> >> + (*buf_p)[*blen - 1] = '\0';
> >> +
> >> + /*
> >> + * Set *err to 'ret' to avoid overflow if tries to
> >> + * fill this buffer sequentially.
> >> + */
> >> + if (err && !*err)
> >> + *err = ret;
> >> + } else {
> >> + *buf_p += ret;
> >> + *blen -= ret;
> >> + }
> >> +
> >> + return ret;
> >> +}
> >> +
> >> int arm_spe_pkt_desc(const struct arm_spe_pkt *packet, char *buf,
> >> size_t buf_len)
> >> {
> >> int ret, ns, el, idx = packet->index;
> >> unsigned long long payload = packet->payload;
> >> const char *name = arm_spe_pkt_name(packet->type);
> >> + size_t blen = buf_len;
> >> + int err = 0;
> >>
> >> switch (packet->type) {
> >> case ARM_SPE_BAD:
> >> case ARM_SPE_PAD:
> >> case ARM_SPE_END:
> >> - return snprintf(buf, buf_len, "%s", name);
> >> - case ARM_SPE_EVENTS: {
> >> - size_t blen = buf_len;
> >> -
> >> - ret = 0;
> >> - ret = snprintf(buf, buf_len, "EV");
> >> - buf += ret;
> >> - blen -= ret;
> >> - if (payload & 0x1) {
> >> - ret = snprintf(buf, buf_len, " EXCEPTION-GEN");
> >> - buf += ret;
> >> - blen -= ret;
> >> - }
> >> - if (payload & 0x2) {
> >> - ret = snprintf(buf, buf_len, " RETIRED");
> >> - buf += ret;
> >> - blen -= ret;
> >> - }
> >> - if (payload & 0x4) {
> >> - ret = snprintf(buf, buf_len, " L1D-ACCESS");
> >> - buf += ret;
> >> - blen -= ret;
> >> - }
> >> - if (payload & 0x8) {
> >> - ret = snprintf(buf, buf_len, " L1D-REFILL");
> >> - buf += ret;
> >> - blen -= ret;
> >> - }
> >> - if (payload & 0x10) {
> >> - ret = snprintf(buf, buf_len, " TLB-ACCESS");
> >> - buf += ret;
> >> - blen -= ret;
> >> - }
> >> - if (payload & 0x20) {
> >> - ret = snprintf(buf, buf_len, " TLB-REFILL");
> >> - buf += ret;
> >> - blen -= ret;
> >> - }
> >> - if (payload & 0x40) {
> >> - ret = snprintf(buf, buf_len, " NOT-TAKEN");
> >> - buf += ret;
> >> - blen -= ret;
> >> - }
> >> - if (payload & 0x80) {
> >> - ret = snprintf(buf, buf_len, " MISPRED");
> >> - buf += ret;
> >> - blen -= ret;
> >> - }
> >> + return arm_spe_pkt_snprintf(&err, &buf, &blen, "%s", name);
> >> + case ARM_SPE_EVENTS:
> >> + ret = arm_spe_pkt_snprintf(&err, &buf, &blen, "EV");
> >> +
> >> + if (payload & 0x1)
> >> + ret = arm_spe_pkt_snprintf(&err, &buf, &blen, " EXCEPTION-GEN");
> >
> > Isn't this 'ret +=' ? Otherwise if any of these arm_spe_pkt_snprintf()
> > calls are made the previous 'ret' value is simply discarded. Can you
> > clarify this?
>
> ret is the same as err. If err is negative (from previous calls), we
> return that straight away, so it does nothing but propagating the error.
Usually the return of a snprintf is used to account for buffer space, ok
I'll have to read it, which I shouldn't as snprintf has a well defined
meaning...
Ok, now that I look at it, I realize it is not a snprintf() routine, but
something with different semantics, that will look at a pointer to an
integer and then do nothing if it comes with some error, etc, confusing
:-/
> That redundancy gets cleaned up in the next patch.
I'll fixup the bitops part and try to continue.
- Arnaldo
> This patch split is somewhat cumbersome, but was done to simplify review
> (originally 06 and 07 were one patch). The combined patch made it hard
> to match the individual changes. If you feel unsure about it, or you
> feel it looks better, you could also merge both 06/22 and 07/22 into a
> single patch.
>
> Hope that helps.
next prev parent reply other threads:[~2020-11-11 17:39 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-11 7:11 [PATCH v8 00/22] perf arm-spe: Refactor decoding & dumping flow Leo Yan
2020-11-11 7:11 ` [PATCH v8 01/22] perf arm-spe: Include bitops.h for BIT() macro Leo Yan
2020-11-11 7:11 ` [PATCH v8 02/22] perf arm-spe: Fix a typo in comment Leo Yan
2020-11-11 7:11 ` [PATCH v8 03/22] perf arm-spe: Refactor payload size calculation Leo Yan
2020-11-11 7:11 ` [PATCH v8 04/22] perf arm-spe: Refactor arm_spe_get_events() Leo Yan
2020-11-11 7:11 ` [PATCH v8 05/22] perf arm-spe: Fix packet length handling Leo Yan
2020-11-11 7:11 ` [PATCH v8 06/22] perf arm-spe: Refactor printing string to buffer Leo Yan
2020-11-11 15:35 ` Arnaldo Carvalho de Melo
2020-11-11 15:45 ` André Przywara
2020-11-11 17:39 ` Arnaldo Carvalho de Melo [this message]
2020-11-11 17:58 ` Dave Martin
2020-11-11 18:01 ` Arnaldo Carvalho de Melo
2020-11-11 18:02 ` Arnaldo Carvalho de Melo
2020-11-11 18:08 ` Arnaldo Carvalho de Melo
2020-11-12 2:20 ` Leo Yan
2020-11-11 23:03 ` David Laight
2020-11-12 3:02 ` Leo Yan
2020-11-11 15:53 ` Dave Martin
2020-11-11 15:58 ` Dave Martin
2020-11-11 17:40 ` Arnaldo Carvalho de Melo
2020-11-11 7:11 ` [PATCH v8 07/22] perf arm-spe: Consolidate arm_spe_pkt_desc()'s return value Leo Yan
2020-11-11 16:04 ` Dave Martin
2020-11-11 7:11 ` [PATCH v8 08/22] perf arm-spe: Refactor packet header parsing Leo Yan
2020-11-11 7:11 ` [PATCH v8 09/22] perf arm-spe: Add new function arm_spe_pkt_desc_addr() Leo Yan
2020-11-11 7:11 ` [PATCH v8 10/22] perf arm-spe: Refactor address packet handling Leo Yan
2020-11-11 7:11 ` [PATCH v8 11/22] perf arm_spe: Fixup top byte for data virtual address Leo Yan
2020-11-11 7:11 ` [PATCH v8 12/22] perf arm-spe: Refactor context packet handling Leo Yan
2020-11-11 7:11 ` [PATCH v8 13/22] perf arm-spe: Add new function arm_spe_pkt_desc_counter() Leo Yan
2020-11-11 7:11 ` [PATCH v8 14/22] perf arm-spe: Refactor counter packet handling Leo Yan
2020-11-11 7:11 ` [PATCH v8 15/22] perf arm-spe: Add new function arm_spe_pkt_desc_event() Leo Yan
2020-11-11 7:11 ` [PATCH v8 16/22] perf arm-spe: Refactor event type handling Leo Yan
2020-11-11 7:11 ` [PATCH v8 17/22] perf arm-spe: Remove size condition checking for events Leo Yan
2020-11-11 7:11 ` [PATCH v8 18/22] perf arm-spe: Add new function arm_spe_pkt_desc_op_type() Leo Yan
2020-11-11 7:11 ` [PATCH v8 19/22] perf arm-spe: Refactor operation packet handling Leo Yan
2020-11-11 7:11 ` [PATCH v8 20/22] perf arm-spe: Add more sub classes for operation packet Leo Yan
2020-11-11 7:11 ` [PATCH v8 21/22] perf arm_spe: Decode memory tagging properties Leo Yan
2020-11-11 7:11 ` [PATCH v8 22/22] perf arm-spe: Add support for ARMv8.3-SPE Leo Yan
2020-11-11 10:13 ` [PATCH v8 00/22] perf arm-spe: Refactor decoding & dumping flow André Przywara
2020-11-11 11:58 ` Arnaldo Carvalho de Melo
2020-11-11 16:10 ` Arnaldo Carvalho de Melo
2020-11-11 16:15 ` Arnaldo Carvalho de Melo
2020-11-11 16:20 ` André Przywara
2020-11-11 17:44 ` Arnaldo Carvalho de Melo
2020-11-11 17:51 ` André Przywara
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=20201111173922.GA380127@kernel.org \
--to=acme@kernel.org \
--cc=Al.Grant@arm.com \
--cc=Dave.Martin@arm.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=andre.przywara@arm.com \
--cc=james.clark@arm.com \
--cc=john.garry@huawei.com \
--cc=jolsa@redhat.com \
--cc=leo.yan@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=liwei391@huawei.com \
--cc=mark.rutland@arm.com \
--cc=mathieu.poirier@linaro.org \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
--cc=will@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.