From patchwork Wed Mar 27 15:57:47 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kemeng Shi X-Patchwork-Id: 13605695 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id D36C4C47DD9 for ; Wed, 27 Mar 2024 07:02:04 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 58FF36B009C; Wed, 27 Mar 2024 03:01:57 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 0D74C6B00A1; Wed, 27 Mar 2024 03:01:57 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id CE0D66B009B; Wed, 27 Mar 2024 03:01:56 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id A6DC46B009C for ; Wed, 27 Mar 2024 03:01:56 -0400 (EDT) Received: from smtpin02.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 4647C1A0A14 for ; Wed, 27 Mar 2024 07:01:56 +0000 (UTC) X-FDA: 81941924232.02.81F3560 Received: from dggsgout11.his.huawei.com (unknown [45.249.212.51]) by imf03.hostedemail.com (Postfix) with ESMTP id D485E2000C for ; Wed, 27 Mar 2024 07:01:52 +0000 (UTC) Authentication-Results: imf03.hostedemail.com; dkim=none; spf=pass (imf03.hostedemail.com: domain of shikemeng@huaweicloud.com designates 45.249.212.51 as permitted sender) smtp.mailfrom=shikemeng@huaweicloud.com; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1711522914; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=h8MU6ySIr4nwAk8Vn8P8rcFjENua2KhhXyRbRKX/nAc=; b=faYFmRO0j0fP4y+NQTfLlORUETDGWDJPFEAQzLkd44riAUtgHL+SQwFmFHUQuU+B/aY/cQ 1/VGZ6xVYe5YK9olAVvJdLSCnC49XtShdXoEZjE4yxcc6FUG4HL3U72XGxIF8h/51ZeuoP juHfpDn23RW8NJ3J0TT8VABQdS1BQ0c= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1711522914; a=rsa-sha256; cv=none; b=sBV72hw0WYCWHN5K3M2N7HmfeEERA5/HmDMg6uqz9eDchajD9cRg8oDz16iSpGpIVrfxOk oFNP2R8SeMlufv4uB3OWtOD86hh4c3M3Z1OgrL4QWmrDhHtf92GI1VCzuYlG2axOwS5fnw oOP/WHqcuYFAbsv/BJ96Cq901YtJbO0= ARC-Authentication-Results: i=1; imf03.hostedemail.com; dkim=none; spf=pass (imf03.hostedemail.com: domain of shikemeng@huaweicloud.com designates 45.249.212.51 as permitted sender) smtp.mailfrom=shikemeng@huaweicloud.com; dmarc=none Received: from mail.maildlp.com (unknown [172.19.93.142]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTP id 4V4Hdv5dsDz4f3n6j for ; Wed, 27 Mar 2024 15:01:39 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.75]) by mail.maildlp.com (Postfix) with ESMTP id E61B71A0172 for ; Wed, 27 Mar 2024 15:01:47 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.101.6]) by APP2 (Coremail) with SMTP id Syh0CgAnSQxYxANmi6+LIQ--.50310S4; Wed, 27 Mar 2024 15:01:47 +0800 (CST) From: Kemeng Shi To: akpm@linux-foundation.org, willy@infradead.org, jack@suse.cz, bfoster@redhat.com, tj@kernel.org Cc: dsterba@suse.com, mjguzik@gmail.com, dhowells@redhat.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-fsdevel@vger.kernel.org Subject: [PATCH v2 2/6] writeback: collect stats of all wb of bdi in bdi_debug_stats_show Date: Wed, 27 Mar 2024 23:57:47 +0800 Message-Id: <20240327155751.3536-3-shikemeng@huaweicloud.com> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20240327155751.3536-1-shikemeng@huaweicloud.com> References: <20240327155751.3536-1-shikemeng@huaweicloud.com> MIME-Version: 1.0 X-CM-TRANSID: Syh0CgAnSQxYxANmi6+LIQ--.50310S4 X-Coremail-Antispam: 1UD129KBjvJXoWxKFWrtw43Ar13CF1rAFWUJwb_yoW7ZrW3pF ZxK34xJrW8ZFyfWFZxAFWDWrW5tw40q342qF97C3yFk3WDZr9xtFyfCa40yry5CFZ7GF13 Jan5Ary8CrWDK3DanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUPab4IE77IF4wAFF20E14v26rWj6s0DM7CY07I20VC2zVCF04k2 6cxKx2IYs7xG6rWj6s0DM7CIcVAFz4kK6r1j6r18M280x2IEY4vEnII2IxkI6r1a6r45M2 8IrcIa0xkI8VA2jI8067AKxVWUXwA2048vs2IY020Ec7CjxVAFwI0_Xr0E3s1l8cAvFVAK 0II2c7xJM28CjxkF64kEwVA0rcxSw2x7M28EF7xvwVC0I7IYx2IY67AKxVW7JVWDJwA2z4 x0Y4vE2Ix0cI8IcVCY1x0267AKxVW8Jr0_Cr1UM28EF7xvwVC2z280aVAFwI0_GcCE3s1l 84ACjcxK6I8E87Iv6xkF7I0E14v26rxl6s0DM2AIxVAIcxkEcVAq07x20xvEncxIr21l5I 8CrVACY4xI64kE6c02F40Ex7xfMcIj6xIIjxv20xvE14v26r1j6r18McIj6I8E87Iv67AK xVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr1lF7xvr2IYc2Ij64vIr41lFIxGxcIEc7CjxV A2Y2ka0xkIwI1l42xK82IYc2Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAq x4xG67AKxVWUJVWUGwC20s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r1q6r 43MIIYrxkI7VAKI48JMIIF0xvE2Ix0cI8IcVAFwI0_Jr0_JF4lIxAIcVC0I7IYx2IY6xkF 7I0E14v26r4j6F4UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxV WUJVW8JwCI42IY6I8E87Iv6xkF7I0E14v26r4j6r4UJbIYCTnIWIevJa73UjIFyTuYvjxU ImhFDUUUU X-CM-SenderInfo: 5vklyvpphqwq5kxd4v5lfo033gof0z/ X-Rspamd-Queue-Id: D485E2000C X-Rspam-User: X-Rspamd-Server: rspam11 X-Stat-Signature: mb88y9ck7tubmfob7g9gnx5yyfwkjn9t X-HE-Tag: 1711522912-50262 X-HE-Meta: U2FsdGVkX19STdBV39yIZ5ScJTGme7ZfjJZwXruqd5/C5oQhyCr36HcJty8yN3gBZRon1AUkRoVtJxg3QaHp2T09V55oDRiWU9ELG5vSpckCP1s01eYQnDnk53fnr75xTf+mj+V9H+9Do0TdzvhNPuCMu0dCnJfQTn6cwxr4N4cYV/RquVI38LrNWNMagY9ivAnEsMsVg1XaCPIt6mrzDNbQopLN3g/a96KOI/NuKSHbH3APuJlQtMZxemUB0fvo/5MeztvWp395gsagSoGtb6BhNssncSUTicdpZzQq6MYGhZW2MvFo/K9bPy8WTi8RPxeo1mwIynJJtabeJv6AbPdcQI0d+DocVeLM1nSN39wFGhGzNKtWx4t4m3y4uHUHkQZYK7uX/azuLusIdxE9r+cgMAEeDG86fgXoAi+rx8ID7oZ6sB57juwMDK/sB8RLpLGdQFe/JXC6gDBFsVSBemi6JYplRTcq/FR2veVDNG/C1iO/ls+4zYOMj/f5Bk1X++JfyB3hslcN8RqzLdjRG9gP8xq2Wk851gIimD7A4cuY80TyXYEq+CLJHpeQ2uFsSgL8P3wu3d8NpcwOSl+7DsRbKv1grEG/3njhRin5SA715rVIV9lnXYWTPisR8Jr+oJMIPAMsDX6umSZZ7eXtvxCK4q0lTGRZfjuWBfphqjPFwdUBhIj5Gamsnj/US2x2iG/Z6g7NmR5EYpNlsyf+DiVMQGci3HoJQcPbA4A4spAqgFtg3J+owWeYqQD1XAKGLSktWEsk5v5395gBOqUhOrEJKIc/Ecuy5R99bsheYZnIo9GkPN8b47fHKTPJzkj3cnd251HCWNfihf+Oi5qRR8CddR5tnaSBjoX80TI0Hr+x+ZUpbtVhk4hjUL8FJiejDjHCk9ddzvrDMX2Lp1TbiawoO/Tz2jXQzfTVWE15SZPqLYwYO7FF8o6ujXeYOaqo2sn+0BVQgqalNiVmBAu +C8WCrBr VEPwejQ6WAulGbx24EuDwMksZPODzQKK/McZQcLe8JALEgfa3gFma3A5dzWisMBhzmt2nic+I29EftiBSPht/DtYJutLpTjoJGpfUP537rjbt2feieO8MeAuX5N3ZNNMCgsXM2ydgCa92WpopFefQmR43DEMQpbZTsZGKJ8Y/F/DW+EOKNKCOJO8K3/Y020z7L3/502x1yJ5fxCwRq/hFTrFuQt15LDH3XlFCzlyJ3C9exaqb+8M5PPUddp09pcVL3is86Nso3vT9EMaSLxsYqUMEN5ZwZj/ydDys+q8QtYMDtZw= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: /sys/kernel/debug/bdi/xxx/stats is supposed to show writeback information of whole bdi, but only writeback information of bdi in root cgroup is collected. So writeback information in non-root cgroup are missing now. To be more specific, considering following case: /* create writeback cgroup */ cd /sys/fs/cgroup echo "+memory +io" > cgroup.subtree_control mkdir group1 cd group1 echo $$ > cgroup.procs /* do writeback in cgroup */ fio -name test -filename=/dev/vdb ... /* get writeback info of bdi */ cat /sys/kernel/debug/bdi/xxx/stats The cat result unexpectedly implies that there is no writeback on target bdi. Fix this by collecting stats of all wb in bdi instead of only wb in root cgroup. Following domain hierarchy is tested: global domain (320G) / \ cgroup domain1(10G) cgroup domain2(10G) | | bdi wb1 wb2 /* all writeback info of bdi is successfully collected */ cat stats BdiWriteback: 2912 kB BdiReclaimable: 1598464 kB BdiDirtyThresh: 167479028 kB DirtyThresh: 195038532 kB BackgroundThresh: 32466728 kB BdiDirtied: 19141696 kB BdiWritten: 17543456 kB BdiWriteBandwidth: 1136172 kBps b_dirty: 2 b_io: 0 b_more_io: 1 b_dirty_time: 0 bdi_list: 1 state: 1 Signed-off-by: Kemeng Shi --- mm/backing-dev.c | 100 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 71 insertions(+), 29 deletions(-) diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 70f02959f3bd..8daf950e6855 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -39,6 +39,19 @@ struct workqueue_struct *bdi_wq; #include #include +struct wb_stats { + unsigned long nr_dirty; + unsigned long nr_io; + unsigned long nr_more_io; + unsigned long nr_dirty_time; + unsigned long nr_writeback; + unsigned long nr_reclaimable; + unsigned long nr_dirtied; + unsigned long nr_written; + unsigned long dirty_thresh; + unsigned long wb_thresh; +}; + static struct dentry *bdi_debug_root; static void bdi_debug_init(void) @@ -65,16 +78,54 @@ static struct backing_dev_info *lookup_bdi(struct seq_file *m) return NULL; } +static void collect_wb_stats(struct wb_stats *stats, + struct bdi_writeback *wb) +{ + struct inode *inode; + + spin_lock(&wb->list_lock); + list_for_each_entry(inode, &wb->b_dirty, i_io_list) + stats->nr_dirty++; + list_for_each_entry(inode, &wb->b_io, i_io_list) + stats->nr_io++; + list_for_each_entry(inode, &wb->b_more_io, i_io_list) + stats->nr_more_io++; + list_for_each_entry(inode, &wb->b_dirty_time, i_io_list) + if (inode->i_state & I_DIRTY_TIME) + stats->nr_dirty_time++; + spin_unlock(&wb->list_lock); + + stats->nr_writeback += wb_stat(wb, WB_WRITEBACK); + stats->nr_reclaimable += wb_stat(wb, WB_RECLAIMABLE); + stats->nr_dirtied += wb_stat(wb, WB_DIRTIED); + stats->nr_written += wb_stat(wb, WB_WRITTEN); + stats->wb_thresh += wb_calc_thresh(wb, stats->dirty_thresh); +} + +#ifdef CONFIG_CGROUP_WRITEBACK +static void bdi_collect_stats(struct backing_dev_info *bdi, + struct wb_stats *stats) +{ + struct bdi_writeback *wb; + + list_for_each_entry_rcu(wb, &bdi->wb_list, bdi_node) + collect_wb_stats(stats, wb); +} +#else +static void bdi_collect_stats(struct backing_dev_info *bdi, + struct wb_stats *stats) +{ + collect_wb_stats(stats, &bdi->wb); +} +#endif static int bdi_debug_stats_show(struct seq_file *m, void *v) { struct backing_dev_info *bdi; - struct bdi_writeback *wb; unsigned long background_thresh; unsigned long dirty_thresh; - unsigned long wb_thresh; - unsigned long nr_dirty, nr_io, nr_more_io, nr_dirty_time; - struct inode *inode; + struct wb_stats stats; + unsigned long tot_bw; rcu_read_lock(); bdi = lookup_bdi(m); @@ -83,22 +134,13 @@ static int bdi_debug_stats_show(struct seq_file *m, void *v) return -EEXIST; } - wb = &bdi->wb; - nr_dirty = nr_io = nr_more_io = nr_dirty_time = 0; - spin_lock(&wb->list_lock); - list_for_each_entry(inode, &wb->b_dirty, i_io_list) - nr_dirty++; - list_for_each_entry(inode, &wb->b_io, i_io_list) - nr_io++; - list_for_each_entry(inode, &wb->b_more_io, i_io_list) - nr_more_io++; - list_for_each_entry(inode, &wb->b_dirty_time, i_io_list) - if (inode->i_state & I_DIRTY_TIME) - nr_dirty_time++; - spin_unlock(&wb->list_lock); - global_dirty_limits(&background_thresh, &dirty_thresh); - wb_thresh = wb_calc_thresh(wb, dirty_thresh); + + memset(&stats, 0, sizeof(stats)); + stats.dirty_thresh = dirty_thresh; + bdi_collect_stats(bdi, &stats); + + tot_bw = atomic_long_read(&bdi->tot_write_bandwidth); seq_printf(m, "BdiWriteback: %10lu kB\n" @@ -115,18 +157,18 @@ static int bdi_debug_stats_show(struct seq_file *m, void *v) "b_dirty_time: %10lu\n" "bdi_list: %10u\n" "state: %10lx\n", - (unsigned long) K(wb_stat(wb, WB_WRITEBACK)), - (unsigned long) K(wb_stat(wb, WB_RECLAIMABLE)), - K(wb_thresh), + K(stats.nr_writeback), + K(stats.nr_reclaimable), + K(stats.wb_thresh), K(dirty_thresh), K(background_thresh), - (unsigned long) K(wb_stat(wb, WB_DIRTIED)), - (unsigned long) K(wb_stat(wb, WB_WRITTEN)), - (unsigned long) K(wb->write_bandwidth), - nr_dirty, - nr_io, - nr_more_io, - nr_dirty_time, + K(stats.nr_dirtied), + K(stats.nr_written), + K(tot_bw), + stats.nr_dirty, + stats.nr_io, + stats.nr_more_io, + stats.nr_dirty_time, !list_empty(&bdi->bdi_list), bdi->wb.state); rcu_read_unlock();