From patchwork Tue Apr 23 03:46:39 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kemeng Shi X-Patchwork-Id: 13639287 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 AE170C4345F for ; Tue, 23 Apr 2024 03:47:03 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 2DB4B6B0098; Mon, 22 Apr 2024 23:46:56 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id CDA176B009C; Mon, 22 Apr 2024 23:46:55 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B531C6B00A2; Mon, 22 Apr 2024 23:46:55 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 558496B0098 for ; Mon, 22 Apr 2024 23:46:55 -0400 (EDT) Received: from smtpin24.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 0BC69807B3 for ; Tue, 23 Apr 2024 03:46:55 +0000 (UTC) X-FDA: 82039410390.24.DF9E524 Received: from dggsgout11.his.huawei.com (unknown [45.249.212.51]) by imf09.hostedemail.com (Postfix) with ESMTP id CB33C140017 for ; Tue, 23 Apr 2024 03:46:50 +0000 (UTC) Authentication-Results: imf09.hostedemail.com; dkim=none; spf=pass (imf09.hostedemail.com: domain of shikemeng@huaweicloud.com designates 45.249.212.51 as permitted sender) smtp.mailfrom=shikemeng@huaweicloud.com; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1713844013; a=rsa-sha256; cv=none; b=LpqYTB9yvygm2B8FXSvYogls4NLMAPOw6BouiHMhIV0sqeoScK/o3BtKi32JcwMkFZVCQ2 MQTMIrrvGCUvNlSSa34yXYzobf5ZO84A8LwHcUs4bpR2e/Nwi/kJC40o/NgM+a5nlQGX1E wXCfx4CSMljONLj5agOBbFpByFpBen4= ARC-Authentication-Results: i=1; imf09.hostedemail.com; dkim=none; spf=pass (imf09.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=1713844013; 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=Zzbp8YY8x1nlkCniLvBcIJR2JAIwyiycLglrRiwrHpg=; b=KwtOcWLvVPrOaeO7v0KTuidWr3EvASnF7uTrxcvD1zxlUZilG5TCJZg5wYPskAiTwuXvXg pz9AV5aDrFzyczxBJ0XLdgCMdWew8v736VLXCMS0VT/xA7xCYij5sLJfl/MG07A1sj+ueS wNk23GDjFN40z1PwtnBOInQtgTJ8ke0= Received: from mail.maildlp.com (unknown [172.19.163.216]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTP id 4VNp2P011Cz4f3nK6 for ; Tue, 23 Apr 2024 11:46:36 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.75]) by mail.maildlp.com (Postfix) with ESMTP id 272E91A09FF for ; Tue, 23 Apr 2024 11:46:46 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.101.6]) by APP2 (Coremail) with SMTP id Syh0CgA3Ww4kLydmKkDYKw--.11241S3; Tue, 23 Apr 2024 11:46:46 +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 v5 1/5] writeback: collect stats of all wb of bdi in bdi_debug_stats_show Date: Tue, 23 Apr 2024 11:46:39 +0800 Message-Id: <20240423034643.141219-2-shikemeng@huaweicloud.com> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20240423034643.141219-1-shikemeng@huaweicloud.com> References: <20240423034643.141219-1-shikemeng@huaweicloud.com> MIME-Version: 1.0 X-CM-TRANSID: Syh0CgA3Ww4kLydmKkDYKw--.11241S3 X-Coremail-Antispam: 1UD129KBjvJXoW3Jr4kKF15Jw13GF4rGF13twb_yoW7AFyfpF ZxGw1fJrWxZFyfWasxZFWDXrW5tw40q342qF97C3y5G3WDAFy3KFyfua4jyr1UGFZ7JFy3 Jan8ArykC3yUKF7anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUB0b4IE77IF4wAFF20E14v26ryj6rWUM7CY07I20VC2zVCF04k2 6cxKx2IYs7xG6rWj6s0DM7CIcVAFz4kK6r1j6r18M28IrcIa0xkI8VA2jI8067AKxVWUGw A2048vs2IY020Ec7CjxVAFwI0_Gr0_Xr1l8cAvFVAK0II2c7xJM28CjxkF64kEwVA0rcxS w2x7M28EF7xvwVC0I7IYx2IY67AKxVWDJVCq3wA2z4x0Y4vE2Ix0cI8IcVCY1x0267AKxV W8Jr0_Cr1UM28EF7xvwVC2z280aVAFwI0_GcCE3s1l84ACjcxK6I8E87Iv6xkF7I0E14v2 6rxl6s0DM2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMc Ij6xIIjxv20xvE14v26r1j6r18McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_ Jr0_Gr1lF7xvr2IYc2Ij64vIr41lFIxGxcIEc7CjxVA2Y2ka0xkIwI1l42xK82IYc2Ij64 vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAqx4xG67AKxVWUJVWUGwC20s026x8G jcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r1q6r43MIIYrxkI7VAKI48JMIIF0xvE2I x0cI8IcVAFwI0_Jr0_JF4lIxAIcVC0I7IYx2IY6xkF7I0E14v26r4j6F4UMIIF0xvE42xK 8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87Iv6xkF7I 0E14v26r4j6r4UJbIYCTnIWIevJa73UjIFyTuYvjxU2CD7DUUUU X-CM-SenderInfo: 5vklyvpphqwq5kxd4v5lfo033gof0z/ X-Rspamd-Server: rspam03 X-Rspamd-Queue-Id: CB33C140017 X-Stat-Signature: rq7yj8jrp1zsw6kz3weq5prba3w34fk4 X-Rspam-User: X-HE-Tag: 1713844010-644637 X-HE-Meta: U2FsdGVkX18LXrlqkH7HPayH6P+iMG3bTpD5fxho/sj23JDarIRm94Djn2Yec+dZ6uSqqVe+XGApIWGo4RxvEHq7eLXuxs9x3OOvNLoxMlYkSM38ZFabsZgsETg60o3iXC2HlWpK8TsQzne8vwFzWIG4BXX5nzMRAMpmcjFJsGq9joYmSIG4UsSXX0ARwHyaRCB71LG5Qh4C+q8JlFwarXk72L+Ez/SPQcT8vb7LTM3GLnw8hizFxhu84vSoSMsrB8mbIWTExividuFXvV77aiiMQTkJLfH7TjX+lA1nDmjAUofrWAInsVWPEugkjPjctgdL/25GcJzdYWD8ecp1zpgwcWEr51cxSW6qZDIkdGMb4zBluIk7aTMTyHo4OakKvKiBY6ZxRn23ABA0ng6X2uRq2Nh6LpzADWJdJwdpgmgvF+TJh1hOf7AR9uOM0uoLIfiw+q/FrfyQDZ0qRl+5+IH8j5kKS0zd4tRDJVxZBC9mN43mO+ZajjEnbzF3s+yc55FZ/rs/Jmj6Ni0NxI47EaE60IRwLWW7cviXorN23I8aUmE2sa19WpALL7yT8ndfcrgNCc+eGQPNU5Js220NvfGE/b7cwmWjvP4kbx4FDQpm9KPL2s6qPPGXHlXDH4b4wcne0OavB9CbkEcu43IFACUOAqSiCvyxA/UwFAstZh8rLIFvyZqG235Cs6qKd6bLyJSAOjhWLnGT2D1vI7FUgi+Z8XZEReAIzTYjNrH+SbJ1gr5WBBPYb80JJP0Pqzoz9eJDrHo7RVF/O9QuIU9oudI0wHyzzWj7uaexAPpJy5qS+hL6F/Rmku+SlMBjRyvSiHmd7F/YZSK5wJpRM9lyxUVkY8HbcWQ2upaux9Pi5JTd/QcuvZagAiu43jEirfT1i4x/uh5UpchrdNJjv+lsy3lcS9VCq+ta2oDw+SsJ7A7pC58JlmT5fuWhqlMCk4BdcFGRFWELMswcmnfswwz IJyw0hJj 3WCqTNt4iXekjdO6JgBpxi7exxgJrmiSF9S1QrsK9HHe40FXVBA4t8G9hu/NqwSsbDe5A1RhMY8SqIV900ENGJiCDbiEw1hloR4k0C+7Zr1exmc6EGeYftT/1IG6WlaexDc2MK2UVEbRXeYhiFaprr/Mql6F1GeOOMTQSoerf5ksZHnE+wspC1GvKfrfxYbBcIAYBV9kjHd567vPGUg6YreCiSgRIb6yL/ztO75yqcXSfjiXqyVUdlRQucg5XmkyxN6CNzbOMtzR8yUTYM2bLDiFFN4MHruZVkIhaDzIImRPHte2cGnjxtqmRbiGubP9cH9Y7nc4D0Du/DDJEUaZuLu+IEd9GZ3idt/6Mm9sOWJTUrRlJsCbH2Si4z+xHEICLPmbYH7UCnkMVmT3rHarf0+Cf/A6oEHrRosjsZEaf8BHeujn63y6CfuNMkw== 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 Acked-by: Tejun Heo --- mm/backing-dev.c | 96 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 73 insertions(+), 23 deletions(-) diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 5fa3666356f9..089146feb830 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) @@ -46,31 +59,68 @@ static void bdi_debug_init(void) bdi_debug_root = debugfs_create_dir("bdi", NULL); } -static int bdi_debug_stats_show(struct seq_file *m, void *v) +static void collect_wb_stats(struct wb_stats *stats, + struct bdi_writeback *wb) { - struct backing_dev_info *bdi = m->private; - struct bdi_writeback *wb = &bdi->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; - 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++; + stats->nr_dirty++; list_for_each_entry(inode, &wb->b_io, i_io_list) - nr_io++; + stats->nr_io++; list_for_each_entry(inode, &wb->b_more_io, i_io_list) - nr_more_io++; + stats->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++; + 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; + + rcu_read_lock(); + list_for_each_entry_rcu(wb, &bdi->wb_list, bdi_node) { + if (!wb_tryget(wb)) + continue; + + collect_wb_stats(stats, wb); + wb_put(wb); + } + rcu_read_unlock(); +} +#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 = m->private; + unsigned long background_thresh; + unsigned long dirty_thresh; + struct wb_stats stats; + unsigned long tot_bw; + 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" @@ -87,18 +137,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); return 0;