Received: by 2002:ac0:a591:0:0:0:0:0 with SMTP id m17-v6csp2138044imm; Fri, 6 Jul 2018 12:36:24 -0700 (PDT) X-Google-Smtp-Source: AAOMgpdAzrxZw0+kgN1RHXIfdpinO1HU/SpoZzfRF8Q6x5QV2LDKoK6wS7bsfyWUFn4B6yopjsXA X-Received: by 2002:a17:902:9f81:: with SMTP id g1-v6mr11364574plq.304.1530905784501; Fri, 06 Jul 2018 12:36:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530905784; cv=none; d=google.com; s=arc-20160816; b=CFdFVKQQrVgHcbqlNOHAoCq0/JQ3UerAPzWHhlrZV6wU/Cp6kZ+jgC9lilR2JlMq4C I3STyiKPFYWvkpSu9brVastukNJsfJtQK7IKVP0RdKkNZgaPOEfZeErwa+VVFJxkSyXD MhpA4Y0JvYo60L2yRwa3NeIxqEP8HoWKwGA+YSDSthucJ8qdImxubgmGIV1H3J+V+vEj SDsdIfeXgyvxYJfgTz9VVPBE+g7ybULpIgcBC8psXfCrYhLyZierSSMhLHLP7lLRbd+r oYVCNchBMMUHmzfufa0HRtbwUNL5bVmNavLj5JDjAfnPblzMfTbCL6XW3SMe1hJq1CLO pxtg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=evGngQSaXuFvTD/Wr1UPbAncum/3kS32fhyKZkJ1fGU=; b=NNvkqn5XlwJW87CfSOqCzOUrvpWUBzCxL1eBHdhOz1MyYj9uhA01eMTQ07mStL5+PI 9zt8g15yPoiIsX9MDEo1hrN8K6t+09WLEZDvnx6H7tpN4WWBUb/ABs/XCOCUdR/Zb1D/ eKmut3LgHbqz+J6T9MAPOcYqLkRuUViPMf6AE73wtuDlOLKd5r1cNz6OsS4VNNXp3yVT Cy4lvSoMW48e2PBmh2ZSQBJwQhMbceQlYzDNUro8F7Cb09RFN685G/Qiuz22lYa/lBG+ M/4iLnF5Sa/TS3EAHTFhfO6e2dcVPpHYEfjTLruSDCXDPtk54ul9Nb/J9Oc9ueKRkObN mnGA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x2-v6si8895359plv.388.2018.07.06.12.36.10; Fri, 06 Jul 2018 12:36:24 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934935AbeGFTee (ORCPT + 99 others); Fri, 6 Jul 2018 15:34:34 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:33434 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S934778AbeGFTec (ORCPT ); Fri, 6 Jul 2018 15:34:32 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 619F1401DE81; Fri, 6 Jul 2018 19:34:31 +0000 (UTC) Received: from llong.com (dhcp-17-175.bos.redhat.com [10.18.17.175]) by smtp.corp.redhat.com (Postfix) with ESMTP id E519979DE; Fri, 6 Jul 2018 19:34:30 +0000 (UTC) From: Waiman Long To: Alexander Viro , Jonathan Corbet , "Luis R. Rodriguez" , Kees Cook Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, linux-doc@vger.kernel.org, Linus Torvalds , Jan Kara , "Paul E. McKenney" , Andrew Morton , Ingo Molnar , Miklos Szeredi , Matthew Wilcox , Larry Woodman , James Bottomley , "Wangkai (Kevin C)" , Waiman Long Subject: [PATCH v6 7/7] fs/dcache: Allow deconfiguration of negative dentry code to reduce kernel size Date: Fri, 6 Jul 2018 15:32:52 -0400 Message-Id: <1530905572-817-8-git-send-email-longman@redhat.com> In-Reply-To: <1530905572-817-1-git-send-email-longman@redhat.com> References: <1530905572-817-1-git-send-email-longman@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Fri, 06 Jul 2018 19:34:31 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Fri, 06 Jul 2018 19:34:31 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'longman@redhat.com' RCPT:'' Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The tracking and limit of negative dentries in a filesystem is a useful addition. However, for users who want to reduce the kernel size as much as possible, this feature will probably be on the chopping block. To suit those users, a default-y config option DCACHE_LIMIT_NEG_ENTRY is added so that the negative dentry tracking and limiting code can be configured out, if necessary. Signed-off-by: Waiman Long --- fs/Kconfig | 10 ++++++++++ fs/dcache.c | 33 ++++++++++++++++++++++++++++++++- include/linux/dcache.h | 2 ++ kernel/sysctl.c | 2 ++ 4 files changed, 46 insertions(+), 1 deletion(-) diff --git a/fs/Kconfig b/fs/Kconfig index ac474a6..b521941 100644 --- a/fs/Kconfig +++ b/fs/Kconfig @@ -113,6 +113,16 @@ source "fs/autofs/Kconfig" source "fs/fuse/Kconfig" source "fs/overlayfs/Kconfig" +# +# Track and limit the number of negative dentries allowed in the system. +# +config DCACHE_LIMIT_NEG_ENTRY + bool "Track & limit negative dcache entries" + default y + help + This option enables the tracking and limiting of the total + number of negative dcache entries allowable in the filesystem. + menu "Caches" source "fs/fscache/Kconfig" diff --git a/fs/dcache.c b/fs/dcache.c index 43d49d7..d00761e 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -143,6 +143,7 @@ struct dentry_stat_t dentry_stat = { #define NEG_IS_SB_UMOUNTING(sb) \ unlikely(!(sb)->s_root || !((sb)->s_flags & MS_ACTIVE)) +#ifdef CONFIG_DCACHE_LIMIT_NEG_ENTRY static struct static_key limit_neg_key = STATIC_KEY_INIT_FALSE; static int neg_dentry_pc_old; int neg_dentry_pc; @@ -166,10 +167,11 @@ struct dentry_stat_t dentry_stat = { static void d_lru_del(struct dentry *dentry); static void prune_negative_dentry(struct work_struct *work); static DECLARE_DELAYED_WORK(prune_neg_dentry_work, prune_negative_dentry); +static DEFINE_PER_CPU(long, nr_dentry_neg); +#endif /* CONFIG_DCACHE_LIMIT_NEG_ENTRY */ static DEFINE_PER_CPU(long, nr_dentry); static DEFINE_PER_CPU(long, nr_dentry_unused); -static DEFINE_PER_CPU(long, nr_dentry_neg); #if defined(CONFIG_SYSCTL) && defined(CONFIG_PROC_FS) @@ -203,6 +205,7 @@ static long get_nr_dentry_unused(void) return sum < 0 ? 0 : sum; } +#ifdef CONFIG_DCACHE_LIMIT_NEG_ENTRY static long get_nr_dentry_neg(void) { int i; @@ -213,6 +216,9 @@ static long get_nr_dentry_neg(void) sum += neg_dentry_nfree_init - ndblk.nfree; return sum < 0 ? 0 : sum; } +#else +static long get_nr_dentry_neg(void) { return 0; } +#endif int proc_nr_dentry(struct ctl_table *table, int write, void __user *buffer, size_t *lenp, loff_t *ppos) @@ -277,6 +283,7 @@ static inline int dentry_string_cmp(const unsigned char *cs, const unsigned char #endif +#ifdef CONFIG_DCACHE_LIMIT_NEG_ENTRY /* * Decrement negative dentry count if applicable. */ @@ -455,6 +462,26 @@ int proc_neg_dentry_pc(struct ctl_table *ctl, int write, return 0; } EXPORT_SYMBOL_GPL(proc_neg_dentry_pc); +#else /* CONFIG_DCACHE_LIMIT_NEG_ENTRY */ + +static inline void __neg_dentry_dec(struct dentry *dentry) +{ +} + +static inline void neg_dentry_dec(struct dentry *dentry) +{ +} + +static inline void __neg_dentry_inc(struct dentry *dentry, bool retain) +{ +} + +static inline void neg_dentry_inc(struct dentry *dentry) +{ +} + +#endif /* CONFIG_DCACHE_LIMIT_NEG_ENTRY */ + static inline int dentry_cmp(const struct dentry *dentry, const unsigned char *ct, unsigned tcount) { @@ -1485,6 +1512,7 @@ void shrink_dcache_sb(struct super_block *sb) } EXPORT_SYMBOL(shrink_dcache_sb); +#ifdef CONFIG_DCACHE_LIMIT_NEG_ENTRY /* * A modified version that attempts to remove a limited number of negative * dentries as well as some other non-negative dentries at the front. @@ -1639,6 +1667,7 @@ static void prune_negative_dentry(struct work_struct *work) deactivate_super(sb); WRITE_ONCE(ndblk.prune_sb, NULL); } +#endif /* CONFIG_DCACHE_LIMIT_NEG_ENTRY */ /** * enum d_walk_ret - action to talke during tree walk @@ -3576,7 +3605,9 @@ static void __init dcache_init(void) SLAB_RECLAIM_ACCOUNT|SLAB_PANIC|SLAB_MEM_SPREAD|SLAB_ACCOUNT, d_iname); +#ifdef CONFIG_DCACHE_LIMIT_NEG_ENTRY raw_spin_lock_init(&ndblk.nfree_lock); +#endif /* Hash may have been set up in dcache_init_early */ if (!hashdist) diff --git a/include/linux/dcache.h b/include/linux/dcache.h index 71a3315..27ffc35 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h @@ -612,10 +612,12 @@ struct name_snapshot { void take_dentry_name_snapshot(struct name_snapshot *, struct dentry *); void release_dentry_name_snapshot(struct name_snapshot *); +#ifdef CONFIG_DCACHE_LIMIT_NEG_ENTRY /* * Negative dentry related declarations. */ extern int neg_dentry_pc; extern int neg_dentry_enforce; +#endif #endif /* __LINUX_DCACHE_H */ diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 8c008ae..875d5ef 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -1852,6 +1852,7 @@ static int sysrq_sysctl_handler(struct ctl_table *table, int write, .proc_handler = proc_dointvec_minmax, .extra1 = &one, }, +#ifdef CONFIG_DCACHE_LIMIT_NEG_ENTRY { .procname = "neg-dentry-pc", .data = &neg_dentry_pc, @@ -1870,6 +1871,7 @@ static int sysrq_sysctl_handler(struct ctl_table *table, int write, .extra1 = &zero, .extra2 = &one, }, +#endif { } }; -- 1.8.3.1