hulk inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/I8OIQR
----------------------------------------------------------------------
Functions called at file.c are renamed from files_cgroup_xxx to. files_cg_xxx. Add files-cg.c source file to surport misc for controling fd.
Signed-off-by: Chen Ridong chenridong@huawei.com --- fs/Makefile | 1 + fs/file.c | 18 ++++++------ fs/files-cg.c | 54 ++++++++++++++++++++++++++++++++++++ fs/filescontrol.c | 17 ++---------- include/linux/files-cg.h | 35 +++++++++++++++++++++++ include/linux/filescontrol.h | 11 -------- 6 files changed, 102 insertions(+), 34 deletions(-) create mode 100644 fs/files-cg.c create mode 100644 include/linux/files-cg.h
diff --git a/fs/Makefile b/fs/Makefile index db63c24fae57..5a09710a954f 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -48,6 +48,7 @@ obj-$(CONFIG_DIRTY_PAGES) += dirty_pages.o
obj-$(CONFIG_FHANDLE) += fhandle.o obj-$(CONFIG_CGROUP_FILES) += filescontrol.o +obj-$(CONFIG_CGROUP_FILES) += files-cg.o obj-y += iomap/
obj-y += quota/ diff --git a/fs/file.c b/fs/file.c index 4419f6975c96..d808cd5ac174 100644 --- a/fs/file.c +++ b/fs/file.c @@ -19,7 +19,7 @@ #include <linux/bitops.h> #include <linux/spinlock.h> #include <linux/rcupdate.h> -#include <linux/filescontrol.h> +#include <linux/files-cg.h> #include <linux/close_range.h> #include <net/sock.h>
@@ -338,7 +338,7 @@ struct files_struct *dup_fd(struct files_struct *oldf, unsigned int max_fds, int new_fdt->open_fds = newf->open_fds_init; new_fdt->full_fds_bits = newf->full_fds_bits_init; new_fdt->fd = &newf->fd_array[0]; - files_cgroup_assign(newf); + files_cg_assign(newf);
spin_lock(&oldf->file_lock); old_fdt = files_fdtable(oldf); @@ -403,7 +403,7 @@ struct files_struct *dup_fd(struct files_struct *oldf, unsigned int max_fds, int
rcu_assign_pointer(newf->fdt, new_fdt);
- if (files_cgroup_dup_fds(newf)) { + if (files_cg_dup_fds(newf)) { /* could not get enough FD resources. Need to clean up. */ new_fds = new_fdt->fd; for (i = open_files; i != 0; i--) { @@ -419,7 +419,7 @@ struct files_struct *dup_fd(struct files_struct *oldf, unsigned int max_fds, int } return newf; out_release: - files_cgroup_remove(newf); + files_cg_remove(newf); kmem_cache_free(files_cachep, newf); out: return NULL; @@ -445,7 +445,7 @@ static struct fdtable *close_files(struct files_struct * files) if (set & 1) { struct file * file = xchg(&fdt->fd[i], NULL); if (file) { - files_cgroup_unalloc_fd(files, 1); + files_cg_unalloc_fd(files, 1); filp_close(file, files); cond_resched(); } @@ -454,7 +454,7 @@ static struct fdtable *close_files(struct files_struct * files) set >>= 1; } } - files_cgroup_remove(files); + files_cg_remove(files); return fdt; }
@@ -548,7 +548,7 @@ static int alloc_fd(unsigned start, unsigned end, unsigned flags) */ if (error) goto repeat; - if (files_cgroup_alloc_fd(files, 1)) { + if (files_cg_alloc_fd(files, 1)) { error = -EMFILE; goto out; } @@ -590,7 +590,7 @@ static void __put_unused_fd(struct files_struct *files, unsigned int fd) { struct fdtable *fdt = files_fdtable(files);
- files_cgroup_put_fd(files, fd); + files_cg_put_fd(files, fd); __clear_open_fd(fd, fdt); if (fd < files->next_fd) files->next_fd = fd; @@ -1154,7 +1154,7 @@ __releases(&files->file_lock) goto out; }
- if (!tofree && files_cgroup_alloc_fd(files, 1)) { + if (!tofree && files_cg_alloc_fd(files, 1)) { err = -EMFILE; goto out; } diff --git a/fs/files-cg.c b/fs/files-cg.c new file mode 100644 index 000000000000..4c336636229a --- /dev/null +++ b/fs/files-cg.c @@ -0,0 +1,54 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later OR BSD-2-Clause */ +/* + * Copyright (c) 2024-2024, Huawei Tech. Co., Ltd. + * + * Author: Ridong Chen chenridong@huawei.com + */ + +#include <linux/fdtable.h> +#include <linux/filescontrol.h> +#include <linux/files-cg.h> + +u64 file_cg_count_fds(struct files_struct *files) +{ + int i; + struct fdtable *fdt; + int retval = 0; + + fdt = files_fdtable(files); + for (i = 0; i < DIV_ROUND_UP(fdt->max_fds, BITS_PER_LONG); i++) + retval += hweight64((__u64)fdt->open_fds[i]); + return retval; +} + +int files_cg_alloc_fd(struct files_struct *files, u64 n) +{ + return files_cgroup_alloc_fd(files, n); +} + +void files_cg_unalloc_fd(struct files_struct *files, u64 n) +{ + files_cgroup_unalloc_fd(files, n); +} + +void files_cg_assign(struct files_struct *files) +{ + files_cgroup_assign(files); +} + +void files_cg_remove(struct files_struct *files) +{ + files_cgroup_remove(files); +} + +int files_cg_dup_fds(struct files_struct *newf) +{ + return files_cgroup_dup_fds(newf); +} + +void files_cg_put_fd(struct files_struct *files, unsigned int fd) +{ + files_cgroup_put_fd(files, fd); +} + + diff --git a/fs/filescontrol.c b/fs/filescontrol.c index 18924673b806..8222497ad131 100644 --- a/fs/filescontrol.c +++ b/fs/filescontrol.c @@ -17,6 +17,7 @@
#include <linux/page_counter.h> #include <linux/filescontrol.h> +#include <linux/files-cg.h> #include <linux/cgroup.h> #include <linux/export.h> #include <linux/printk.h> @@ -94,18 +95,6 @@ static void files_cgroup_css_free(struct cgroup_subsys_state *css) kfree(css_fcg(css)); }
-u64 files_cgroup_count_fds(struct files_struct *files) -{ - int i; - struct fdtable *fdt; - int retval = 0; - - fdt = files_fdtable(files); - for (i = 0; i < DIV_ROUND_UP(fdt->max_fds, BITS_PER_LONG); i++) - retval += hweight64((__u64)fdt->open_fds[i]); - return retval; -} - /* * If attaching this cgroup would overcommit the resource then deny * the attach. If not, attach the file resource into new cgroup. @@ -135,7 +124,7 @@ static int files_cgroup_can_attach(struct cgroup_taskset *tset) from_res = css_res_open_handles(from_css);
spin_lock(&files->file_lock); - num_files = files_cgroup_count_fds(files); + num_files = file_cg_count_fds(files); page_counter_uncharge(from_res, num_files);
if (!page_counter_try_charge(to_res, num_files, &fail_res)) { @@ -211,7 +200,7 @@ int files_cgroup_dup_fds(struct files_struct *newf) if (!files_cgroup_enabled()) return 0; spin_lock(&newf->file_lock); - err = files_cgroup_alloc_fd(newf, files_cgroup_count_fds(newf)); + err = files_cgroup_alloc_fd(newf, file_cg_count_fds(newf)); spin_unlock(&newf->file_lock); return err; } diff --git a/include/linux/files-cg.h b/include/linux/files-cg.h new file mode 100644 index 000000000000..feab7a9c73fc --- /dev/null +++ b/include/linux/files-cg.h @@ -0,0 +1,35 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later OR BSD-2-Clause */ +/* + * Copyright (c) 2024-2024, Huawei Tech. Co., Ltd. + * + * Author: Ridong Chen chenridong@huawei.com + */ + +#ifndef _LINUX_FILESCG_H +#define _LINUX_FILESCG_H + +#include <linux/fdtable.h> + +u64 file_cg_count_fds(struct files_struct *files); + +#ifdef CONFIG_CGROUP_FILES +extern int files_cg_alloc_fd(struct files_struct *files, u64 n); +extern void files_cg_unalloc_fd(struct files_struct *files, u64 n); + +extern void files_cg_assign(struct files_struct *files); +extern void files_cg_remove(struct files_struct *files); + +extern int files_cg_dup_fds(struct files_struct *newf); +extern void files_cg_put_fd(struct files_struct *files, unsigned int fd); +#else /* no CONFIG_CGROUP_FILES */ +static inline int files_cg_alloc_fd(struct files_struct *files, u64 n) { return 0; }; +static inline void files_cg_unalloc_fd(struct files_struct *files, u64 n) {}; + +static inline void files_cg_assign(struct files_struct *files) {}; +static inline void files_cg_remove(struct files_struct *files) {}; + +static inline int files_cg_dup_fds(struct files_struct *newf) { return 0; }; +static inline void files_cg_put_fd(struct files_struct *files, unsigned int fd) {}; +#endif /* CONFIG_CGROUP_FILES */ + +#endif /* _LINUX_FILESCG_H */ diff --git a/include/linux/filescontrol.h b/include/linux/filescontrol.h index 0274349bd918..3e303b37229e 100644 --- a/include/linux/filescontrol.h +++ b/include/linux/filescontrol.h @@ -20,7 +20,6 @@
#include <linux/fdtable.h>
-#ifdef CONFIG_CGROUP_FILES extern int files_cgroup_alloc_fd(struct files_struct *files, u64 n); extern void files_cgroup_unalloc_fd(struct files_struct *files, u64 n);
@@ -30,15 +29,5 @@ extern void files_cgroup_remove(struct files_struct *files);
extern int files_cgroup_dup_fds(struct files_struct *newf); extern void files_cgroup_put_fd(struct files_struct *files, unsigned int fd); -#else /* no CONFIG_CGROUP_FILES */ -static inline int files_cgroup_alloc_fd(struct files_struct *files, u64 n) { return 0; }; -static inline void files_cgroup_unalloc_fd(struct files_struct *files, u64 n) {}; - -static inline void files_cgroup_assign(struct files_struct *files) {}; -static inline void files_cgroup_remove(struct files_struct *files) {}; - -static inline int files_cgroup_dup_fds(struct files_struct *newf) { return 0; }; -static inline void files_cgroup_put_fd(struct files_struct *files, unsigned int fd) {}; -#endif /* CONFIG_CGROUP_FILES */
#endif /* _LINUX_FILESCONTROL_H */