Received: by 10.192.165.156 with SMTP id m28csp2094776imm; Thu, 12 Apr 2018 08:31:30 -0700 (PDT) X-Google-Smtp-Source: AIpwx48/85iV7RTpslXowq/+K/a8dNlLesdnETQkV0FWhHSP8qxyE6PgZqyXCTm/gJx74JK2CgCH X-Received: by 2002:a17:902:6a85:: with SMTP id n5-v6mr1539253plk.313.1523547090314; Thu, 12 Apr 2018 08:31:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523547090; cv=none; d=google.com; s=arc-20160816; b=j2oj8ThzIcSXrrHZMGeTYHkRK0m4GI9/DLXwowZwaKqYhOVYTHP1ZtolbRth9Cx8Ss 69Oa9mllpwabaCWfaHqkFKFrhxgCW9yoKKePGptDTnf9RzDc1fo7LiUiMiWnh3PReOCh jWinBToDcsdRWYcTRcPx0omVhsygxxUlGTYO9l39VQ9mlgUE7oNNRmvekyzoumcDaVVR RGsU1uUwFZcZ29k1caHmsSJKhn/FOZ7lso/uRNhuRwqnwNvmRb7MR7Ljwu98Q0R3Tscc f3ef1g0olETPO054KTfyZqzQRh8EZBMghPYHg/BWTYV8kswcANgtPgmLftYjvH2LmxM3 tpnA== 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=eyD22L2VYZw+M8sRtmxVMhw0YICOReC5iNEZd8O++u8=; b=nq82f9vaPIehte3SFlVUWdnKxQ1T1EDsL4lSXKUsDC9gkLkqbTdX+ebq31L84Dycqn PVO12hQNxU4HI7URhbdwhzoCj2DHxW8PddXGYKGULMRA7nbIPbcsO5+NXPguhLLNFa1z sNUvwXO+NlFb8zkhOdLf8lKJIqJB8Sbam62rx4MMZktrkta3+3qI82+1fBH3H0rQboOV Q5A/Z7RQvRyjgdENpbio27Vm+YSF6HHbxWMaJ7rqXa/zqxfeG5H929npWPvGaTSflqw2 DE1Zo1/htO8weDxIlCt+p951KzHZukSYoOI5GJd8xBW6IBN0svOIAwXDhq3t6n51Pf2Q OvIw== 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 o129si2394639pga.253.2018.04.12.08.30.53; Thu, 12 Apr 2018 08:31:30 -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 S1753680AbeDLPZ7 (ORCPT + 99 others); Thu, 12 Apr 2018 11:25:59 -0400 Received: from mail-wm0-f66.google.com ([74.125.82.66]:34530 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753167AbeDLPIg (ORCPT ); Thu, 12 Apr 2018 11:08:36 -0400 Received: by mail-wm0-f66.google.com with SMTP id w2so3550963wmw.1 for ; Thu, 12 Apr 2018 08:08:36 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=eyD22L2VYZw+M8sRtmxVMhw0YICOReC5iNEZd8O++u8=; b=tDL8kpxlIwVZ6shhIosToG/Dk8UplkgCnB+rGUxNLBmNo1TdCSQptLCSdAstHiNgzs pc/lT25+MpxtmiQoaPj7emNA1yTNGCZAERLln3tVpAiuexz3QHv/ypzEYBcyGCDq+FWW SRe8aibpLOsGfUhta0ZsLsJyWlxf39yrWjrKVkppt7WsMu13W6N8ynG9Nsa4fZjsysq7 UI/J0rimCs0H2tTlJrZo0g2dibdpy8hjOZssPLTNT8/dJZyo9ADwhh4MmN1//MMOprb8 2xxME5AWpgsBr6uL6OlWwAughaEd9TccpVrM2hvKmBJPdf82hDD1AZqCDz67uYek4DiH 260A== X-Gm-Message-State: ALQs6tAZXoPGKc7CjTzamFV/T2JXXFH7UF8wFQ4j+ifz7z8a5rsc7iwf t57lwyJw27iHcsRBMhWaYMHmoA== X-Received: by 10.28.238.19 with SMTP id m19mr1022327wmh.126.1523545715200; Thu, 12 Apr 2018 08:08:35 -0700 (PDT) Received: from veci.piliscsaba.redhat.com (catv-176-63-54-97.catv.broadband.hu. [176.63.54.97]) by smtp.gmail.com with ESMTPSA id p197sm2621783wme.43.2018.04.12.08.08.34 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 12 Apr 2018 08:08:34 -0700 (PDT) From: Miklos Szeredi To: linux-unionfs@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH 03/35] vfs: optionally don't account file in nr_files Date: Thu, 12 Apr 2018 17:07:54 +0200 Message-Id: <20180412150826.20988-4-mszeredi@redhat.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180412150826.20988-1-mszeredi@redhat.com> References: <20180412150826.20988-1-mszeredi@redhat.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Stacking file operations in overlay will store an extra open file for each overlay file opened. The overhead is just that of "struct file" which is about 256bytes, because overlay already pins an extra dentry and inode when the file is open, which add up to a much larger overhead. For fear of breaking working setups, don't start accounting the extra file. The implementation adds a bool argument to path_open() to control whether the returned file is to be accounted or not. If the file is not accounted, f_mode will contain FMODE_NOACCOUNT, so that when freeing the file the count is not decremented. Signed-off-by: Miklos Szeredi --- fs/file_table.c | 13 +++++++++---- fs/internal.h | 7 ++++++- fs/open.c | 10 +++++----- include/linux/fs.h | 5 ++++- 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/fs/file_table.c b/fs/file_table.c index 7ec0b3e5f05d..60376bfa04cf 100644 --- a/fs/file_table.c +++ b/fs/file_table.c @@ -51,7 +51,8 @@ static void file_free_rcu(struct rcu_head *head) static inline void file_free(struct file *f) { - percpu_counter_dec(&nr_files); + if (!(f->f_mode & FMODE_NOACCOUNT)) + percpu_counter_dec(&nr_files); call_rcu(&f->f_u.fu_rcuhead, file_free_rcu); } @@ -100,7 +101,7 @@ int proc_nr_files(struct ctl_table *table, int write, * done, you will imbalance int the mount's writer count * and a warning at __fput() time. */ -struct file *get_empty_filp(void) +struct file *__get_empty_filp(bool account) { const struct cred *cred = current_cred(); static long old_max; @@ -110,7 +111,8 @@ struct file *get_empty_filp(void) /* * Privileged users can go above max_files */ - if (get_nr_files() >= files_stat.max_files && !capable(CAP_SYS_ADMIN)) { + if (account && + get_nr_files() >= files_stat.max_files && !capable(CAP_SYS_ADMIN)) { /* * percpu_counters are inaccurate. Do an expensive check before * we go and fail. @@ -123,7 +125,10 @@ struct file *get_empty_filp(void) if (unlikely(!f)) return ERR_PTR(-ENOMEM); - percpu_counter_inc(&nr_files); + if (account) + percpu_counter_inc(&nr_files); + else + f->f_mode = FMODE_NOACCOUNT; f->f_cred = get_cred(cred); error = security_file_alloc(f); if (unlikely(error)) { diff --git a/fs/internal.h b/fs/internal.h index df262f41a0ef..3319bf39e339 100644 --- a/fs/internal.h +++ b/fs/internal.h @@ -85,7 +85,12 @@ extern void chroot_fs_refs(const struct path *, const struct path *); /* * file_table.c */ -extern struct file *get_empty_filp(void); +extern struct file *__get_empty_filp(bool account); + +static inline struct file *get_empty_filp(void) +{ + return __get_empty_filp(true); +} /* * super.c diff --git a/fs/open.c b/fs/open.c index 8c315f9ec2f6..d509705d5740 100644 --- a/fs/open.c +++ b/fs/open.c @@ -700,8 +700,8 @@ static int do_dentry_open(struct file *f, static const struct file_operations empty_fops = {}; int error; - f->f_mode = OPEN_FMODE(f->f_flags) | FMODE_LSEEK | - FMODE_PREAD | FMODE_PWRITE; + f->f_mode = (f->f_mode & FMODE_NOACCOUNT) | OPEN_FMODE(f->f_flags) | + FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE; path_get(&f->f_path); f->f_inode = inode; @@ -711,7 +711,7 @@ static int do_dentry_open(struct file *f, f->f_wb_err = filemap_sample_wb_err(f->f_mapping); if (unlikely(f->f_flags & O_PATH)) { - f->f_mode = FMODE_PATH; + f->f_mode = (f->f_mode & FMODE_NOACCOUNT) | FMODE_PATH; f->f_op = &empty_fops; return 0; } @@ -867,12 +867,12 @@ int vfs_open(const struct path *path, struct file *file, } struct file *path_open(const struct path *path, int flags, struct inode *inode, - const struct cred *cred) + const struct cred *cred, bool account) { struct file *file; int retval; - file = get_empty_filp(); + file = __get_empty_filp(account); if (!IS_ERR(file)) { file->f_flags = flags; file->f_path = *path; diff --git a/include/linux/fs.h b/include/linux/fs.h index c6d7e3b00163..0b215faa30ae 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -152,6 +152,9 @@ typedef int (dio_iodone_t)(struct kiocb *iocb, loff_t offset, /* File is capable of returning -EAGAIN if I/O will block */ #define FMODE_NOWAIT ((__force fmode_t)0x8000000) +/* File does not contribute to nr_files count */ +#define FMODE_NOACCOUNT ((__force fmode_t)0x10000000) + /* * Flag for rw_copy_check_uvector and compat_rw_copy_check_uvector * that indicates that they should check the contents of the iovec are @@ -2402,7 +2405,7 @@ extern struct file *file_open_root(struct dentry *, struct vfsmount *, const char *, int, umode_t); extern struct file * dentry_open(const struct path *, int, const struct cred *); extern struct file *path_open(const struct path *, int, struct inode *, - const struct cred *); + const struct cred *, bool); extern int filp_close(struct file *, fl_owner_t id); extern struct filename *getname_flags(const char __user *, int, int *); -- 2.14.3