[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20220720022118.1495752-1-yang.yang29@zte.com.cn>
Date: Wed, 20 Jul 2022 02:21:19 +0000
From: cgel.zte@...il.com
To: viro@...iv.linux.org.uk, hughd@...gle.com,
akpm@...ux-foundation.org, hch@...radead.org,
hsiangkao@...ux.alibaba.com
Cc: yang.yang29@....com.cn, axboe@...nel.dk, yangerkun@...wei.com,
johannes.thumshirn@....com, linux-fsdevel@...r.kernel.org,
linux-kernel@...r.kernel.org, linux-mm@...ck.org,
Ran Xiaokai <ran.xiaokai@....com.cn>,
CGEL ZTE <cgel.zte@...il.com>
Subject: [PATCH] fs: drop_caches: skip dropping pagecache which is always dirty
From: Yang Yang <yang.yang29@....com.cn>
Pagecache of some kind of fs has PG_dirty bit set once it was
allocated, so it can't be dropped. These fs include ramfs and
tmpfs. This can make drop_pagecache_sb() more efficient.
Introduce a new fs flag to do this, and this new flag may be
used in other case in future.
Signed-off-by: Ran Xiaokai <ran.xiaokai@....com.cn>
Signed-off-by: Yang Yang <yang.yang29@....com.cn>
Signed-off-by: CGEL ZTE <cgel.zte@...il.com>
---
fs/drop_caches.c | 7 +++++++
fs/ramfs/inode.c | 2 +-
include/linux/fs.h | 1 +
mm/shmem.c | 2 +-
4 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/fs/drop_caches.c b/fs/drop_caches.c
index e619c31b6bd9..16956d5d3922 100644
--- a/fs/drop_caches.c
+++ b/fs/drop_caches.c
@@ -19,6 +19,13 @@ static void drop_pagecache_sb(struct super_block *sb, void *unused)
{
struct inode *inode, *toput_inode = NULL;
+ /*
+ * Pagecache of this kind of fs has PG_dirty bit set once it was
+ * allocated, so it can't be dropped.
+ */
+ if (sb->s_type->fs_flags & FS_ALWAYS_DIRTY)
+ return;
+
spin_lock(&sb->s_inode_list_lock);
list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
spin_lock(&inode->i_lock);
diff --git a/fs/ramfs/inode.c b/fs/ramfs/inode.c
index bc66d0173e33..5fb62d37618f 100644
--- a/fs/ramfs/inode.c
+++ b/fs/ramfs/inode.c
@@ -289,7 +289,7 @@ static struct file_system_type ramfs_fs_type = {
.init_fs_context = ramfs_init_fs_context,
.parameters = ramfs_fs_parameters,
.kill_sb = ramfs_kill_sb,
- .fs_flags = FS_USERNS_MOUNT,
+ .fs_flags = FS_USERNS_MOUNT | FS_ALWAYS_DIRTY,
};
static int __init init_ramfs_fs(void)
diff --git a/include/linux/fs.h b/include/linux/fs.h
index e285bd9d6188..90cdd10d683e 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2532,6 +2532,7 @@ struct file_system_type {
#define FS_USERNS_MOUNT 8 /* Can be mounted by userns root */
#define FS_DISALLOW_NOTIFY_PERM 16 /* Disable fanotify permission events */
#define FS_ALLOW_IDMAP 32 /* FS has been updated to handle vfs idmappings. */
+#define FS_ALWAYS_DIRTY 64 /* Pagecache is always dirty. */
#define FS_RENAME_DOES_D_MOVE 32768 /* FS will handle d_move() during rename() internally. */
int (*init_fs_context)(struct fs_context *);
const struct fs_parameter_spec *parameters;
diff --git a/mm/shmem.c b/mm/shmem.c
index 8baf26eda989..5d549f61735f 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -3974,7 +3974,7 @@ static struct file_system_type shmem_fs_type = {
.parameters = shmem_fs_parameters,
#endif
.kill_sb = kill_litter_super,
- .fs_flags = FS_USERNS_MOUNT,
+ .fs_flags = FS_USERNS_MOUNT | FS_ALWAYS_DIRTY,
};
void __init shmem_init(void)
--
2.25.1
Powered by blists - more mailing lists