Messages in this thread | | | Subject | Re: [PATCH v3 1/5] seq_file: provide an analogue of print_hex_dump() | From | Andy Shevchenko <> | Date | Mon, 01 Sep 2014 11:36:46 +0300 |
| |
On Sat, 2014-08-30 at 23:54 +0100, Al Viro wrote: > On Mon, Aug 25, 2014 at 12:03:11PM +0300, Andy Shevchenko wrote: > > The new seq_hex_dump() is a complete analogue of print_hex_dump(). > > > > We have few users of this functionality already. It allows to reduce their > > codebase. > > I really don't like the stack footprint. > > > + unsigned char linebuf[32 * 3 + 2 + 32 + 1]; > > ... and extra copying for no good reason. Why not check that we have > enough space in buffer and generate directly into it? See what e.g. > seq_escape() is doing...
What about this variant?
@@ -794,6 +795,47 @@ void seq_pad(struct seq_file *m, char c) } EXPORT_SYMBOL(seq_pad); +/* Analogue of print_hex_dump() */ +void seq_hex_dump(struct seq_file *m, const char *prefix_str, int prefix_type, + int rowsize, int groupsize, const void *buf, size_t len, + bool ascii) +{ + const u8 *ptr = buf; + int i, linelen, remaining = len; + int ret; + + if (rowsize != 16 && rowsize != 32) + rowsize = 16; + + for (i = 0; i < len; i += rowsize) { + linelen = min(remaining, rowsize); + remaining -= rowsize; + + ret = seq_printf(m, "%s", prefix_str); + if (ret < 0) + break; + + if (prefix_type == DUMP_PREFIX_ADDRESS) + ret = seq_printf(m, "%p: ", ptr + i); + else if (prefix_type == DUMP_PREFIX_OFFSET) + ret = seq_printf(m, "%.8x: ", i); + if (ret < 0) + break; + + if (m->size < m->count + groupsize * 2 + 1) + break; + + hex_dump_to_buffer(ptr + i, linelen, rowsize, groupsize, + m->buf + m->count, m->size - m->count, + ascii); + + ret = seq_putc(m, '\n'); + if (ret < 0) + break; + } +} +EXPORT_SYMBOL(seq_hex_dump);
-- Andy Shevchenko <andriy.shevchenko@intel.com> Intel Finland Oy
| |