Re: [PATCH v1 1/5] seq_file: provide an analogue of print_hex_dump()

2014-07-10 Thread Marek Vasut
On Wednesday, July 09, 2014 at 11:21:08 PM, Joe Perches wrote:
 On Wed, 2014-07-09 at 22:39 +0200, Marek Vasut wrote:
  The above function looks like almost verbatim copy of print_hex_dump().
  The only difference I can spot is that it's calling seq_printf() instead
  of printk(). Can you not instead generalize print_hex_dump() and based
  on it's invocation, make it call either seq_printf() or printk() ?
 
 How do you propose doing that given any seq_foo call
 requires a struct seq_file * and print_hex_dump needs
 a KERN_LEVEL.

I can imagine a rather nasty way, I can't say I would like it myself tho. The 
general idea would be to pull out the entire switch {} statement into a 
separate 
functions , one for printk() and one for seq_printf() cases. Then, have a 
generic do_hex_dump() call which would take as an argument a pointer to either 
of those functions and a void * to either the seq_file or level . Finally, 
there 
would have to be a wrapper to call the do_hex_dump() with the correct function 
pointer and it's associated arg.

Nasty? Yes ... Ineffective? Most likely.

 Is there an actual value to it?

Reducing the code duplication, but I wonder if there is a smarter solution than 
the horrid one above.

Best regards,
Marek Vasut
--
To unsubscribe from this list: send the line unsubscribe linux-crypto in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v1 1/5] seq_file: provide an analogue of print_hex_dump()

2014-07-10 Thread Andy Shevchenko
On Thu, 2014-07-10 at 09:58 +0200, Marek Vasut wrote:
 On Wednesday, July 09, 2014 at 11:21:08 PM, Joe Perches wrote:
  On Wed, 2014-07-09 at 22:39 +0200, Marek Vasut wrote:
   The above function looks like almost verbatim copy of print_hex_dump().
   The only difference I can spot is that it's calling seq_printf() instead
   of printk(). Can you not instead generalize print_hex_dump() and based
   on it's invocation, make it call either seq_printf() or printk() ?
  
  How do you propose doing that given any seq_foo call
  requires a struct seq_file * and print_hex_dump needs
  a KERN_LEVEL.
 
 I can imagine a rather nasty way, I can't say I would like it myself tho. The 
 general idea would be to pull out the entire switch {} statement into a 
 separate 
 functions , one for printk() and one for seq_printf() cases. Then, have a 
 generic do_hex_dump() call which would take as an argument a pointer to 
 either 
 of those functions and a void * to either the seq_file or level . Finally, 
 there 
 would have to be a wrapper to call the do_hex_dump() with the correct 
 function 
 pointer and it's associated arg.
 
 Nasty? Yes ... Ineffective? Most likely.

It looks not good idea, yeah.

  Is there an actual value to it?
 
 Reducing the code duplication, but I wonder if there is a smarter solution 
 than 
 the horrid one above.

I have considered to modify hex_dump_to_buffer() to return how many
bytes it actually proceed to the buffer. In that case we can directly
print to m-buf like other seq_foo calls do.

But I still have doubts about it. Any opinion?

-- 
Andy Shevchenko andriy.shevche...@intel.com
Intel Finland Oy

--
To unsubscribe from this list: send the line unsubscribe linux-crypto in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v1 1/5] seq_file: provide an analogue of print_hex_dump()

2014-07-10 Thread Joe Perches
On Thu, 2014-07-10 at 12:50 +0300, Andy Shevchenko wrote:
 I have considered to modify hex_dump_to_buffer() to return how many
 bytes it actually proceed to the buffer. In that case we can directly
 print to m-buf like other seq_foo calls do.
 
 But I still have doubts about it. Any opinion?

Simpler is better.


--
To unsubscribe from this list: send the line unsubscribe linux-crypto in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v1 1/5] seq_file: provide an analogue of print_hex_dump()

2014-07-09 Thread Andy Shevchenko
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.

Signed-off-by: Andy Shevchenko andriy.shevche...@linux.intel.com
---
 fs/seq_file.c| 35 +++
 include/linux/seq_file.h |  4 
 2 files changed, 39 insertions(+)

diff --git a/fs/seq_file.c b/fs/seq_file.c
index 3857b72..fec4a6b 100644
--- a/fs/seq_file.c
+++ b/fs/seq_file.c
@@ -12,6 +12,7 @@
 #include linux/slab.h
 #include linux/cred.h
 #include linux/mm.h
+#include linux/printk.h
 
 #include asm/uaccess.h
 #include asm/page.h
@@ -794,6 +795,40 @@ 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;
+   unsigned char linebuf[32 * 3 + 2 + 32 + 1];
+
+   if (rowsize != 16  rowsize != 32)
+   rowsize = 16;
+
+   for (i = 0; i  len; i += rowsize) {
+   linelen = min(remaining, rowsize);
+   remaining -= rowsize;
+
+   hex_dump_to_buffer(ptr + i, linelen, rowsize, groupsize,
+  linebuf, sizeof(linebuf), ascii);
+
+   switch (prefix_type) {
+   case DUMP_PREFIX_ADDRESS:
+   seq_printf(m, %s%p: %s\n, prefix_str, ptr + i, 
linebuf);
+   break;
+   case DUMP_PREFIX_OFFSET:
+   seq_printf(m, %s%.8x: %s\n, prefix_str, i, linebuf);
+   break;
+   default:
+   seq_printf(m, %s%s\n, prefix_str, linebuf);
+   break;
+   }
+   }
+}
+EXPORT_SYMBOL(seq_hex_dump);
+
 struct list_head *seq_list_start(struct list_head *head, loff_t pos)
 {
struct list_head *lh;
diff --git a/include/linux/seq_file.h b/include/linux/seq_file.h
index 52e0097..6a8be4c 100644
--- a/include/linux/seq_file.h
+++ b/include/linux/seq_file.h
@@ -107,6 +107,10 @@ int seq_write(struct seq_file *seq, const void *data, 
size_t len);
 __printf(2, 3) int seq_printf(struct seq_file *, const char *, ...);
 __printf(2, 0) int seq_vprintf(struct seq_file *, const char *, va_list args);
 
+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);
+
 int seq_path(struct seq_file *, const struct path *, const char *);
 int seq_dentry(struct seq_file *, struct dentry *, const char *);
 int seq_path_root(struct seq_file *m, const struct path *path,
-- 
2.0.1

--
To unsubscribe from this list: send the line unsubscribe linux-crypto in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v1 1/5] seq_file: provide an analogue of print_hex_dump()

2014-07-09 Thread Marek Vasut
On Wednesday, July 09, 2014 at 05:24:26 PM, 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.
 
 Signed-off-by: Andy Shevchenko andriy.shevche...@linux.intel.com
 ---
  fs/seq_file.c| 35 +++
  include/linux/seq_file.h |  4 
  2 files changed, 39 insertions(+)
 
 diff --git a/fs/seq_file.c b/fs/seq_file.c
 index 3857b72..fec4a6b 100644
 --- a/fs/seq_file.c
 +++ b/fs/seq_file.c
 @@ -12,6 +12,7 @@
  #include linux/slab.h
  #include linux/cred.h
  #include linux/mm.h
 +#include linux/printk.h
 
  #include asm/uaccess.h
  #include asm/page.h
 @@ -794,6 +795,40 @@ 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;
 + unsigned char linebuf[32 * 3 + 2 + 32 + 1];
 +
 + if (rowsize != 16  rowsize != 32)
 + rowsize = 16;
 +
 + for (i = 0; i  len; i += rowsize) {
 + linelen = min(remaining, rowsize);
 + remaining -= rowsize;
 +
 + hex_dump_to_buffer(ptr + i, linelen, rowsize, groupsize,
 +linebuf, sizeof(linebuf), ascii);
 +
 + switch (prefix_type) {
 + case DUMP_PREFIX_ADDRESS:
 + seq_printf(m, %s%p: %s\n, prefix_str, ptr + i, 
linebuf);
 + break;
 + case DUMP_PREFIX_OFFSET:
 + seq_printf(m, %s%.8x: %s\n, prefix_str, i, linebuf);
 + break;
 + default:
 + seq_printf(m, %s%s\n, prefix_str, linebuf);
 + break;
 + }
 + }
 +}
 +EXPORT_SYMBOL(seq_hex_dump);

The above function looks like almost verbatim copy of print_hex_dump(). The 
only 
difference I can spot is that it's calling seq_printf() instead of printk(). 
Can 
you not instead generalize print_hex_dump() and based on it's invocation, make 
it call either seq_printf() or printk() ?

Best regards,
--
To unsubscribe from this list: send the line unsubscribe linux-crypto in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v1 1/5] seq_file: provide an analogue of print_hex_dump()

2014-07-09 Thread Joe Perches
On Wed, 2014-07-09 at 22:39 +0200, Marek Vasut wrote:
 The above function looks like almost verbatim copy of print_hex_dump(). The 
 only 
 difference I can spot is that it's calling seq_printf() instead of printk(). 
 Can 
 you not instead generalize print_hex_dump() and based on it's invocation, 
 make 
 it call either seq_printf() or printk() ?

How do you propose doing that given any seq_foo call
requires a struct seq_file * and print_hex_dump needs
a KERN_LEVEL.

Is there an actual value to it?



--
To unsubscribe from this list: send the line unsubscribe linux-crypto in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html