mirror of https://github.com/torvalds/linux.git
mm/hugetlb: extract sysctl into hugetlb_sysctl.c
Following the extraction of sysfs code, this patch moves the sysctl interface implementation into a dedicated file to further improve code organization and maintainability of the hugetlb subsystem. The following components are moved to mm/hugetlb_sysctl.c: - proc_hugetlb_doulongvec_minmax() - hugetlb_sysctl_handler_common() - hugetlb_sysctl_handler() - hugetlb_mempolicy_sysctl_handler() (CONFIG_NUMA) - hugetlb_overcommit_handler() - hugetlb_table[] sysctl table definition - hugetlb_sysctl_init() The hugetlb_internal.h header file is updated to declare the sysctl initialization function with proper #ifdef guards for configurations without CONFIG_SYSCTL support. The Makefile is updated to compile hugetlb_sysctl.o when CONFIG_HUGETLBFS is enabled. This refactoring reduces the size of hugetlb.c and logically separates the sysctl interface from core hugetlb management code. MAINTAINERS is updated to add new file hugetlb_sysctl.c. No functional changes are introduced; all code is moved as-is from hugetlb.c with consistent formatting. Link: https://lkml.kernel.org/r/5bbee7ab5be71d0bb1aebec38642d7e83526bb7a.1762398359.git.zhuhui@kylinos.cn Signed-off-by: Geliang Tang <geliang@kernel.org> Signed-off-by: Hui Zhu <zhuhui@kylinos.cn> Cc: David Hildenbrand <david@redhat.com> Cc: Muchun Song <muchun.song@linux.dev> Cc: Oscar Salvador <osalvador@suse.de> Cc: SeongJae Park <sj@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
ecd6703f64
commit
cdcb53e1de
|
|
@ -11540,6 +11540,7 @@ F: mm/hugetlb.c
|
||||||
F: mm/hugetlb_cgroup.c
|
F: mm/hugetlb_cgroup.c
|
||||||
F: mm/hugetlb_cma.c
|
F: mm/hugetlb_cma.c
|
||||||
F: mm/hugetlb_cma.h
|
F: mm/hugetlb_cma.h
|
||||||
|
F: mm/hugetlb_sysctl.c
|
||||||
F: mm/hugetlb_sysfs.c
|
F: mm/hugetlb_sysfs.c
|
||||||
F: mm/hugetlb_vmemmap.c
|
F: mm/hugetlb_vmemmap.c
|
||||||
F: mm/hugetlb_vmemmap.h
|
F: mm/hugetlb_vmemmap.h
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ endif
|
||||||
obj-$(CONFIG_SWAP) += page_io.o swap_state.o swapfile.o
|
obj-$(CONFIG_SWAP) += page_io.o swap_state.o swapfile.o
|
||||||
obj-$(CONFIG_ZSWAP) += zswap.o
|
obj-$(CONFIG_ZSWAP) += zswap.o
|
||||||
obj-$(CONFIG_HAS_DMA) += dmapool.o
|
obj-$(CONFIG_HAS_DMA) += dmapool.o
|
||||||
obj-$(CONFIG_HUGETLBFS) += hugetlb.o hugetlb_sysfs.o
|
obj-$(CONFIG_HUGETLBFS) += hugetlb.o hugetlb_sysfs.o hugetlb_sysctl.o
|
||||||
ifdef CONFIG_CMA
|
ifdef CONFIG_CMA
|
||||||
obj-$(CONFIG_HUGETLBFS) += hugetlb_cma.o
|
obj-$(CONFIG_HUGETLBFS) += hugetlb_cma.o
|
||||||
endif
|
endif
|
||||||
|
|
|
||||||
132
mm/hugetlb.c
132
mm/hugetlb.c
|
|
@ -7,7 +7,6 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/seq_file.h>
|
#include <linux/seq_file.h>
|
||||||
#include <linux/sysctl.h>
|
|
||||||
#include <linux/highmem.h>
|
#include <linux/highmem.h>
|
||||||
#include <linux/mmu_notifier.h>
|
#include <linux/mmu_notifier.h>
|
||||||
#include <linux/nodemask.h>
|
#include <linux/nodemask.h>
|
||||||
|
|
@ -4111,12 +4110,6 @@ ssize_t __nr_hugepages_store_common(bool obey_mempolicy,
|
||||||
return err ? err : len;
|
return err ? err : len;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SYSCTL
|
|
||||||
static void hugetlb_sysctl_init(void);
|
|
||||||
#else
|
|
||||||
static inline void hugetlb_sysctl_init(void) { }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int __init hugetlb_init(void)
|
static int __init hugetlb_init(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
@ -4549,131 +4542,6 @@ static unsigned int allowed_mems_nr(struct hstate *h)
|
||||||
return nr;
|
return nr;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SYSCTL
|
|
||||||
static int proc_hugetlb_doulongvec_minmax(const struct ctl_table *table, int write,
|
|
||||||
void *buffer, size_t *length,
|
|
||||||
loff_t *ppos, unsigned long *out)
|
|
||||||
{
|
|
||||||
struct ctl_table dup_table;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* In order to avoid races with __do_proc_doulongvec_minmax(), we
|
|
||||||
* can duplicate the @table and alter the duplicate of it.
|
|
||||||
*/
|
|
||||||
dup_table = *table;
|
|
||||||
dup_table.data = out;
|
|
||||||
|
|
||||||
return proc_doulongvec_minmax(&dup_table, write, buffer, length, ppos);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int hugetlb_sysctl_handler_common(bool obey_mempolicy,
|
|
||||||
const struct ctl_table *table, int write,
|
|
||||||
void *buffer, size_t *length, loff_t *ppos)
|
|
||||||
{
|
|
||||||
struct hstate *h = &default_hstate;
|
|
||||||
unsigned long tmp = h->max_huge_pages;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (!hugepages_supported())
|
|
||||||
return -EOPNOTSUPP;
|
|
||||||
|
|
||||||
ret = proc_hugetlb_doulongvec_minmax(table, write, buffer, length, ppos,
|
|
||||||
&tmp);
|
|
||||||
if (ret)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
if (write)
|
|
||||||
ret = __nr_hugepages_store_common(obey_mempolicy, h,
|
|
||||||
NUMA_NO_NODE, tmp, *length);
|
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int hugetlb_sysctl_handler(const struct ctl_table *table, int write,
|
|
||||||
void *buffer, size_t *length, loff_t *ppos)
|
|
||||||
{
|
|
||||||
|
|
||||||
return hugetlb_sysctl_handler_common(false, table, write,
|
|
||||||
buffer, length, ppos);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_NUMA
|
|
||||||
static int hugetlb_mempolicy_sysctl_handler(const struct ctl_table *table, int write,
|
|
||||||
void *buffer, size_t *length, loff_t *ppos)
|
|
||||||
{
|
|
||||||
return hugetlb_sysctl_handler_common(true, table, write,
|
|
||||||
buffer, length, ppos);
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_NUMA */
|
|
||||||
|
|
||||||
static int hugetlb_overcommit_handler(const struct ctl_table *table, int write,
|
|
||||||
void *buffer, size_t *length, loff_t *ppos)
|
|
||||||
{
|
|
||||||
struct hstate *h = &default_hstate;
|
|
||||||
unsigned long tmp;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (!hugepages_supported())
|
|
||||||
return -EOPNOTSUPP;
|
|
||||||
|
|
||||||
tmp = h->nr_overcommit_huge_pages;
|
|
||||||
|
|
||||||
if (write && hstate_is_gigantic_no_runtime(h))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
ret = proc_hugetlb_doulongvec_minmax(table, write, buffer, length, ppos,
|
|
||||||
&tmp);
|
|
||||||
if (ret)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
if (write) {
|
|
||||||
spin_lock_irq(&hugetlb_lock);
|
|
||||||
h->nr_overcommit_huge_pages = tmp;
|
|
||||||
spin_unlock_irq(&hugetlb_lock);
|
|
||||||
}
|
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct ctl_table hugetlb_table[] = {
|
|
||||||
{
|
|
||||||
.procname = "nr_hugepages",
|
|
||||||
.data = NULL,
|
|
||||||
.maxlen = sizeof(unsigned long),
|
|
||||||
.mode = 0644,
|
|
||||||
.proc_handler = hugetlb_sysctl_handler,
|
|
||||||
},
|
|
||||||
#ifdef CONFIG_NUMA
|
|
||||||
{
|
|
||||||
.procname = "nr_hugepages_mempolicy",
|
|
||||||
.data = NULL,
|
|
||||||
.maxlen = sizeof(unsigned long),
|
|
||||||
.mode = 0644,
|
|
||||||
.proc_handler = &hugetlb_mempolicy_sysctl_handler,
|
|
||||||
},
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
.procname = "hugetlb_shm_group",
|
|
||||||
.data = &sysctl_hugetlb_shm_group,
|
|
||||||
.maxlen = sizeof(gid_t),
|
|
||||||
.mode = 0644,
|
|
||||||
.proc_handler = proc_dointvec,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.procname = "nr_overcommit_hugepages",
|
|
||||||
.data = NULL,
|
|
||||||
.maxlen = sizeof(unsigned long),
|
|
||||||
.mode = 0644,
|
|
||||||
.proc_handler = hugetlb_overcommit_handler,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static void __init hugetlb_sysctl_init(void)
|
|
||||||
{
|
|
||||||
register_sysctl_init("vm", hugetlb_table);
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_SYSCTL */
|
|
||||||
|
|
||||||
void hugetlb_report_meminfo(struct seq_file *m)
|
void hugetlb_report_meminfo(struct seq_file *m)
|
||||||
{
|
{
|
||||||
struct hstate *h;
|
struct hstate *h;
|
||||||
|
|
|
||||||
|
|
@ -108,4 +108,10 @@ extern ssize_t __nr_hugepages_store_common(bool obey_mempolicy,
|
||||||
|
|
||||||
extern void hugetlb_sysfs_init(void) __init;
|
extern void hugetlb_sysfs_init(void) __init;
|
||||||
|
|
||||||
|
#ifdef CONFIG_SYSCTL
|
||||||
|
extern void hugetlb_sysctl_init(void);
|
||||||
|
#else
|
||||||
|
static inline void hugetlb_sysctl_init(void) { }
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _LINUX_HUGETLB_INTERNAL_H */
|
#endif /* _LINUX_HUGETLB_INTERNAL_H */
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,134 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
/*
|
||||||
|
* HugeTLB sysfs interfaces.
|
||||||
|
* (C) Nadia Yvette Chambers, April 2004
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/sysctl.h>
|
||||||
|
|
||||||
|
#include "hugetlb_internal.h"
|
||||||
|
|
||||||
|
#ifdef CONFIG_SYSCTL
|
||||||
|
static int proc_hugetlb_doulongvec_minmax(const struct ctl_table *table, int write,
|
||||||
|
void *buffer, size_t *length,
|
||||||
|
loff_t *ppos, unsigned long *out)
|
||||||
|
{
|
||||||
|
struct ctl_table dup_table;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* In order to avoid races with __do_proc_doulongvec_minmax(), we
|
||||||
|
* can duplicate the @table and alter the duplicate of it.
|
||||||
|
*/
|
||||||
|
dup_table = *table;
|
||||||
|
dup_table.data = out;
|
||||||
|
|
||||||
|
return proc_doulongvec_minmax(&dup_table, write, buffer, length, ppos);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int hugetlb_sysctl_handler_common(bool obey_mempolicy,
|
||||||
|
const struct ctl_table *table, int write,
|
||||||
|
void *buffer, size_t *length, loff_t *ppos)
|
||||||
|
{
|
||||||
|
struct hstate *h = &default_hstate;
|
||||||
|
unsigned long tmp = h->max_huge_pages;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (!hugepages_supported())
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
ret = proc_hugetlb_doulongvec_minmax(table, write, buffer, length, ppos,
|
||||||
|
&tmp);
|
||||||
|
if (ret)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if (write)
|
||||||
|
ret = __nr_hugepages_store_common(obey_mempolicy, h,
|
||||||
|
NUMA_NO_NODE, tmp, *length);
|
||||||
|
out:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int hugetlb_sysctl_handler(const struct ctl_table *table, int write,
|
||||||
|
void *buffer, size_t *length, loff_t *ppos)
|
||||||
|
{
|
||||||
|
|
||||||
|
return hugetlb_sysctl_handler_common(false, table, write,
|
||||||
|
buffer, length, ppos);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_NUMA
|
||||||
|
static int hugetlb_mempolicy_sysctl_handler(const struct ctl_table *table, int write,
|
||||||
|
void *buffer, size_t *length, loff_t *ppos)
|
||||||
|
{
|
||||||
|
return hugetlb_sysctl_handler_common(true, table, write,
|
||||||
|
buffer, length, ppos);
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_NUMA */
|
||||||
|
|
||||||
|
static int hugetlb_overcommit_handler(const struct ctl_table *table, int write,
|
||||||
|
void *buffer, size_t *length, loff_t *ppos)
|
||||||
|
{
|
||||||
|
struct hstate *h = &default_hstate;
|
||||||
|
unsigned long tmp;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (!hugepages_supported())
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
tmp = h->nr_overcommit_huge_pages;
|
||||||
|
|
||||||
|
if (write && hstate_is_gigantic_no_runtime(h))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
ret = proc_hugetlb_doulongvec_minmax(table, write, buffer, length, ppos,
|
||||||
|
&tmp);
|
||||||
|
if (ret)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if (write) {
|
||||||
|
spin_lock_irq(&hugetlb_lock);
|
||||||
|
h->nr_overcommit_huge_pages = tmp;
|
||||||
|
spin_unlock_irq(&hugetlb_lock);
|
||||||
|
}
|
||||||
|
out:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct ctl_table hugetlb_table[] = {
|
||||||
|
{
|
||||||
|
.procname = "nr_hugepages",
|
||||||
|
.data = NULL,
|
||||||
|
.maxlen = sizeof(unsigned long),
|
||||||
|
.mode = 0644,
|
||||||
|
.proc_handler = hugetlb_sysctl_handler,
|
||||||
|
},
|
||||||
|
#ifdef CONFIG_NUMA
|
||||||
|
{
|
||||||
|
.procname = "nr_hugepages_mempolicy",
|
||||||
|
.data = NULL,
|
||||||
|
.maxlen = sizeof(unsigned long),
|
||||||
|
.mode = 0644,
|
||||||
|
.proc_handler = &hugetlb_mempolicy_sysctl_handler,
|
||||||
|
},
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
.procname = "hugetlb_shm_group",
|
||||||
|
.data = &sysctl_hugetlb_shm_group,
|
||||||
|
.maxlen = sizeof(gid_t),
|
||||||
|
.mode = 0644,
|
||||||
|
.proc_handler = proc_dointvec,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.procname = "nr_overcommit_hugepages",
|
||||||
|
.data = NULL,
|
||||||
|
.maxlen = sizeof(unsigned long),
|
||||||
|
.mode = 0644,
|
||||||
|
.proc_handler = hugetlb_overcommit_handler,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
void __init hugetlb_sysctl_init(void)
|
||||||
|
{
|
||||||
|
register_sysctl_init("vm", hugetlb_table);
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_SYSCTL */
|
||||||
Loading…
Reference in New Issue