hulk inclusion
category: bugfix
bugzilla: NA
CVE: NA
--------------------------------
When files cgroup is enabled, it's will leads syscall performance
regression in UnixBench. Add a helper files_cgroup_enabled() and
use it to control if use files cgroup, wen can use cgroup_disable=files
in cmdline to disable files cgroup.
syscall of UnixBench (large is better)
enable files cgroup: 2868.5
disable files cgroup: 3177.0
disable config of files cgroup: 3186.5
Signed-off-by: Yang Yingliang <yangyingliang(a)huawei.com>
Reviewed-by: Tao Hou <houtao1(a)huawei.com>
Signed-off-by: Yang Yingliang <yangyingliang(a)huawei.com>
---
.../admin-guide/kernel-parameters.txt | 7 ++++---
fs/file.c | 21 ++++++++++++-------
include/linux/filescontrol.h | 6 ++++++
3 files changed, 24 insertions(+), 10 deletions(-)
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 564b14b0b9b84..05b9b8c6034cd 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -492,9 +492,10 @@
a single hierarchy
- foo isn't visible as an individually mountable
subsystem
- {Currently only "memory" controller deal with this and
- cut the overhead, others just disable the usage. So
- only cgroup_disable=memory is actually worthy}
+ {Currently "memory" and "files" controller deal with
+ this and cut the overhead, others just disable the usage.
+ So cgroup_disable=memory and cgroup_disable=files are
+ actually worthy}
cgroup_no_v1= [KNL] Disable one, multiple, all cgroup controllers in v1
Format: { controller[,controller...] | "all" }
diff --git a/fs/file.c b/fs/file.c
index 6dd55640e91fc..570b757fc469f 100644
--- a/fs/file.c
+++ b/fs/file.c
@@ -295,7 +295,8 @@ struct files_struct *dup_fd(struct files_struct *oldf, int *errorp)
new_fdt->full_fds_bits = newf->full_fds_bits_init;
new_fdt->fd = &newf->fd_array[0];
#ifdef CONFIG_CGROUP_FILES
- files_cgroup_assign(newf);
+ if (files_cgroup_enabled())
+ files_cgroup_assign(newf);
#endif
spin_lock(&oldf->file_lock);
@@ -361,6 +362,8 @@ struct files_struct *dup_fd(struct files_struct *oldf, int *errorp)
rcu_assign_pointer(newf->fdt, new_fdt);
#ifdef CONFIG_CGROUP_FILES
+ if (!files_cgroup_enabled())
+ return newf;
spin_lock(&newf->file_lock);
if (!files_cgroup_alloc_fd(newf, files_cgroup_count_fds(newf))) {
spin_unlock(&newf->file_lock);
@@ -385,7 +388,8 @@ struct files_struct *dup_fd(struct files_struct *oldf, int *errorp)
out_release:
#ifdef CONFIG_CGROUP_FILES
- files_cgroup_remove(newf);
+ if (files_cgroup_enabled())
+ files_cgroup_remove(newf);
#endif
kmem_cache_free(files_cachep, newf);
out:
@@ -413,7 +417,8 @@ static struct fdtable *close_files(struct files_struct * files)
struct file * file = xchg(&fdt->fd[i], NULL);
if (file) {
#ifdef CONFIG_CGROUP_FILES
- files_cgroup_unalloc_fd(files, 1);
+ if (files_cgroup_enabled())
+ files_cgroup_unalloc_fd(files, 1);
#endif
filp_close(file, files);
cond_resched();
@@ -424,7 +429,8 @@ static struct fdtable *close_files(struct files_struct * files)
}
}
#ifdef CONFIG_CGROUP_FILES
- files_cgroup_remove(files);
+ if (files_cgroup_enabled())
+ files_cgroup_remove(files);
#endif
return fdt;
@@ -546,7 +552,7 @@ int __alloc_fd(struct files_struct *files,
if (error)
goto repeat;
#ifdef CONFIG_CGROUP_FILES
- if (files_cgroup_alloc_fd(files, 1)) {
+ if (files_cgroup_enabled() && files_cgroup_alloc_fd(files, 1)) {
error = -EMFILE;
goto out;
}
@@ -589,7 +595,7 @@ static void __put_unused_fd(struct files_struct *files, unsigned int fd)
{
struct fdtable *fdt = files_fdtable(files);
#ifdef CONFIG_CGROUP_FILES
- if (test_bit(fd, fdt->open_fds))
+ if (files_cgroup_enabled() && test_bit(fd, fdt->open_fds))
files_cgroup_unalloc_fd(files, 1);
#endif
__clear_open_fd(fd, fdt);
@@ -878,7 +884,8 @@ __releases(&files->file_lock)
goto out;
}
#ifdef CONFIG_CGROUP_FILES
- if (!tofree && files_cgroup_alloc_fd(files, 1)) {
+ if (files_cgroup_enabled() &&
+ !tofree && files_cgroup_alloc_fd(files, 1)) {
err = -EMFILE;
goto out;
}
diff --git a/include/linux/filescontrol.h b/include/linux/filescontrol.h
index 49dc620cf64ec..0182f145a3392 100644
--- a/include/linux/filescontrol.h
+++ b/include/linux/filescontrol.h
@@ -19,6 +19,7 @@
#define _LINUX_FILESCONTROL_H
#include <linux/fdtable.h>
+#include <linux/cgroup.h>
#ifdef CONFIG_CGROUP_FILES
@@ -30,5 +31,10 @@ extern struct files_struct init_files;
void files_cgroup_assign(struct files_struct *files);
void files_cgroup_remove(struct files_struct *files);
+static inline bool files_cgroup_enabled(void)
+{
+ return cgroup_subsys_enabled(files_cgrp_subsys);
+}
+
#endif /* CONFIG_CGROUP_FILES */
#endif /* _LINUX_FILESCONTROL_H */
--
2.25.1