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.shevche...@intel.com> Intel Finland Oy -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/