From patchwork Tue Jul 13 10:47:07 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kara X-Patchwork-Id: 12373589 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DB815C11F66 for ; Tue, 13 Jul 2021 10:47:18 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 9040561249 for ; Tue, 13 Jul 2021 10:47:18 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9040561249 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.cz Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id BD5AB6B0096; Tue, 13 Jul 2021 06:47:18 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id B85916B0095; Tue, 13 Jul 2021 06:47:18 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9D8698D0001; Tue, 13 Jul 2021 06:47:18 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0225.hostedemail.com [216.40.44.225]) by kanga.kvack.org (Postfix) with ESMTP id 7A0056B0095 for ; Tue, 13 Jul 2021 06:47:18 -0400 (EDT) Received: from smtpin36.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id 80CAC235B4 for ; Tue, 13 Jul 2021 10:47:17 +0000 (UTC) X-FDA: 78357237714.36.D14EB14 Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by imf16.hostedemail.com (Postfix) with ESMTP id 20A89F0000A3 for ; Tue, 13 Jul 2021 10:47:16 +0000 (UTC) Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 2CD54222AB; Tue, 13 Jul 2021 10:47:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_rsa; t=1626173236; h=from:from:reply-to: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=KEl84CwflquaDfzLpnAN4VRcL/NFs6C7WmBYVV0eV14=; b=VRZvlHRTIy3kiLTKxglihWF66SfgCjPoXpYDF7bTIox5qk5pO/o89yOey5AGIldOo9PsPQ RiHtZDQjASPFcXDdcXgf6LZMKRFy5HAgUVxqF18Qq15VcRUBB2kM9vTkbZuxw2Pbsy9F/6 CXVUibTIze2poH/mQttCwdrY6J/K/gY= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_ed25519; t=1626173236; h=from:from:reply-to: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=KEl84CwflquaDfzLpnAN4VRcL/NFs6C7WmBYVV0eV14=; b=4UN5tU49QsHg677TQ/jXvvwo4QRsgwXSLRH063r/YXkh9s6QnfmoaYEz5FgMCGKV63nhpU G8Mg+AOyDX1U20DQ== Received: from quack2.suse.cz (unknown [10.100.224.230]) by relay2.suse.de (Postfix) with ESMTP id 1F862A3B88; Tue, 13 Jul 2021 10:47:16 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id 048C11E0BBE; Tue, 13 Jul 2021 12:47:16 +0200 (CEST) From: Jan Kara To: Andrew Morton Cc: , Michael Stapelberg , Wu Fengguang , Jan Kara Subject: [PATCH 1/5] writeback: Track number of inodes under writeback Date: Tue, 13 Jul 2021 12:47:07 +0200 Message-Id: <20210713104716.22868-1-jack@suse.cz> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210713104519.16394-1-jack@suse.cz> References: <20210713104519.16394-1-jack@suse.cz> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=3585; h=from:subject; bh=Zeq+cUy1mIFc1qc2HQSxZ+fSxvX//gzG+ErjN7SAgIk=; b=owEBbQGS/pANAwAIAZydqgc/ZEDZAcsmYgBg7W8r04ZaFftLHzPfiiZ8fXJElaqNpl1ONjU9hAaE Hiz7x6mJATMEAAEIAB0WIQSrWdEr1p4yirVVKBycnaoHP2RA2QUCYO1vKwAKCRCcnaoHP2RA2T5lB/ 9Jf6KMdBsKL6BEyAgYi0pwAkAl5ujpwdfDxy51Z145ngVJT5Oeu4xsysdrjqv0Ynw/opK14/CGGJrj sFC+v7i1xiNFp/+e+LXN1Me8AcniuJG5r6PXSZpis6pWAtvnA0W1RxaSmTdwbPbIOB3IP7ECQOwVjy hdFyn7tkcSdVqFU/ZrYtrfvg/suxjIUvfXJ7P/KFBo8uXfMI9zxSrq8sHxALtJopZD2xabWzrf+Glv aqmcw87mOVXKHzWXtlFGMxu8DcdwrD2XwdkmLMaT/ugn6qee0Dw3i5Vdw1Ub2OzWgkDDF1FKnsVXFd mpJnTX2eMKNnTgmulZFs3oxQW8CW6R X-Developer-Key: i=jack@suse.cz; a=openpgp; fpr=93C6099A142276A28BBE35D815BC833443038D8C Authentication-Results: imf16.hostedemail.com; dkim=pass header.d=suse.cz header.s=susede2_rsa header.b=VRZvlHRT; dkim=pass header.d=suse.cz header.s=susede2_ed25519 header.b=4UN5tU49; spf=pass (imf16.hostedemail.com: domain of jack@suse.cz designates 195.135.220.28 as permitted sender) smtp.mailfrom=jack@suse.cz; dmarc=none X-Rspamd-Server: rspam05 X-Stat-Signature: k5ugrupcrckxu57obwqiwux74wgx9999 X-Rspamd-Queue-Id: 20A89F0000A3 X-HE-Tag: 1626173236-371071 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: Track number of inodes under writeback for each bdi_writeback structure. We will use this to decide whether wb does any IO and so we can estimate its writeback throughput. In principle we could use number of pages under writeback (WB_WRITEBACK counter) for this however normal percpu counter reads are too inaccurate for our purposes and summing the counter is too expensive. Signed-off-by: Jan Kara --- fs/fs-writeback.c | 5 +++++ include/linux/backing-dev-defs.h | 1 + mm/backing-dev.c | 1 + mm/page-writeback.c | 22 ++++++++++++++++++++-- 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 06d04a74ab6c..54300f4d38af 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -406,6 +406,11 @@ static bool inode_do_switch_wbs(struct inode *inode, inc_wb_stat(new_wb, WB_WRITEBACK); } + if (mapping_tagged(mapping, PAGECACHE_TAG_WRITEBACK)) { + atomic_dec(&old_wb->writeback_inodes); + atomic_inc(&new_wb->writeback_inodes); + } + wb_get(new_wb); /* diff --git a/include/linux/backing-dev-defs.h b/include/linux/backing-dev-defs.h index 1d7edad9914f..06fb8e13f6bc 100644 --- a/include/linux/backing-dev-defs.h +++ b/include/linux/backing-dev-defs.h @@ -116,6 +116,7 @@ struct bdi_writeback { struct list_head b_dirty_time; /* time stamps are dirty */ spinlock_t list_lock; /* protects the b_* lists */ + atomic_t writeback_inodes; /* number of inodes under writeback */ struct percpu_counter stat[NR_WB_STAT_ITEMS]; unsigned long congested; /* WB_[a]sync_congested flags */ diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 271f2ca862c8..1bf16b1eed47 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -293,6 +293,7 @@ static int wb_init(struct bdi_writeback *wb, struct backing_dev_info *bdi, INIT_LIST_HEAD(&wb->b_dirty_time); spin_lock_init(&wb->list_lock); + atomic_set(&wb->writeback_inodes, 0); wb->bw_time_stamp = jiffies; wb->balanced_dirty_ratelimit = INIT_BW; wb->dirty_ratelimit = INIT_BW; diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 9f63548f247c..e1aa1c9d8e36 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -2731,6 +2731,16 @@ int clear_page_dirty_for_io(struct page *page) } EXPORT_SYMBOL(clear_page_dirty_for_io); +static void wb_inode_writeback_start(struct bdi_writeback *wb) +{ + atomic_inc(&wb->writeback_inodes); +} + +static void wb_inode_writeback_end(struct bdi_writeback *wb) +{ + atomic_dec(&wb->writeback_inodes); +} + int test_clear_page_writeback(struct page *page) { struct address_space *mapping = page_mapping(page); @@ -2752,6 +2762,9 @@ int test_clear_page_writeback(struct page *page) dec_wb_stat(wb, WB_WRITEBACK); __wb_writeout_inc(wb); + if (!mapping_tagged(mapping, + PAGECACHE_TAG_WRITEBACK)) + wb_inode_writeback_end(wb); } } @@ -2794,8 +2807,13 @@ int __test_set_page_writeback(struct page *page, bool keep_write) PAGECACHE_TAG_WRITEBACK); xas_set_mark(&xas, PAGECACHE_TAG_WRITEBACK); - if (bdi->capabilities & BDI_CAP_WRITEBACK_ACCT) - inc_wb_stat(inode_to_wb(inode), WB_WRITEBACK); + if (bdi->capabilities & BDI_CAP_WRITEBACK_ACCT) { + struct bdi_writeback *wb = inode_to_wb(inode); + + inc_wb_stat(wb, WB_WRITEBACK); + if (!on_wblist) + wb_inode_writeback_start(wb); + } /* * We can come through here when swapping anonymous