Received: by 2002:a25:d7c1:0:0:0:0:0 with SMTP id o184csp2385308ybg; Thu, 24 Oct 2019 08:57:50 -0700 (PDT) X-Google-Smtp-Source: APXvYqxQMhi5dk3wDc9LC+2DwRlr7FRzwOWuk2d2UoH5amQAI7xw7+J3EyVkuVNKHGjYNfuMHf0q X-Received: by 2002:aa7:c387:: with SMTP id k7mr16556155edq.273.1571932670175; Thu, 24 Oct 2019 08:57:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1571932670; cv=none; d=google.com; s=arc-20160816; b=T+DhNIE3YfWN90an6kxghaesEp4iYjc2OwTaR3hGXX6Np8A2B+ldJM7m2Jjsps28xA R4AACGH4xvaEA2RZC2uKz9NaK5D6i1HnowE5YCELzmqip6TXpX0AwdOGe1H30XKbJuZP QPIINK1NI8+pQUd22WXlS8vjGhKAlKWP5AjLo/HfBDSWye90j/XlGZXajuYlzaRaYQcr MkOT5bEGVKujzVp6XPx43Q6HHYK3L4wCr37XfhwRFUAxeAyDZi/y38G9oNZvSii4EawD O9xc7JwlqzyUxf2FFFHpqUgsaCj1tZQ8pcf0jY0zkzIRiaNCUp6FRGx1KdwdNY0JFXm6 RnkQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:from:subject:references :mime-version:message-id:in-reply-to:date:dkim-signature; bh=5fjuRPiGbd4dGSpwVvC9erNP0hG41pRC8n50P8n1Dpc=; b=eI+ktqPghRZFAoHg6r+4hrQeMaKEuG3FGkLHuHHU8AZYpI2KnnsScX3lLITtFpdUV1 I2DzZfhODGkokAaahPTzBKhF0ds1DsJh39ebnvQ2EdA+UMyuHAvBPN/0lUl8lPV0eexU NNcw1j5jGOvR2MbMyPd9PQsHe0jSpnL5xY1eUZGFlb4DOa8xQeWf1uFdWWux2D5CPzgx coE1vilF9bw6O2eKeL+K+8+j1LYtuYLndXSN2llLvrMsrwAIxlLVqxfmLxkNqSeiqn76 SCnxT6RdDNnAQzmkQgbB8Gs9u3eCb8Irx053JjKpEf+BhhQ9SG798UNWo/2UcPXYcxPk ii6w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=JL4LP+oo; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 19si4287013edz.85.2019.10.24.08.57.25; Thu, 24 Oct 2019 08:57:50 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=JL4LP+oo; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2392687AbfJWVtA (ORCPT + 99 others); Wed, 23 Oct 2019 17:49:00 -0400 Received: from mail-pf1-f201.google.com ([209.85.210.201]:39230 "EHLO mail-pf1-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2390204AbfJWVs7 (ORCPT ); Wed, 23 Oct 2019 17:48:59 -0400 Received: by mail-pf1-f201.google.com with SMTP id b13so17238617pfp.6 for ; Wed, 23 Oct 2019 14:48:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=5fjuRPiGbd4dGSpwVvC9erNP0hG41pRC8n50P8n1Dpc=; b=JL4LP+oo7ROHKI0jl/60dAWVbx09mM9XNtpWqkNyEwM0fPRQ0zjec5pPbdnkw3y3Oh UdlFKcWVdd99951f3ojPAdHZ6jtQ/RJa7drImCnO9ghi06JD6+xDJ6WJlDtYYZ4MtuV4 3WC3lZfpe10N2NGzmw7zCGxLdtwtxmiIQJ5FYUnCIUhL3rawvXdBsHufcQ5E35hUgfSJ YuvClbEvwZAyUOYuKfiF/H0PDZ43CF/jaUUkmCc+e6zRV8ut/wgIdCOqFKkVyvfCGZSW WjaWm87u1/EqNJaq6cFzDuhAK/1DKJ7HA/BOdtCopB2qnSptVwRfsro6AVWjyIYXi/Z8 ah8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=5fjuRPiGbd4dGSpwVvC9erNP0hG41pRC8n50P8n1Dpc=; b=gC7KoPCK/5lVyamntsXFa0n2BB02TUcGa7PZYZNeuCAFZAeQTr2l0TjC4K0rMtOQ2e SbxaVbtswLhBa5g5zY2gPoYg0hgI/rYKFiFlRcb1eFW+Ry+K8z8lzRDg2cCyS5yap22F sMpnTpJfSF8FqzPIdnvXrpkysjbM+JkULSm9z/sj64cLi90h4fWF0uAkLw0x/jS9CJ43 B2b4WhTh2U3Cj4lVVJYJoWn2IiVLmLQQOAl6no+dYbMO3c4XyGL9TUjH1DSMWd6sVKZo avGTjCY9kMN2xANyUuoui4Vqzrw0HCKgrnQ2T79V0xWgYh9yP3TBSehN0mVhkoY6G0Yj 3zPw== X-Gm-Message-State: APjAAAUDCQzGxGn5Wl4KDX/xm1CD+zfFW4zIx2A5VT5V40DEr8gWEbN4 QnPwtDfrihdrE7fjCCCzzDTbpUn9OPU= X-Received: by 2002:a63:b211:: with SMTP id x17mr12585601pge.51.1571867336997; Wed, 23 Oct 2019 14:48:56 -0700 (PDT) Date: Wed, 23 Oct 2019 14:48:20 -0700 In-Reply-To: <20191023214821.107615-1-hridya@google.com> Message-Id: <20191023214821.107615-2-hridya@google.com> Mime-Version: 1.0 References: <20191023214821.107615-1-hridya@google.com> X-Mailer: git-send-email 2.23.0.866.gb869b98d4c-goog Subject: [PATCH 2/2] f2fs: Add f2fs stats to sysfs From: Hridya Valsaraju To: Jaegeuk Kim , Chao Yu , linux-f2fs-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org Cc: kernel-team@android.com, Hridya Valsaraju Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Currently f2fs stats are only available from /d/f2fs/status. This patch adds some of the f2fs stats to sysfs so that they are accessible even when debugfs is not mounted. The following sysfs nodes are added: -/sys/fs/f2fs//free_segments -/sys/fs/f2fs//cp_foreground_calls -/sys/fs/f2fs//cp_background_calls -/sys/fs/f2fs//gc_foreground_calls -/sys/fs/f2fs//gc_background_calls -/sys/fs/f2fs//moved_blocks_foreground -/sys/fs/f2fs//moved_blocks_background -/sys/fs/f2fs//avg_vblocks Signed-off-by: Hridya Valsaraju --- Documentation/ABI/testing/sysfs-fs-f2fs | 47 +++++++++++ fs/f2fs/debug.c | 2 +- fs/f2fs/f2fs.h | 2 + fs/f2fs/sysfs.c | 103 ++++++++++++++++++++++++ 4 files changed, 153 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/sysfs-fs-f2fs b/Documentation/ABI/testing/sysfs-fs-f2fs index 8f79a9acefcf..ba4fadf4b78f 100644 --- a/Documentation/ABI/testing/sysfs-fs-f2fs +++ b/Documentation/ABI/testing/sysfs-fs-f2fs @@ -253,3 +253,50 @@ Contact: "Daniel Rosenberg" Description: If checkpoint=disable, it displays the number of blocks that are unusable. If checkpoint=enable it displays the enumber of blocks that would be unusable if checkpoint=disable were to be set. + +What: /sys/fs/f2fs//free_segments +Date: September 2019 +Contact: "Hridya Valsaraju" +Description: Number of free segments in disk. + +What: /sys/fs/f2fs//cp_foreground_calls +Date: September 2019 +Contact: "Hridya Valsaraju" +Description: Number of checkpoint operations performed on demand. Available when + CONFIG_F2FS_STAT_FS=y. + +What: /sys/fs/f2fs//cp_background_calls +Date: September 2019 +Contact: "Hridya Valsaraju" +Description: Number of checkpoint operations performed in the background to + free segments. Available when CONFIG_F2FS_STAT_FS=y. + +What: /sys/fs/f2fs//gc_foreground_calls +Date: September 2019 +Contact: "Hridya Valsaraju" +Description: Number of garbage collection operations performed on demand. + Available when CONFIG_F2FS_STAT_FS=y. + +What: /sys/fs/f2fs//gc_background_calls +Date: September 2019 +Contact: "Hridya Valsaraju" +Description: Number of garbage collection operations triggered in background. + Available when CONFIG_F2FS_STAT_FS=y. + +What: /sys/fs/f2fs//moved_blocks_foreground +Date: September 2019 +Contact: "Hridya Valsaraju" +Description: Number of blocks moved by garbage collection in foreground. + Available when CONFIG_F2FS_STAT_FS=y. + +What: /sys/fs/f2fs//moved_blocks_background +Date: September 2019 +Contact: "Hridya Valsaraju" +Description: Number of blocks moved by garbage collection in background. + Available when CONFIG_F2FS_STAT_FS=y. + +What: /sys/fs/f2fs//avg_vblocks +Date: September 2019 +Contact: "Hridya Valsaraju" +Description: Average number of valid blocks. + Available when CONFIG_F2FS_STAT_FS=y. diff --git a/fs/f2fs/debug.c b/fs/f2fs/debug.c index 7706049d23bf..75ecebf7f168 100644 --- a/fs/f2fs/debug.c +++ b/fs/f2fs/debug.c @@ -148,7 +148,7 @@ static void update_general_status(struct f2fs_sb_info *sbi) /* * This function calculates BDF of every segments */ -static void update_sit_info(struct f2fs_sb_info *sbi) +void update_sit_info(struct f2fs_sb_info *sbi) { struct f2fs_stat_info *si = F2FS_STAT(sbi); unsigned long long blks_per_sec, hblks_per_sec, total_vblocks; diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 17382da7f0bd..fffce57755e4 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -3391,6 +3391,7 @@ int f2fs_build_stats(struct f2fs_sb_info *sbi); void f2fs_destroy_stats(struct f2fs_sb_info *sbi); void __init f2fs_create_root_stats(void); void f2fs_destroy_root_stats(void); +void update_sit_info(struct f2fs_sb_info *sbi); #else #define stat_inc_cp_count(si) do { } while (0) #define stat_inc_bg_cp_count(si) do { } while (0) @@ -3429,6 +3430,7 @@ static inline int f2fs_build_stats(struct f2fs_sb_info *sbi) { return 0; } static inline void f2fs_destroy_stats(struct f2fs_sb_info *sbi) { } static inline void __init f2fs_create_root_stats(void) { } static inline void f2fs_destroy_root_stats(void) { } +static inline void update_sit_info(struct f2fs_sb_info *sbi) {} #endif extern const struct file_operations f2fs_dir_operations; diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c index 3aeacd0aacfd..c1d111abe5f2 100644 --- a/fs/f2fs/sysfs.c +++ b/fs/f2fs/sysfs.c @@ -24,6 +24,9 @@ enum { DCC_INFO, /* struct discard_cmd_control */ NM_INFO, /* struct f2fs_nm_info */ F2FS_SBI, /* struct f2fs_sb_info */ +#ifdef CONFIG_F2FS_STAT_FS + STAT_INFO, /* struct f2fs_stat_info */ +#endif #ifdef CONFIG_F2FS_FAULT_INJECTION FAULT_INFO_RATE, /* struct f2fs_fault_info */ FAULT_INFO_TYPE, /* struct f2fs_fault_info */ @@ -41,6 +44,9 @@ struct f2fs_attr { int id; }; +static ssize_t f2fs_sbi_show(struct f2fs_attr *a, + struct f2fs_sb_info *sbi, char *buf); + static unsigned char *__struct_ptr(struct f2fs_sb_info *sbi, int struct_type) { if (struct_type == GC_THREAD) @@ -57,10 +63,89 @@ static unsigned char *__struct_ptr(struct f2fs_sb_info *sbi, int struct_type) else if (struct_type == FAULT_INFO_RATE || struct_type == FAULT_INFO_TYPE) return (unsigned char *)&F2FS_OPTION(sbi).fault_info; +#endif +#ifdef CONFIG_F2FS_STAT_FS + else if (struct_type == STAT_INFO) + return (unsigned char *)F2FS_STAT(sbi); #endif return NULL; } +static ssize_t free_segments_show(struct f2fs_attr *a, + struct f2fs_sb_info *sbi, char *buf) +{ + return sprintf(buf, "%llu\n", (unsigned long long)(free_segments(sbi))); +} + +#ifdef CONFIG_F2FS_STAT_FS + +#define F2FS_STAT_ATTR(_struct_type, _struct_name, _name, _elname) \ +static struct f2fs_attr f2fs_attr_##_name = { \ + .attr = {.name = __stringify(_name), .mode = 0444 }, \ + .show = f2fs_sbi_show, \ + .struct_type = _struct_type, \ + .offset = offsetof(struct _struct_name, _elname), \ +} + +F2FS_STAT_ATTR(STAT_INFO, f2fs_stat_info, cp_background_calls, bg_cp_count); +F2FS_STAT_ATTR(STAT_INFO, f2fs_stat_info, gc_background_calls, bg_gc); + +static ssize_t cp_foreground_calls_show(struct f2fs_attr *a, + struct f2fs_sb_info *sbi, char *buf) +{ + struct f2fs_stat_info *si; + + si = F2FS_STAT(sbi); + return sprintf(buf, "%llu\n", + (unsigned long long)(si->cp_count - si->bg_cp_count)); +} + +static ssize_t gc_foreground_calls_show(struct f2fs_attr *a, + struct f2fs_sb_info *sbi, char *buf) +{ + struct f2fs_stat_info *si; + + si = F2FS_STAT(sbi); + return sprintf(buf, "%llu\n", + (unsigned long long)(si->call_count - si->bg_gc)); +} + +static ssize_t moved_blocks_foreground_show(struct f2fs_attr *a, + struct f2fs_sb_info *sbi, char *buf) +{ + struct f2fs_stat_info *si; + + si = F2FS_STAT(sbi); + return sprintf(buf, "%llu\n", + (unsigned long long)(si->tot_blks - + (si->bg_data_blks + + si->bg_node_blks))); +} + +static ssize_t moved_blocks_background_show(struct f2fs_attr *a, + struct f2fs_sb_info *sbi, char *buf) +{ + struct f2fs_stat_info *si; + + si = F2FS_STAT(sbi); + return sprintf(buf, "%llu\n", + (unsigned long long)(si->bg_data_blks + + si->bg_node_blks)); +} + +static ssize_t avg_vblocks_show(struct f2fs_attr *a, + struct f2fs_sb_info *sbi, char *buf) +{ + struct f2fs_stat_info *si; + + si = F2FS_STAT(sbi); + si->dirty_count = dirty_segments(sbi); + update_sit_info(sbi); + return sprintf(buf, "%llu\n", + (unsigned long long)(si->avg_vblocks)); +} +#endif + static ssize_t dirty_segments_show(struct f2fs_attr *a, struct f2fs_sb_info *sbi, char *buf) { @@ -451,6 +536,14 @@ F2FS_RW_ATTR(FAULT_INFO_RATE, f2fs_fault_info, inject_rate, inject_rate); F2FS_RW_ATTR(FAULT_INFO_TYPE, f2fs_fault_info, inject_type, inject_type); #endif F2FS_GENERAL_RO_ATTR(dirty_segments); +F2FS_GENERAL_RO_ATTR(free_segments); +#ifdef CONFIG_F2FS_STAT_FS +F2FS_GENERAL_RO_ATTR(cp_foreground_calls); +F2FS_GENERAL_RO_ATTR(gc_foreground_calls); +F2FS_GENERAL_RO_ATTR(moved_blocks_background); +F2FS_GENERAL_RO_ATTR(moved_blocks_foreground); +F2FS_GENERAL_RO_ATTR(avg_vblocks); +#endif F2FS_GENERAL_RO_ATTR(lifetime_write_kbytes); F2FS_GENERAL_RO_ATTR(features); F2FS_GENERAL_RO_ATTR(current_reserved_blocks); @@ -515,6 +608,16 @@ static struct attribute *f2fs_attrs[] = { ATTR_LIST(features), ATTR_LIST(reserved_blocks), ATTR_LIST(current_reserved_blocks), + ATTR_LIST(free_segments), +#ifdef CONFIG_F2FS_STAT_FS + ATTR_LIST(cp_foreground_calls), + ATTR_LIST(cp_background_calls), + ATTR_LIST(gc_foreground_calls), + ATTR_LIST(gc_background_calls), + ATTR_LIST(moved_blocks_foreground), + ATTR_LIST(moved_blocks_background), + ATTR_LIST(avg_vblocks), +#endif NULL, }; ATTRIBUTE_GROUPS(f2fs); -- 2.23.0.866.gb869b98d4c-goog