Received: by 2002:a05:6358:4e97:b0:b3:742d:4702 with SMTP id ce23csp1943130rwb; Sun, 14 Aug 2022 16:51:43 -0700 (PDT) X-Google-Smtp-Source: AA6agR4wfNQnXYZfl6tcI/mJ/i+y5qLtJkaeT7+b5W3C9V/7SrqrpvpRkEQf/zbfxqBrF/cnMN6f X-Received: by 2002:a17:90b:180f:b0:1f4:e294:d322 with SMTP id lw15-20020a17090b180f00b001f4e294d322mr25413018pjb.163.1660521103712; Sun, 14 Aug 2022 16:51:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660521103; cv=none; d=google.com; s=arc-20160816; b=czlLvvbyZu5vSBIxxCguKfJVFWhnxC99ja0N2PArriJLV6YWJcOQtESGUWCRl/QRm1 JXSOpSbPInscvmn7LbZYJ1/x/yh3cQGzxYtEk+NJh8L/Z8spuO8L6XnqzOLXJ2XI4nvN 0EFe7YbNczzKBx8C7VeNwEoL3TsWrUas69hWTmzERzVvwwzJVWSjuOLF+gy3xXOKp34g JJwS2jK53QdQBlMPLYy7JDlhmYEWhoufRZbOJ7v5OiRE+6rfB33Ku0NI53eeTfKmQNkx 8tTOZbxSetRX6pdnm88UAQHSQx6ABb5iymKa+1Gpg7bxbYTNl/rKrYmK6kiIJw1TCZTy CPmQ== 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=ZVFZnUSv4LU/k4o/AQOMyq1rkKuyBfrcSzAE/+TqtNc=; b=XVaR/pQ3RVfXRoVviM1FuITns1eaxKe3oJ8i17TAqIJP9wj5eHOYhFhculRcvKf7lS x2p431W8ssuwou0e+U3WRUKnZLDwefdcHGuxAItI9tSySBLy0qc1QaZlCxK1wtfYRkrv EyhicLTNH3+jdQtaQsPtvhNqT3fVbX51aU5l5ziL3ZpC79G2mSuy134r1E8ueIGDPfLb KVro1z5zaRMgzgySNr+jP+NlJU4k+m6DNhsWkuROjicerdmHjKl9g4u7EUbn3Ioquqbi EB2kIF3n8N8ber1BXNpIevMHStqzriOc989qWN4S0R2uZgBbIKT5y830s6Ka3xz5ifJ9 MDWQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linux.dev header.s=key1 header.b=cJBmffJ9; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linux.dev Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id m11-20020a170902db0b00b0016d981eb1bdsi9766569plx.336.2022.08.14.16.51.32; Sun, 14 Aug 2022 16:51:43 -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=@linux.dev header.s=key1 header.b=cJBmffJ9; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linux.dev Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240557AbiHNVVk (ORCPT + 99 others); Sun, 14 Aug 2022 17:21:40 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57372 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240420AbiHNVUx (ORCPT ); Sun, 14 Aug 2022 17:20:53 -0400 Received: from out0.migadu.com (out0.migadu.com [94.23.1.103]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5AC52BC8E for ; Sun, 14 Aug 2022 14:20:46 -0700 (PDT) X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1660512045; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ZVFZnUSv4LU/k4o/AQOMyq1rkKuyBfrcSzAE/+TqtNc=; b=cJBmffJ939a2Pkhga1WomL8kabW9at1ZwYHpmpstrDzawB1GKEoR8zFEgxlUp4CnDLHMg1 UqVzSSPrGG24ANJQDSDPiNLcpV4T2f84OjmbITcpfZy/1Krc2jFZCBBqeXjsBTryakXs6p ZoDmpL5LNXt8uDDwN7KdC95BKF7nOhU= From: Kent Overstreet To: akpm@linux-foundation.org Cc: linux-kernel@vger.kernel.org, Kent Overstreet Subject: [PATCH 08/32] lib/printbuf: Unit specifiers Date: Sun, 14 Aug 2022 17:19:47 -0400 Message-Id: <20220814212011.1727798-9-kent.overstreet@linux.dev> In-Reply-To: <20220814212011.1727798-1-kent.overstreet@linux.dev> References: <20220814212011.1727798-1-kent.overstreet@linux.dev> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Migadu-Flow: FLOW_OUT X-Migadu-Auth-User: linux.dev X-Spam-Status: No, score=-2.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_LOW,SPF_HELO_PASS, SPF_PASS,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 c1a482b6c0..ebbc4a55fc 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 395c681e3a..0474700257 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.36.1