Received: by 2002:a05:6358:e9c4:b0:b2:91dc:71ab with SMTP id hc4csp4275745rwb; Sun, 7 Aug 2022 20:06:09 -0700 (PDT) X-Google-Smtp-Source: AA6agR7Eql+qdYgTgI4qD1mvucJx12BAlzmsYMOcCVNGb1fn316nhZDC0WJnJUDpgb+CpgNgZd9l X-Received: by 2002:a17:906:9b83:b0:730:b3ae:343 with SMTP id dd3-20020a1709069b8300b00730b3ae0343mr12893538ejc.670.1659927968929; Sun, 07 Aug 2022 20:06:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1659927968; cv=none; d=google.com; s=arc-20160816; b=ZLnqMTDYzmt93e+Es6x4tuDTDoHZ7KO5NbLunW1cpYKPUAUGt72jQwxySdqNXJZ78F hf8+Su6cIdYhTa0eMfaMzsn0UqATmg59G1KuWjsVAasbIIoLIyGVw0tpgpWKykcH1VX8 C0DEbJ9jml/6IQLoTm4uCGoPzQjJZ7l7BMQ39MYbHxEmm/wLzTGvAjKJKy0jCSNyb3ex +8MmjrpBRVUJMUIi/kYLzAfhrxyM40G5AvNgtAxP9Y0RbmLKTSdKIM+a8tuJTevVRwQk 8BTQ1DC+VmSUlEXR5q1RjUyI2BP5lifkcr4cXCJkoGIMgbxpSIvVK44RwUzU7+ao1RVi ffcQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=0Phd27slBhf2oZB2+aKxZkfRmOzBSjVGNr+tezYnifU=; b=xkcrS/v0okttYAkjw+3t33ko/Nf5LiMFjyy2wN9qRrg1ap5MeIMh7ru639oqTIqsvb VvYEwDRFtP+T7MOKLRT6mqBY0YwGS2dBj9XEYSZfpHekxa3x7vyl0ELOyrH9uuCISsrV z7hMg7QJWoIx7/8qfi9jrwQbI7Ky04Djjy7wyGe/MaSDJLem4cwvlsmbos0oZ+T2qSyh Uqb4A42XIuJd4F4mI1p01QJqNYriJcvWaVuZ5+KdLMk95hVQZivrUdMI6lJZKa7BuyWV lydCAk4Ou9CT+gO/gs2SNOC9XI6qSgr7UwJ2sHL/mgisVKiMiT+W3vA3Z+l6HMb5oymH Hpsw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@infradead.org header.s=casper.20170209 header.b=IadeLGs4; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id h10-20020a05640250ca00b004408bac1e00si3180395edb.103.2022.08.07.20.05.44; Sun, 07 Aug 2022 20:06:08 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@infradead.org header.s=casper.20170209 header.b=IadeLGs4; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242981AbiHHClw (ORCPT + 99 others); Sun, 7 Aug 2022 22:41:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60986 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234929AbiHHClj (ORCPT ); Sun, 7 Aug 2022 22:41:39 -0400 Received: from casper.infradead.org (casper.infradead.org [IPv6:2001:8b0:10b:1236::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 16AFE21A8 for ; Sun, 7 Aug 2022 19:41:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:Subject:To:From:Sender:Reply-To:Cc: Content-Type:Content-ID:Content-Description; bh=0Phd27slBhf2oZB2+aKxZkfRmOzBSjVGNr+tezYnifU=; b=IadeLGs48NTANaTLlCZ9j21PjY Y0NUj07GBC+dsXzPSMJvJNTKqJxhF4rHIoQGSKZNFvjxwVM7N8L745psCWispeSCSMJEWCv/BVAmT XWKkYYEVEkH54k2fBQVjvq62LsJce73njhhAEa42aMBzpgEVUMtOsPCQglS/DDwgSuwYjABXnVKLd qE0FpjqFOvJ3xoJLiunrfr4uMZW3y9em32+82YmR+2cBJ6b8iVI2E9xFLd07lXUfE9597xe9d+lQH itWNTKFo8CYmqCCOtcm7GxT+xujybOqpzPBzB+c/H525KOiWrVEkiJJWwukssQXv+cdSYO3DNkIuq oyvLOH+Q==; Received: from willy by casper.infradead.org with local (Exim 4.94.2 #2 (Red Hat Linux)) id 1oKshx-00DVRe-98; Mon, 08 Aug 2022 02:41:33 +0000 From: "Matthew Wilcox (Oracle)" To: linux-kernel@vger.kernel.org, pmladek@suse.com, Kent Overstreet Subject: [PATCH v5 08/32] lib/printbuf: Unit specifiers Date: Mon, 8 Aug 2022 03:41:04 +0100 Message-Id: <20220808024128.3219082-9-willy@infradead.org> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20220808024128.3219082-1-willy@infradead.org> References: <20220808024128.3219082-1-willy@infradead.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_NONE, SPF_NONE,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Kent Overstreet 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 --- 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 c1a482b6c0a8..ebbc4a55fc04 100644 --- a/include/linux/printbuf.h +++ b/include/linux/printbuf.h @@ -57,11 +57,20 @@ * * Make sure you use prt_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. prt_units() obeys it. */ #include #include +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; @@ -75,6 +84,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]; }; @@ -88,6 +99,10 @@ void printbuf_indent_add(struct printbuf *, unsigned); void printbuf_indent_sub(struct printbuf *, unsigned); void prt_tab(struct printbuf *); void prt_tab_rjust(struct printbuf *); +void prt_human_readable_u64(struct printbuf *, u64); +void prt_human_readable_s64(struct printbuf *, s64); +void prt_units_u64(struct printbuf *, u64); +void prt_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 395c681e3acb..047470025748 100644 --- a/lib/printbuf.c +++ b/lib/printbuf.c @@ -10,6 +10,7 @@ #include #include +#include #include static inline size_t printbuf_linelen(struct printbuf *buf) @@ -199,3 +200,59 @@ void prt_tab_rjust(struct printbuf *buf) buf->tabstop++; } EXPORT_SYMBOL(prt_tab_rjust); + +/** + * prt_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 prt_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_size(buf)); +} +EXPORT_SYMBOL(prt_human_readable_u64); + +/** + * prt_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 prt_human_readable_s64(struct printbuf *buf, s64 v) +{ + if (v < 0) + prt_char(buf, '-'); + prt_human_readable_u64(buf, abs(v)); +} +EXPORT_SYMBOL(prt_human_readable_s64); + +/** + * prt_units_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 prt_units_u64(struct printbuf *out, u64 v) +{ + if (out->human_readable_units) + prt_human_readable_u64(out, v); + else + prt_printf(out, "%llu", v); +} +EXPORT_SYMBOL(prt_units_u64); + +/** + * prt_units_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 prt_units_s64(struct printbuf *out, s64 v) +{ + if (v < 0) + prt_char(out, '-'); + prt_units_u64(out, abs(v)); +} +EXPORT_SYMBOL(prt_units_s64); -- 2.35.1