From mboxrd@z Thu Jan 1 00:00:00 1970 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 51DC4C07E95 for ; Tue, 13 Jul 2021 10:24:52 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id D0D6460FEB for ; Tue, 13 Jul 2021 10:24:51 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D0D6460FEB 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 104F66B0096; Tue, 13 Jul 2021 06:24:52 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 0A6BF6B0095; Tue, 13 Jul 2021 06:24:51 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id DC6D36B009C; Tue, 13 Jul 2021 06:24:51 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0025.hostedemail.com [216.40.44.25]) by kanga.kvack.org (Postfix) with ESMTP id B8B5C6B0095 for ; Tue, 13 Jul 2021 06:24:51 -0400 (EDT) Received: from smtpin35.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay04.hostedemail.com (Postfix) with ESMTP id A733C299AA for ; Tue, 13 Jul 2021 10:24:50 +0000 (UTC) X-FDA: 78357181140.35.DF04AA9 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by imf14.hostedemail.com (Postfix) with ESMTP id 3160960019B4 for ; Tue, 13 Jul 2021 10:24:50 +0000 (UTC) Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 0FFE620093; Tue, 13 Jul 2021 10:24:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_rsa; t=1626171889; 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=0OFyCHiVncRr2KeW7uXE977wDdgye+jCGc9PldO8qwQ=; b=ze6BmfC6NZZHjzh5HoufyaR4W1p2LKRV1IvMYipCN9E0PmcZVBBR/fKUK+aaev9s8JjdcR K7hcmQIpCg68WQitu5kSZrcoFnjaUr6Eqe1TIxn56rhHJNeqzuRYzVMRPOygUU33gyE4L1 RjRIJ62xD7KNpv8ajPFlC8eQbCF+g3I= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_ed25519; t=1626171889; 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=0OFyCHiVncRr2KeW7uXE977wDdgye+jCGc9PldO8qwQ=; b=BlZnU/T9XEn/b2EnJLxUy1Y3LKREuHFrqri8N7jFnV3Y+QUvSixjBiGuzBIY5eO25FJ6CK D95dvyr6p8NtIWDw== Received: from quack2.suse.cz (unknown [10.100.224.230]) by relay2.suse.de (Postfix) with ESMTP id B603DA3B8A; Tue, 13 Jul 2021 10:24:48 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id 5C5851E0691; Tue, 13 Jul 2021 12:24:48 +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:24:40 +0200 Message-Id: <20210713102448.30424-1-jack@suse.cz> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210712165811.13163-1-jack@suse.cz> References: <20210712165811.13163-1-jack@suse.cz> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=3595; h=from:subject; bh=k6CGYCogJu3IEkHdSZkpTAfQ0gTbB+GaRTJkEGSCe18=; b=owEBbQGS/pANAwAIAZydqgc/ZEDZAcsmYgBg7Wnnvi2Nt0j8x6Oj7z8i0T3FfqmJBTHlLuvSgFVp H5zPdcuJATMEAAEIAB0WIQSrWdEr1p4yirVVKBycnaoHP2RA2QUCYO1p5wAKCRCcnaoHP2RA2QwEB/ 0d4mTAtE9OQABcK0joZxnZzO/uuJ2EfcQcc2G04Hg301bSBesgwwfi9dpJqem/zc+bPl08SjmfYbPb ej6lnqRlUcxDWj5b9o0mm22pNvzI70/+N6aa6OQdAJcxubTqQ3RgZ87QqjHEcK16vAUzIvQU5tMnTI j3/pTNHGjJkFPC/99TE6V48pgYBG/Jvs0Lk09avtIpHWG3pjhxeaj766JVCCcgs52837iDNk+MoQkE s/8IEnq+Zjc2Ces8WZQ8BteP5VBSZJYKorT08CtpKVdmSwEm5e0qfHfOBQm5vKgatwUHoZfPFXq/VZ ys/ecHEzuqOViNdqqZ7mPiUe4s/O7f X-Developer-Key: i=jack@suse.cz; a=openpgp; fpr=93C6099A142276A28BBE35D815BC833443038D8C Authentication-Results: imf14.hostedemail.com; dkim=pass header.d=suse.cz header.s=susede2_rsa header.b=ze6BmfC6; dkim=pass header.d=suse.cz header.s=susede2_ed25519 header.b="BlZnU/T9"; spf=pass (imf14.hostedemail.com: domain of jack@suse.cz designates 195.135.220.29 as permitted sender) smtp.mailfrom=jack@suse.cz; dmarc=none X-Rspamd-Server: rspam05 X-Stat-Signature: j3phkkzf6e9xhpx56amkh7cfp8fcojnk X-Rspamd-Queue-Id: 3160960019B4 X-HE-Tag: 1626171890-266818 Content-Transfer-Encoding: quoted-printable 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 e91980f49388..475681362b1c 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -416,6 +416,11 @@ static void inode_switch_wbs_work_fn(struct work_str= uct *work) inc_wb_stat(new_wb, WB_WRITEBACK); } =20 + if (mapping_tagged(mapping, PAGECACHE_TAG_WRITEBACK)) { + atomic_dec(&old_wb->writeback_inodes); + atomic_inc(&new_wb->writeback_inodes); + } + wb_get(new_wb); =20 /* diff --git a/include/linux/backing-dev-defs.h b/include/linux/backing-dev= -defs.h index fff9367a6348..148d889f2f7f 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 */ =20 + atomic_t writeback_inodes; /* number of inodes under writeback */ struct percpu_counter stat[NR_WB_STAT_ITEMS]; =20 unsigned long congested; /* WB_[a]sync_congested flags */ diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 576220acd686..342394ef1e02 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -293,6 +293,7 @@ static int wb_init(struct bdi_writeback *wb, struct b= acking_dev_info *bdi, INIT_LIST_HEAD(&wb->b_dirty_time); spin_lock_init(&wb->list_lock); =20 + atomic_set(&wb->writeback_inodes, 0); wb->bw_time_stamp =3D jiffies; wb->balanced_dirty_ratelimit =3D INIT_BW; wb->dirty_ratelimit =3D INIT_BW; diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 0062d5c57d41..1560f6626a3b 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -2719,6 +2719,16 @@ int clear_page_dirty_for_io(struct page *page) } EXPORT_SYMBOL(clear_page_dirty_for_io); =20 +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 =3D page_mapping(page); @@ -2740,6 +2750,9 @@ int test_clear_page_writeback(struct page *page) =20 dec_wb_stat(wb, WB_WRITEBACK); __wb_writeout_inc(wb); + if (!mapping_tagged(mapping, + PAGECACHE_TAG_WRITEBACK)) + wb_inode_writeback_end(wb); } } =20 @@ -2782,8 +2795,13 @@ int __test_set_page_writeback(struct page *page, b= ool keep_write) PAGECACHE_TAG_WRITEBACK); =20 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 =3D inode_to_wb(inode); + + inc_wb_stat(wb, WB_WRITEBACK); + if (!on_wblist) + wb_inode_writeback_start(wb); + } =20 /* * We can come through here when swapping anonymous --=20 2.26.2