From: Simon Horman <horms@kernel.org>
To: David Laight <david.laight.linux@gmail.com>
Cc: Nick Child <nnac123@linux.ibm.com>,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
haren@linux.ibm.com, ricklind@us.ibm.com, nick.child@ibm.com,
jacob.e.keller@intel.com
Subject: Re: [PATCH 1/3] hexdump: Implement macro for converting large buffers
Date: Sun, 16 Feb 2025 09:32:04 +0000 [thread overview]
Message-ID: <20250216093204.GZ1615191@kernel.org> (raw)
In-Reply-To: <20250215174635.3640fb28@pumpkin>
On Sat, Feb 15, 2025 at 05:46:35PM +0000, David Laight wrote:
> On Sat, 15 Feb 2025 17:40:39 +0000
> David Laight <david.laight.linux@gmail.com> wrote:
>
> > On Sat, 15 Feb 2025 16:36:12 +0000
> > Simon Horman <horms@kernel.org> wrote:
> >
> > > + David Laight
> > >
> > > On Fri, Feb 14, 2025 at 10:24:34AM -0600, Nick Child wrote:
> > > > Define for_each_line_in_hex_dump which loops over a buffer and calls
> > > > hex_dump_to_buffer for each segment in the buffer. This allows the
> > > > caller to decide what to do with the resulting string and is not
> > > > limited by a specific printing format like print_hex_dump.
> > > >
> > > > Signed-off-by: Nick Child <nnac123@linux.ibm.com>
> > > > ---
> > > > include/linux/printk.h | 21 +++++++++++++++++++++
> > > > 1 file changed, 21 insertions(+)
> > > >
> > > > diff --git a/include/linux/printk.h b/include/linux/printk.h
> > > > index 4217a9f412b2..559d4bfe0645 100644
> > > > --- a/include/linux/printk.h
> > > > +++ b/include/linux/printk.h
> > > > @@ -755,6 +755,27 @@ enum {
> > > > extern int hex_dump_to_buffer(const void *buf, size_t len, int rowsize,
> > > > int groupsize, char *linebuf, size_t linebuflen,
> > > > bool ascii);
> > > > +/**
> > > > + * for_each_line_in_hex_dump - iterate over buffer, converting into hex ASCII
> > > > + * @i: offset in @buff
> > > > + * @rowsize: number of bytes to print per line; must be 16 or 32
> > > > + * @linebuf: where to put the converted data
> > > > + * @linebuflen: total size of @linebuf, including space for terminating NUL
> > > > + * IOW >= (@rowsize * 2) + ((@rowsize - 1 / @groupsize)) + 1
> > > > + * @groupsize: number of bytes to print at a time (1, 2, 4, 8; default = 1)
> > > > + * @buf: data blob to dump
> > > > + * @len: number of bytes in the @buf
> > > > + */
> > > > + #define for_each_line_in_hex_dump(i, rowsize, linebuf, linebuflen, groupsize, \
> > > > + buf, len) \
> > > > + for ((i) = 0; \
> > > > + (i) < (len) && \
> > > > + hex_dump_to_buffer((unsigned char *)(buf) + (i), \
> > > > + min((len) - (i), rowsize), \
> > > > + (rowsize), (groupsize), (linebuf), \
> > > > + (linebuflen), false); \
> > > > + (i) += (rowsize) == 16 || (rowsize) == 32 ? (rowsize) : 16 \
> > > > + )
> > > > #ifdef CONFIG_PRINTK
> > > > extern void print_hex_dump(const char *level, const char *prefix_str,
> > > > int prefix_type, int rowsize, int groupsize,
> > >
> > > Hi Nick,
> > >
> > > When compiling with gcc 7.5.0 (old, but still supported AFAIK) on x86_64
> > > with patch 2/3 (and 1/3) applied I see this:
> > >
> > > CC lib/hexdump.o
> > > In file included from <command-line>:0:0:
> > > lib/hexdump.c: In function 'print_hex_dump':
> > > ././include/linux/compiler_types.h:542:38: error: call to '__compiletime_assert_11' declared with attribute error: min((len) - (i), rowsize) signedness error
> > ...
> > > Highlighting the min line in the macro for context, it looks like this:
> > >
> > > min((len) - (i), rowsize)
> > >
> > > And in this case the types involved are:
> > >
> > > size_t len
> > > int i
> > > int rowsize
> >
> > Yep, that should fail for all versions of gcc.
> > Both 'i' and 'rowsize' should be unsigned types.
> > In fact all three can be 'unsigned int'.
To give a bit more context, a complication changing the types is that the
type of len and rowsise (but not i) is in the signature of the calling
function, print_hex_dump(). And I believe that function is widely used
throughout the tree.
>
> Thinking a bit more.
> If the compiler can determine that 'rowsize >= 0' then the test will pass.
> More modern compilers do better value tracking so that might be enough
> to stop the compiler 'bleating'.
FTR, I did not see this with GCC 14.2.0 (or clang 19.1.7).
next prev parent reply other threads:[~2025-02-16 9:32 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-14 16:24 [PATCH v2 0/3] Use new for_each macro to create hexdumps Nick Child
2025-02-14 16:24 ` [PATCH 1/3] hexdump: Implement macro for converting large buffers Nick Child
[not found] ` <87tt8wflt5.fsf@linux.ibm.com>
2025-02-14 18:33 ` Nick Child
2025-02-15 16:36 ` Simon Horman
2025-02-15 17:40 ` David Laight
2025-02-15 17:46 ` David Laight
2025-02-16 9:32 ` Simon Horman [this message]
2025-02-16 11:24 ` David Laight
2025-02-17 15:09 ` Nick Child
2025-02-18 12:31 ` Paolo Abeni
2025-02-14 16:24 ` [PATCH v2 2/3] hexdump: Use for_each macro in print_hex_dump Nick Child
2025-02-14 16:24 ` [PATCH v2 3/3] ibmvnic: Print data buffers with kernel API's Nick Child
-- strict thread matches above, loose matches on Subject: below --
2025-01-13 22:17 [PATCH 0/3] Use new for_each macro to create hexdumps Nick Child
2025-01-13 22:17 ` [PATCH 1/3] hexdump: Implement macro for converting large buffers Nick Child
2025-01-14 14:48 ` Simon Horman
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=20250216093204.GZ1615191@kernel.org \
--to=horms@kernel.org \
--cc=david.laight.linux@gmail.com \
--cc=haren@linux.ibm.com \
--cc=jacob.e.keller@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=nick.child@ibm.com \
--cc=nnac123@linux.ibm.com \
--cc=ricklind@us.ibm.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 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.