lkml.org 
[lkml]   [2022]   [Jun]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 22/34] vsprintf: Refactor hex_string, bitmap_string_list, bitmap_string
    Date
    This patch cleans up printf_spec handling: these functions only use
    spec.field_width and they do not interpret it in the normal way -
    instead it's a number of bits/bytes passed in to print, so these
    functions are changed to take that parameter directly.

    Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
    ---
    lib/vsprintf.c | 60 +++++++++++++++++++++++---------------------------
    1 file changed, 28 insertions(+), 32 deletions(-)

    diff --git a/lib/vsprintf.c b/lib/vsprintf.c
    index 7f47533ed8..fcdf187b21 100644
    --- a/lib/vsprintf.c
    +++ b/lib/vsprintf.c
    @@ -53,6 +53,7 @@
    #include <asm/unaligned.h>

    #include <linux/string_helpers.h>
    +#include <linux/pretty-printers.h>
    #include "kstrtox.h"

    /* Disable pointer hashing if requested */
    @@ -1151,18 +1152,23 @@ void resource_string(struct printbuf *out, struct resource *res,
    }

    static noinline_for_stack
    -void hex_string(struct printbuf *out, u8 *addr,
    - struct printf_spec spec, const char *fmt)
    +void hex_string(struct printbuf *out, const u8 *addr,
    + int len, const char *fmt)
    {
    - int i, len = 1; /* if we pass '%ph[CDN]', field width remains
    - negative value, fallback to the default */
    char separator;

    - if (spec.field_width == 0)
    - /* nothing to print */
    + /* nothing to print */
    + if (len == 0)
    return;

    - if (check_pointer_spec(out, addr, spec))
    + /* if we pass '%ph[CDN]', field width remains
    + negative value, fallback to the default */
    + if (len < 0)
    + len = 1;
    +
    + len = min(len, 64);
    +
    + if (check_pointer(out, addr))
    return;

    switch (fmt[1]) {
    @@ -1180,34 +1186,21 @@ void hex_string(struct printbuf *out, u8 *addr,
    break;
    }

    - if (spec.field_width > 0)
    - len = min_t(int, spec.field_width, 64);
    -
    - for (i = 0; i < len; ++i) {
    - __prt_char(out, hex_asc_hi(addr[i]));
    - __prt_char(out, hex_asc_lo(addr[i]));
    -
    - if (separator && i != len - 1)
    - __prt_char(out, separator);
    - }
    -
    - printbuf_nul_terminate(out);
    + prt_hex_bytes(out, addr, len, 1, separator);
    }

    static noinline_for_stack
    -void bitmap_string(struct printbuf *out, unsigned long *bitmap,
    - struct printf_spec spec, const char *fmt)
    +void bitmap_string(struct printbuf *out, unsigned long *bitmap, int nr_bits)
    {
    + struct printf_spec spec = { .flags = SMALL | ZEROPAD, .base = 16 };
    const int CHUNKSZ = 32;
    - int nr_bits = max_t(int, spec.field_width, 0);
    int i, chunksz;
    bool first = true;

    - if (check_pointer_spec(out, bitmap, spec))
    - return;
    + nr_bits = max(nr_bits, 0);

    - /* reused to print numbers */
    - spec = (struct printf_spec){ .flags = SMALL | ZEROPAD, .base = 16 };
    + if (check_pointer(out, bitmap))
    + return;

    chunksz = nr_bits & (CHUNKSZ - 1);
    if (chunksz == 0)
    @@ -1236,13 +1229,14 @@ void bitmap_string(struct printbuf *out, unsigned long *bitmap,

    static noinline_for_stack
    void bitmap_list_string(struct printbuf *out, unsigned long *bitmap,
    - struct printf_spec spec, const char *fmt)
    + int nr_bits)
    {
    - int nr_bits = max_t(int, spec.field_width, 0);
    bool first = true;
    int rbot, rtop;

    - if (check_pointer_spec(out, bitmap, spec))
    + nr_bits = max(nr_bits, 0);
    +
    + if (check_pointer(out, bitmap))
    return ;

    for_each_set_bitrange(rbot, rtop, bitmap, nr_bits) {
    @@ -2257,13 +2251,15 @@ void pointer(struct printbuf *out, const char *fmt,
    resource_string(out, ptr, fmt[0] == 'R');
    return do_width_precision(out, prev_pos, spec);
    case 'h':
    - return hex_string(out, ptr, spec, fmt);
    + /* Uses field_width but _not_ as field size */
    + return hex_string(out, ptr, spec.field_width, fmt);
    case 'b':
    + /* Uses field_width but _not_ as field size */
    switch (fmt[1]) {
    case 'l':
    - return bitmap_list_string(out, ptr, spec, fmt);
    + return bitmap_list_string(out, ptr, spec.field_width);
    default:
    - return bitmap_string(out, ptr, spec, fmt);
    + return bitmap_string(out, ptr, spec.field_width);
    }
    case 'M': /* Colon separated: 00:01:02:03:04:05 */
    case 'm': /* Contiguous: 000102030405 */
    --
    2.36.1
    \
     
     \ /
      Last update: 2022-06-20 02:46    [W:3.957 / U:0.240 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site