All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kent Overstreet <kent.overstreet@gmail.com>
To: linux-kernel@vger.kernel.org, linux-mm@vger.kernel.org,
	pmladek@suse.com, rostedt@goodmis.org, senozhatsky@chromium.org
Cc: Kent Overstreet <kent.overstreet@gmail.com>,
	andriy.shevchenko@linux.intel.com, willy@infradead.org
Subject: [PATCH v2 07/28] lib/printbuf: Unit specifiers
Date: Thu, 19 May 2022 13:24:00 -0400	[thread overview]
Message-ID: <20220519172421.162394-8-kent.overstreet@gmail.com> (raw)
In-Reply-To: <20220519172421.162394-1-kent.overstreet@gmail.com>

This adds options to printbuf for specifying whether units should be
printed raw (default) or with human readable units, and for controlling
whether human-readable units should be base 2 (default), or base 10.

This also adds new helpers that obey these options:

 - pr_human_readable_u64
 - pr_human_readable_s64
These obey printbuf->si_units

 - pr_units_u64
 - pr_units_s64
These obey both printbuf-human_readable_units and printbuf->si_units

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
---
 include/linux/printbuf.h | 15 +++++++++++
 lib/printbuf.c           | 57 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 72 insertions(+)

diff --git a/include/linux/printbuf.h b/include/linux/printbuf.h
index 798e067457..c7919ae721 100644
--- a/include/linux/printbuf.h
+++ b/include/linux/printbuf.h
@@ -53,10 +53,19 @@
  *
  * Make sure you use pr_newline() instead of \n in the format string for indent
  * level and tabstops to work corretly.
+ *
+ * Output units: printbuf->units exists to tell pretty-printers how to output
+ * numbers: a raw value (e.g. directly from a superblock field), as bytes, or as
+ * human readable bytes. pr_units() and pr_sectors() obey it.
  */
 
 #include <linux/string.h>
 
+enum printbuf_si {
+	PRINTBUF_UNITS_2,	/* use binary powers of 2^10 */
+	PRINTBUF_UNITS_10,	/* use powers of 10^3 (standard SI) */
+};
+
 struct printbuf {
 	char			*buf;
 	unsigned		size;
@@ -70,6 +79,8 @@ struct printbuf {
 	u8			atomic;
 	bool			allocation_failure:1;
 	bool			heap_allocated:1;
+	enum printbuf_si	si_units:1;
+	bool			human_readable_units:1;
 	u8			tabstop;
 	u8			tabstops[4];
 };
@@ -83,6 +94,10 @@ void pr_indent_add(struct printbuf *, unsigned);
 void pr_indent_sub(struct printbuf *, unsigned);
 void pr_tab(struct printbuf *);
 void pr_tab_rjust(struct printbuf *);
+void pr_human_readable_u64(struct printbuf *, u64);
+void pr_human_readable_s64(struct printbuf *, s64);
+void pr_units_u64(struct printbuf *, u64);
+void pr_units_s64(struct printbuf *, s64);
 
 /* Initializer for a heap allocated printbuf: */
 #define PRINTBUF ((struct printbuf) { .heap_allocated = true })
diff --git a/lib/printbuf.c b/lib/printbuf.c
index c9f730a215..b99d4b0dff 100644
--- a/lib/printbuf.c
+++ b/lib/printbuf.c
@@ -9,6 +9,7 @@
 #endif
 
 #include <linux/slab.h>
+#include <linux/string_helpers.h>
 #include <linux/printbuf.h>
 
 static inline size_t printbuf_linelen(struct printbuf *buf)
@@ -193,3 +194,59 @@ void pr_tab_rjust(struct printbuf *buf)
 	buf->tabstop++;
 }
 EXPORT_SYMBOL(pr_tab_rjust);
+
+/**
+ * pr_human_readable_u64 - Print out a u64 in human readable units
+ *
+ * Units of 2^10 (default) or 10^3 are controlled via @buf->si_units
+ */
+void pr_human_readable_u64(struct printbuf *buf, u64 v)
+{
+	printbuf_make_room(buf, 10);
+	buf->pos += string_get_size(v, 1, !buf->si_units,
+				    buf->buf + buf->pos,
+				    printbuf_remaining(buf));
+}
+EXPORT_SYMBOL(pr_human_readable_u64);
+
+/**
+ * pr_human_readable_s64 - Print out a s64 in human readable units
+ *
+ * Units of 2^10 (default) or 10^3 are controlled via @buf->si_units
+ */
+void pr_human_readable_s64(struct printbuf *buf, s64 v)
+{
+	if (v < 0)
+		pr_char(buf, '-');
+	pr_human_readable_u64(buf, abs(v));
+}
+EXPORT_SYMBOL(pr_human_readable_s64);
+
+/**
+ * pr_human_readable_u64 - Print out a u64 according to printbuf unit options
+ *
+ * Units are either raw (default), or human reabable units (controlled via
+ * @buf->human_readable_units)
+ */
+void pr_units_u64(struct printbuf *out, u64 v)
+{
+	if (out->human_readable_units)
+		pr_human_readable_u64(out, v);
+	else
+		pr_buf(out, "%llu", v);
+}
+EXPORT_SYMBOL(pr_units_u64);
+
+/**
+ * pr_human_readable_s64 - Print out a s64 according to printbuf unit options
+ *
+ * Units are either raw (default), or human reabable units (controlled via
+ * @buf->human_readable_units)
+ */
+void pr_units_s64(struct printbuf *out, s64 v)
+{
+	if (v < 0)
+		pr_char(out, '-');
+	pr_units_u64(out, v);
+}
+EXPORT_SYMBOL(pr_units_s64);
-- 
2.36.0


  parent reply	other threads:[~2022-05-19 17:25 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-19 17:23 [PATCH v2 00/28] Printbufs (now with more printbufs!) Kent Overstreet
2022-05-19 17:23 ` [PATCH v2 01/28] lib/printbuf: New data structure for printing strings Kent Overstreet
2022-05-19 18:21   ` Matthew Wilcox
2022-05-20  4:44     ` Kent Overstreet
2022-05-26 15:06   ` Petr Mladek
2022-05-26 15:21     ` Kent Overstreet
2022-05-26 15:36       ` Joe Perches
2022-05-27 10:29       ` Petr Mladek
2022-05-29 18:15         ` Kent Overstreet
2022-05-31 22:03         ` Kent Overstreet
2022-05-19 17:23 ` [PATCH v2 02/28] vsprintf: Convert to printbuf Kent Overstreet
2022-05-19 17:23 ` [PATCH v2 03/28] vsprintf: %pf(%p) Kent Overstreet
2022-05-19 18:33   ` Matthew Wilcox
2022-05-20  4:43     ` Kent Overstreet
2022-05-19 21:06   ` David Laight
2022-05-19 21:15     ` Matthew Wilcox
2022-05-20  8:03       ` David Laight
2022-05-20 13:08         ` Matthew Wilcox
2022-05-20  4:49     ` Kent Overstreet
2022-05-20 14:17       ` andriy.shevchenko
2022-05-19 21:20   ` Matthew Wilcox
2022-05-20  7:40   ` Michal Hocko
2022-05-20 15:01     ` Kent Overstreet
2022-05-20 17:56     ` Kent Overstreet
2022-05-19 17:23 ` [PATCH v2 04/28] lib/string_helpers: string_get_size() now returns characters wrote Kent Overstreet
2022-05-19 17:23 ` [PATCH v2 05/28] lib/printbuf: Heap allocation Kent Overstreet
2022-05-19 17:23 ` [PATCH v2 06/28] lib/printbuf: Tabstops, indenting Kent Overstreet
2022-05-19 17:24 ` Kent Overstreet [this message]
2022-05-19 20:21   ` [PATCH v2 07/28] lib/printbuf: Unit specifiers Andy Shevchenko
2022-05-19 20:26     ` Kent Overstreet
2022-05-19 21:11       ` Matthew Wilcox
2022-05-20  4:40         ` Kent Overstreet
2022-05-19 21:16       ` Andy Shevchenko
2022-05-19 21:22         ` Matthew Wilcox
2022-05-20  4:36         ` Kent Overstreet
2022-05-19 17:24 ` [PATCH v2 08/28] lib/pretty-printers: pr_string_option(), pr_bitflags() Kent Overstreet
2022-05-19 17:24 ` [PATCH v2 09/28] vsprintf: Improve number() Kent Overstreet
2022-05-19 17:24 ` [PATCH v2 10/28] vsprintf: pr_u64_minwidth(), pr_u64() Kent Overstreet
2022-05-19 17:24 ` [PATCH v2 11/28] vsprintf: Lift pr_hex_bytes() out from hex_string() Kent Overstreet
2022-05-19 17:24 ` [PATCH v2 12/28] test_printf: Drop requirement that sprintf not write past nul Kent Overstreet
2022-05-19 17:24 ` [PATCH v2 13/28] vsprintf: Start consolidating printf_spec handling Kent Overstreet
2022-05-19 17:24 ` [PATCH v2 14/28] vsprintf: Refactor resource_string() Kent Overstreet
2022-05-19 17:24 ` [PATCH v2 15/28] vsprintf: Refactor fourcc_string() Kent Overstreet
2022-05-19 17:24 ` [PATCH v2 16/28] vsprintf: Refactor ip_addr_string() Kent Overstreet
2022-05-19 17:24 ` [PATCH v2 17/28] vsprintf: Refactor mac_address_string() Kent Overstreet
2022-05-19 17:24 ` [PATCH v2 18/28] vsprintf: time_and_date() no longer takes printf_spec Kent Overstreet
2022-05-19 17:24 ` [PATCH v2 19/28] vsprintf: flags_string() " Kent Overstreet
2022-05-19 17:24 ` [PATCH v2 20/28] vsprintf: Refactor device_node_string, fwnode_string Kent Overstreet
2022-05-19 17:24 ` [PATCH v2 21/28] vsprintf: Refactor hex_string, bitmap_string_list, bitmap_string Kent Overstreet
2022-05-19 17:24 ` [PATCH v2 22/28] Input/joystick/analog: Convert from seq_buf -> printbuf Kent Overstreet
2022-05-19 20:04   ` Andy Shevchenko
2022-05-19 20:19     ` Kent Overstreet
2022-05-19 21:09       ` Andy Shevchenko
2022-05-19 17:24 ` [PATCH v2 23/28] mm/memcontrol.c: Convert to printbuf Kent Overstreet
2022-05-20  7:59   ` Michal Hocko
2022-05-19 17:24 ` [PATCH v2 24/28] clk: tegra: bpmp: " Kent Overstreet
2022-05-19 17:24 ` [PATCH v2 25/28] tools/testing/nvdimm: " Kent Overstreet
2022-05-19 17:24 ` [PATCH v2 26/28] powerpc: " Kent Overstreet
2022-05-19 17:24   ` Kent Overstreet
2022-05-19 17:24 ` [PATCH v2 27/28] x86/resctrl: " Kent Overstreet
2022-05-19 17:24 ` [PATCH v2 28/28] PCI/P2PDMA: " Kent Overstreet
2022-05-26 14:44 ` [PATCH v2 00/28] Printbufs (now with more printbufs!) Petr Mladek
2022-05-26 15:11   ` Kent Overstreet

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=20220519172421.162394-8-kent.overstreet@gmail.com \
    --to=kent.overstreet@gmail.com \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@vger.kernel.org \
    --cc=pmladek@suse.com \
    --cc=rostedt@goodmis.org \
    --cc=senozhatsky@chromium.org \
    --cc=willy@infradead.org \
    /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.