From patchwork Sun Jun 13 17:20:40 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 12317815 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.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS 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 F1284C48BCF for ; Sun, 13 Jun 2021 17:20:43 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CD04D61107 for ; Sun, 13 Jun 2021 17:20:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231915AbhFMRWo (ORCPT ); Sun, 13 Jun 2021 13:22:44 -0400 Received: from mail.kernel.org ([198.145.29.99]:41392 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232014AbhFMRWm (ORCPT ); Sun, 13 Jun 2021 13:22:42 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 3443861078; Sun, 13 Jun 2021 17:20:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1623604841; bh=pR1ASSTOo7jCaXPb9aaB7T6MY/c5B8OQgR+xGD2NjYQ=; h=Subject:From:To:Cc:Date:In-Reply-To:References:From; b=REooMlE01jn3IFh7eVUx328Wm8Kwen0KtknQq9QUg3Uy6HqijS0PXw/k9cFcQWnbg 9JqXi9cFBGeFnnbqe0HZk0oInz6PCGzmGxnHV6dHXUqektka1/wuFredcSWudcewOZ idWGBmpJVvsYHJrmaJuwDHy1z8n6q6vNByWH7TJ1HkgpPxtsOqEqHw3SvDegli40Ac GswGNaqJCCooTx5isCGpu5XL8J+LB7qi5JNw6cMFCi61nwfopeg49R8h/jr0XHBpc5 bdqOTxDP/+1w2vOlkr+R1yaCMRylN5FKUh6QonPHcbN7DjjjQM/Nmzzan8SPFelAcI 4wlJsP7lZASng== Subject: [PATCH 08/16] xfs: expose sysfs knob to control inode inactivation delay From: "Darrick J. Wong" To: djwong@kernel.org Cc: linux-xfs@vger.kernel.org, david@fromorbit.com, hch@infradead.org, bfoster@redhat.com Date: Sun, 13 Jun 2021 10:20:40 -0700 Message-ID: <162360484090.1530792.16682068626300537360.stgit@locust> In-Reply-To: <162360479631.1530792.17147217854887531696.stgit@locust> References: <162360479631.1530792.17147217854887531696.stgit@locust> User-Agent: StGit/0.19 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org From: Darrick J. Wong Allow administrators to control the length that we defer inode inactivation. By default we'll set the delay to 100ms, as an arbitrary choice between allowing for some batching of a deltree operation, and not letting too many inodes pile up in memory. Signed-off-by: Darrick J. Wong --- Documentation/admin-guide/xfs.rst | 7 +++++++ fs/xfs/xfs_globals.c | 5 +++++ fs/xfs/xfs_icache.c | 5 +++-- fs/xfs/xfs_linux.h | 1 + fs/xfs/xfs_sysctl.c | 9 +++++++++ fs/xfs/xfs_sysctl.h | 1 + 6 files changed, 26 insertions(+), 2 deletions(-) diff --git a/Documentation/admin-guide/xfs.rst b/Documentation/admin-guide/xfs.rst index f9b109bfc6a6..f095cfe7137f 100644 --- a/Documentation/admin-guide/xfs.rst +++ b/Documentation/admin-guide/xfs.rst @@ -277,6 +277,13 @@ The following sysctls are available for the XFS filesystem: references and returns timed-out AGs back to the free stream pool. + fs.xfs.inode_gc_delay_ms + (Units: milliseconds Min: 0 Default: 100 Max: 3600000) + The amount of time to delay cleanup work that happens after a file is + closed by all programs. This involves clearing speculative + preallocations from linked files and freeing unlinked files. A higher + value here increases batching at a risk of background work storms. + fs.xfs.speculative_prealloc_lifetime (Units: seconds Min: 1 Default: 300 Max: 86400) The interval at which the background scanning for inodes diff --git a/fs/xfs/xfs_globals.c b/fs/xfs/xfs_globals.c index f62fa652c2fd..64674f424ff8 100644 --- a/fs/xfs/xfs_globals.c +++ b/fs/xfs/xfs_globals.c @@ -28,6 +28,11 @@ xfs_param_t xfs_params = { .rotorstep = { 1, 1, 255 }, .inherit_nodfrg = { 0, 1, 1 }, .fstrm_timer = { 1, 30*100, 3600*100}, + + /* Values below here are measured in milliseconds */ + .inodegc_ms = { 0, 100, 3600*1000}, + + /* Values below here are measured in seconds */ .blockgc_timer = { 1, 300, 3600*24}, }; diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index 17c4cd91ea15..ddf43a60a55c 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -245,8 +245,9 @@ xfs_inodegc_queue( rcu_read_lock(); if (radix_tree_tagged(&mp->m_perag_tree, XFS_ICI_INODEGC_TAG)) { - trace_xfs_inodegc_queue(mp, 0, _RET_IP_); - queue_delayed_work(mp->m_gc_workqueue, &mp->m_inodegc_work, 0); + trace_xfs_inodegc_queue(mp, xfs_inodegc_ms, _RET_IP_); + queue_delayed_work(mp->m_gc_workqueue, &mp->m_inodegc_work, + msecs_to_jiffies(xfs_inodegc_ms)); } rcu_read_unlock(); } diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h index 7688663b9773..e762762256e4 100644 --- a/fs/xfs/xfs_linux.h +++ b/fs/xfs/xfs_linux.h @@ -99,6 +99,7 @@ typedef __u32 xfs_nlink_t; #define xfs_inherit_nodefrag xfs_params.inherit_nodfrg.val #define xfs_fstrm_centisecs xfs_params.fstrm_timer.val #define xfs_blockgc_secs xfs_params.blockgc_timer.val +#define xfs_inodegc_ms xfs_params.inodegc_ms.val #define current_cpu() (raw_smp_processor_id()) #define current_set_flags_nested(sp, f) \ diff --git a/fs/xfs/xfs_sysctl.c b/fs/xfs/xfs_sysctl.c index 546a6cd96729..6495887f4f00 100644 --- a/fs/xfs/xfs_sysctl.c +++ b/fs/xfs/xfs_sysctl.c @@ -176,6 +176,15 @@ static struct ctl_table xfs_table[] = { .extra1 = &xfs_params.fstrm_timer.min, .extra2 = &xfs_params.fstrm_timer.max, }, + { + .procname = "inode_gc_delay_ms", + .data = &xfs_params.inodegc_ms.val, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = &xfs_params.inodegc_ms.min, + .extra2 = &xfs_params.inodegc_ms.max + }, { .procname = "speculative_prealloc_lifetime", .data = &xfs_params.blockgc_timer.val, diff --git a/fs/xfs/xfs_sysctl.h b/fs/xfs/xfs_sysctl.h index 7692e76ead33..9a867b379a1f 100644 --- a/fs/xfs/xfs_sysctl.h +++ b/fs/xfs/xfs_sysctl.h @@ -36,6 +36,7 @@ typedef struct xfs_param { xfs_sysctl_val_t inherit_nodfrg;/* Inherit the "nodefrag" inode flag. */ xfs_sysctl_val_t fstrm_timer; /* Filestream dir-AG assoc'n timeout. */ xfs_sysctl_val_t blockgc_timer; /* Interval between blockgc scans */ + xfs_sysctl_val_t inodegc_ms; /* Inode inactivation scan interval */ } xfs_param_t; /*