Received: by 2002:a05:6a11:4021:0:0:0:0 with SMTP id ky33csp256325pxb; Mon, 13 Sep 2021 18:32:25 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzzAjYCl+SLzJobO3XX/fKjYq8v2R5HBIACqCQIL4/WfzYUsRvlD5Ap1bGtUqculHRdV+we X-Received: by 2002:aa7:c04a:: with SMTP id k10mr16990754edo.32.1631583145480; Mon, 13 Sep 2021 18:32:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1631583145; cv=none; d=google.com; s=arc-20160816; b=S7U2fYdFMX57OUEC3MvAVheB0CLI+Dlo8ebmQO6SIRgF2PRN/zZoyNV9j57O8YgInL Ii3VfJDcJ8QV4QVg1OxXpjGd9OlRlbOCbD0gfFtssUt/W7mQZGlHb1JoKeG/E14qlLqM LR3xwO7iL1QfnunnT4E3d8fKoH63ZGg8pFRqtCTRZe4j+5Fdq41hKNvh1lSa8SqV2GkC dlhgCSAyofOs5sdbqSiXvs+GGeaQlpJboaAIHJPKt4HD8UpoICL3zqv/C23/x2HeDlTB 0pk2zvWo8Dc39+cDwb1tSctyetDYLqrIzGmyITWMXtYgd3jWmDJqMVkBM50m6QMmCJAq GmnA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date; bh=wVqJqSyDyMfUBUilqAoZSyuz2TRGwRwKaJ2LLNDxei8=; b=wKlKCrwUt8e831xZ0dD+NxGJr1/QPRn9dwxNznO/2LBiMYOFM69g0bMm2O21yNp2/A 6s9wAvsQhJZOFfw9bijOJT31IHzHIVBYR2AkHPlJ4IKwcrStMfyDMHecK+aI0RdGkrPf o7u+rCNGIAoc3nd2NpVYneRC4CWGy11JhNGhHBFKlxpe16YuDGn399NCys9PkOOXOZuW zQHW9PSu1KgUP4BxB95UBwiHIscQ9yXw5dAeDJl7wBQYFSQ5pPYLlCA1lBA8HRILvhBQ D6KYrsBSlQ0sj1Bejk6C1iHJXtSIUiAb9H4tHh+onYnTj0HwpmxthB5bhv93jtOm4IdJ Zj/w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id h15si8930443ede.550.2021.09.13.18.32.02; Mon, 13 Sep 2021 18:32:25 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232859AbhINBVy (ORCPT + 99 others); Mon, 13 Sep 2021 21:21:54 -0400 Received: from mail107.syd.optusnet.com.au ([211.29.132.53]:49441 "EHLO mail107.syd.optusnet.com.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230131AbhINBVx (ORCPT ); Mon, 13 Sep 2021 21:21:53 -0400 Received: from dread.disaster.area (pa49-195-238-16.pa.nsw.optusnet.com.au [49.195.238.16]) by mail107.syd.optusnet.com.au (Postfix) with ESMTPS id 3CFD9ECB25A; Tue, 14 Sep 2021 11:20:30 +1000 (AEST) Received: from dave by dread.disaster.area with local (Exim 4.92.3) (envelope-from ) id 1mPx7d-00CCJV-0Z; Tue, 14 Sep 2021 11:20:29 +1000 Date: Tue, 14 Sep 2021 11:20:29 +1000 From: Dave Chinner To: Greg Kroah-Hartman Cc: Christoph Hellwig , "Rafael J. Wysocki" , Alexander Viro , Jens Axboe , Tejun Heo , linux-block@vger.kernel.org, linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH 13/13] xfs: convert xfs_sysfs attrs to use ->seq_show Message-ID: <20210914012029.GF2361455@dread.disaster.area> References: <20210913054121.616001-1-hch@lst.de> <20210913054121.616001-14-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Optus-CM-Score: 0 X-Optus-CM-Analysis: v=2.3 cv=YKPhNiOx c=1 sm=1 tr=0 a=DzKKRZjfViQTE5W6EVc0VA==:117 a=DzKKRZjfViQTE5W6EVc0VA==:17 a=kj9zAlcOel0A:10 a=7QKq2e-ADPsA:10 a=7-415B0cAAAA:8 a=hM_N2pAvqWJ6tqKoahEA:9 a=CjuIK1q_8ugA:10 a=biEYGPWJfzWAr4FL6Ov7:22 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Sep 13, 2021 at 08:27:50AM +0200, Greg Kroah-Hartman wrote: > On Mon, Sep 13, 2021 at 07:41:21AM +0200, Christoph Hellwig wrote: > > Trivial conversion to the seq_file based sysfs attributes. > > > > Signed-off-by: Christoph Hellwig > > --- > > fs/xfs/xfs_stats.c | 24 +++++------- > > fs/xfs/xfs_stats.h | 2 +- > > fs/xfs/xfs_sysfs.c | 96 +++++++++++++++++++++++----------------------- > > 3 files changed, 58 insertions(+), 64 deletions(-) > > > > diff --git a/fs/xfs/xfs_stats.c b/fs/xfs/xfs_stats.c > > index 20e0534a772c9..71e7a84ba0403 100644 > > --- a/fs/xfs/xfs_stats.c > > +++ b/fs/xfs/xfs_stats.c > > @@ -16,10 +16,9 @@ static int counter_val(struct xfsstats __percpu *stats, int idx) > > return val; > > } > > > > -int xfs_stats_format(struct xfsstats __percpu *stats, char *buf) > > +void xfs_stats_format(struct xfsstats __percpu *stats, struct seq_file *sf) > > { > > int i, j; > > - int len = 0; > > uint64_t xs_xstrat_bytes = 0; > > uint64_t xs_write_bytes = 0; > > uint64_t xs_read_bytes = 0; > > @@ -58,13 +57,12 @@ int xfs_stats_format(struct xfsstats __percpu *stats, char *buf) > > /* Loop over all stats groups */ > > > > for (i = j = 0; i < ARRAY_SIZE(xstats); i++) { > > - len += scnprintf(buf + len, PATH_MAX - len, "%s", > > - xstats[i].desc); > > + seq_printf(sf, "%s", xstats[i].desc); > > + > > /* inner loop does each group */ > > for (; j < xstats[i].endpoint; j++) > > - len += scnprintf(buf + len, PATH_MAX - len, " %u", > > - counter_val(stats, j)); > > - len += scnprintf(buf + len, PATH_MAX - len, "\n"); > > + seq_printf(sf, " %u", counter_val(stats, j)); > > + seq_printf(sf, "\n"); > > } > > /* extra precision counters */ > > for_each_possible_cpu(i) { > > @@ -74,18 +72,14 @@ int xfs_stats_format(struct xfsstats __percpu *stats, char *buf) > > defer_relog += per_cpu_ptr(stats, i)->s.defer_relog; > > } > > > > - len += scnprintf(buf + len, PATH_MAX-len, "xpc %Lu %Lu %Lu\n", > > + seq_printf(sf, "xpc %Lu %Lu %Lu\n", > > xs_xstrat_bytes, xs_write_bytes, xs_read_bytes); > > - len += scnprintf(buf + len, PATH_MAX-len, "defer_relog %llu\n", > > - defer_relog); > > - len += scnprintf(buf + len, PATH_MAX-len, "debug %u\n", > > + seq_printf(sf, "defer_relog %llu\n", defer_relog); > > #if defined(DEBUG) > > - 1); > > + seq_printf(sf, "debug 1\n"); > > #else > > - 0); > > + seq_printf(sf, "debug 0\n"); > > #endif > > - > > - return len; > > } > > That is a sysfs file? What happened to the "one value per file" rule > here? There is no "rule" that says syfs files must contain one value per file; the documentation says that one value per file is the "preferred" format. Documentation/filesystems/sysfs.rst: [...] Attributes ... Attributes should be ASCII text files, preferably with only one value per file. It is noted that it may not be efficient to contain only one value per file, so it is socially acceptable to express an array of values of the same type. [...] We are exposing a large array of integer values here, so multiple values per file are explicitly considered an acceptible format. Further, as there are roughly 200 individual stats in this file and calculating each stat requires per-cpu aggregation, the the cost of calculating and reading each stat individually is prohibitive, not just inefficient. So, yes, we might have multiple lines in the file that you can frown about, but OTOH the file format has been exposed as a kernel ABI for a couple of decades via /proc/fs/xfs/stat. Hence exposing it in sysfs to provide a more fine-grained breakdown of the stats (per mount instead of global) is a no-brainer. We don't have to rewrite the parsing engines in multiple userspace monitoring programs to extract this information from the kernel - they just create a new instance and read a different file and it all just works. Indeed, there's precedence for such /proc file formats in more fine-grained sysfs files. e.g. /sys/bus/node/devices/node/vmstat and /sys/bus/node/devices/node/meminfo retain the same format (and hence userspace parsers) for the per-node stats as /proc/vmstat and /proc/meminfo use for the global stats... tl;dr: the file contains arrays of values, it's inefficient to read values one at a time, it's a pre-existing ABI-constrainted file format, there's precedence in core kernel statistics implementations and the documented guidelines allow this sort of usage in these cases. Cheers, Dave. -- Dave Chinner david@fromorbit.com