Received: by 2002:a5d:9c59:0:0:0:0:0 with SMTP id 25csp134697iof; Sun, 5 Jun 2022 23:24:04 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy0dsYmm701Uq7R3NUxggdKBETbesoNwphyuXAn1UV7ikBrpHd0ADbiwhLixVbjX+2jxdTq X-Received: by 2002:aa7:8008:0:b0:51a:cae3:7563 with SMTP id j8-20020aa78008000000b0051acae37563mr46049559pfi.16.1654496643913; Sun, 05 Jun 2022 23:24:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1654496643; cv=none; d=google.com; s=arc-20160816; b=kQd39nuuwMsXR8dcihqDrRylOALqV70ulZq+knT/Bbeim4eL6sJChDxU7DgKsZKkth D3t24YMmMfQr3zoWQLwI96i0yXit3HhbYol0uMBG0hGz+uDxrr18rEc2Ago9wR0vrwTd mrs0356CqPhsOshPCDItmCB9fOyOxQSLGEswEk/kNwcLf0ieZWr+E1Ny2yOX/xOFbRSJ OzjBu1YTYbLDFD9GelkpiBsM1DgFrgiRwMI2P+bFN0P8v66kS2m27J5NrfaSBmB9Pd4B vvY6tAyzFp5yQeXvE0s6caXcGppuhI8ERCNCmam9pP/D6EgL4EWZsHrw+0FAkRIrz1Vm 9gYQ== 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:cc:to:from :dkim-signature; bh=sKb2EhCeklsdRsNI2YgRpJ34oLvZStS1bp2Vbt3uYtI=; b=1K/kThbP8yoyA+xfYqtxw0By+gZ6Mbp3ky1AW+z9pFec4Moz0Wb7XT4tOy0MggcoLt /bR95VjF6roG9AQIul2XT3fbtLIuzxvYbqcKE+/IQsGvZ+YA3W7R9yb2bDl80mZqCTAw PB2WPq6eyBMpO2U9mHKy3OTz4sUAecmYD2l6aaFi2FxY5zzalLTxn6B5URJHmKHI6g/E 4gXUIlVSyKiSzt5yOoQkA9XHYPv3oYvB4Zou5FRdEfn2MAyR2sbFGdi2Hx16Q2pOHtE6 G2nGFyadmMS2/2DlKe/jlKgPKz8ps53AOV6n9p6a5pdV8h6i+/fMl0m23rUiyPRkq2Mh +FQA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=c5Mv+jem; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id t15-20020a63b70f000000b003fcdc3249b8si207631pgf.494.2022.06.05.23.24.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Jun 2022 23:24:03 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=c5Mv+jem; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 9A13812B025; Sun, 5 Jun 2022 22:06:35 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240308AbiFDTbe (ORCPT + 99 others); Sat, 4 Jun 2022 15:31:34 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47194 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240093AbiFDTbI (ORCPT ); Sat, 4 Jun 2022 15:31:08 -0400 Received: from mail-qt1-x830.google.com (mail-qt1-x830.google.com [IPv6:2607:f8b0:4864:20::830]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D411D3388E for ; Sat, 4 Jun 2022 12:31:04 -0700 (PDT) Received: by mail-qt1-x830.google.com with SMTP id x16so4677545qtw.12 for ; Sat, 04 Jun 2022 12:31:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=sKb2EhCeklsdRsNI2YgRpJ34oLvZStS1bp2Vbt3uYtI=; b=c5Mv+jemCw0Zq3bfauzSeyeEO6D4d5jCRvMdGwhV3PqzD7pmreLQcvL9GujP2zip4/ PABVDtalGEr20tVUR/7VVLgh7TLH2VQ7a24DfvZV8ftkt2GiQkmdC0O6GI1nxt5YmInH a0kWKsGb4gnfzaR68WRErtBIZ4r1PMyeXkR8zTzhkZ3XUmR6/g/23sVrhxzpimqtIbQV HHo2FakfY2dCANg/NncP23lRjPjvepLgtQksqIsqWd/NNPM8GCLIzMCjFQEGOf6cZawd il8cRaj5y78QXRGLlV6aSA1QclGJMI9xJ2tTtgpL3rG6EdvQBcm2INoLSDTpMl4sEfzP RvLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=sKb2EhCeklsdRsNI2YgRpJ34oLvZStS1bp2Vbt3uYtI=; b=n46Z6alNP8mDZaon22v4TshwWfYBVQi1ZPhE7th3sDor+O1s2/Gqqpw1GNauIbQcwu bxxZYZHWx+UfgeJKf+0kcqt99xGPFliSM5xrDGfx7vHpjhm8c8vwgXzfffovvFcwTXbH 5PSZl4EyfkBiKe7ndviL4ebyKm1cZkI/SznIFPpJ+kkmsrkZbJl1vFRB1EiS8rJ7A6ZW fTCUVBiW9kvCeNkkwEH/1m1L8WGaVX3XyEvhbmdJ2mvvAwFycv6TkKs5gadWkBO9HGu1 vVG2+CcVRN8cN3iD84nMMdb7fnNdXefsAw9gkJsVo+w37YfNePz2nlssOqlIwXd37ELK 70SQ== X-Gm-Message-State: AOAM5337pkNyAcCF65qF/AhJKbhAaWnbXU3K5ZKl6bDe0RRvG4JSNRKl 5dyZp5CI0+UpeAD82DHsJ9keNr6Xyw4U X-Received: by 2002:ac8:7f92:0:b0:304:c4c0:f032 with SMTP id z18-20020ac87f92000000b00304c4c0f032mr12759448qtj.273.1654371063506; Sat, 04 Jun 2022 12:31:03 -0700 (PDT) Received: from moria.home.lan (c-73-219-103-14.hsd1.vt.comcast.net. [73.219.103.14]) by smtp.gmail.com with ESMTPSA id o17-20020ac84291000000b00304defdb1b3sm3537426qtl.85.2022.06.04.12.31.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 04 Jun 2022 12:31:02 -0700 (PDT) From: Kent Overstreet To: linux-kernel@vger.kernel.org Cc: Kent Overstreet , pmladek@suse.com, rostedt@goodmis.org Subject: [PATCH v3 09/33] lib/printbuf: Unit specifiers Date: Sat, 4 Jun 2022 15:30:18 -0400 Message-Id: <20220604193042.1674951-10-kent.overstreet@gmail.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220604193042.1674951-1-kent.overstreet@gmail.com> References: <20220604193042.1674951-1-kent.overstreet@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RDNS_NONE, SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no 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 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 8fb074eb67..9d6c951626 100644 --- a/include/linux/printbuf.h +++ b/include/linux/printbuf.h @@ -53,10 +53,19 @@ * * 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 +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 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 e11a504abf..88f1f34fe6 100644 --- a/lib/printbuf.c +++ b/lib/printbuf.c @@ -9,6 +9,7 @@ #endif #include +#include #include static inline size_t printbuf_linelen(struct printbuf *buf) @@ -193,3 +194,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.36.0