mirror of
https://github.com/torvalds/linux.git
synced 2025-08-15 14:11:42 +02:00
perf/core: Move perf_event sysctls into kernel/events
Move ctl tables to two files: - perf_event_{paranoid,mlock_kb,max_sample_rate} and perf_cpu_time_max_percent into kernel/events/core.c - perf_event_max_{stack,context_per_stack} into kernel/events/callchain.c Make static variables and functions that are fully contained in core.c and callchain.cand remove them from include/linux/perf_event.h. Additionally six_hundred_forty_kb is moved to callchain.c. Two new sysctl tables are added ({callchain,events_core}_sysctl_table) with their respective sysctl registration functions. This is part of a greater effort to move ctl tables into their respective subsystems which will reduce the merge conflicts in kerenel/sysctl.c. Signed-off-by: Joel Granados <joel.granados@kernel.org> Signed-off-by: Ingo Molnar <mingo@kernel.org> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lore.kernel.org/r/20250218-jag-mv_ctltables-v1-5-cd3698ab8d29@kernel.org
This commit is contained in:
parent
e6e21a9a39
commit
8aeacf2570
4 changed files with 83 additions and 85 deletions
|
@ -1652,19 +1652,10 @@ static inline int perf_callchain_store(struct perf_callchain_entry_ctx *ctx, u64
|
|||
}
|
||||
|
||||
extern int sysctl_perf_event_paranoid;
|
||||
extern int sysctl_perf_event_mlock;
|
||||
extern int sysctl_perf_event_sample_rate;
|
||||
extern int sysctl_perf_cpu_time_max_percent;
|
||||
|
||||
extern void perf_sample_event_took(u64 sample_len_ns);
|
||||
|
||||
int perf_event_max_sample_rate_handler(const struct ctl_table *table, int write,
|
||||
void *buffer, size_t *lenp, loff_t *ppos);
|
||||
int perf_cpu_time_max_percent_handler(const struct ctl_table *table, int write,
|
||||
void *buffer, size_t *lenp, loff_t *ppos);
|
||||
int perf_event_max_stack_handler(const struct ctl_table *table, int write,
|
||||
void *buffer, size_t *lenp, loff_t *ppos);
|
||||
|
||||
/* Access to perf_event_open(2) syscall. */
|
||||
#define PERF_SECURITY_OPEN 0
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ struct callchain_cpus_entries {
|
|||
|
||||
int sysctl_perf_event_max_stack __read_mostly = PERF_MAX_STACK_DEPTH;
|
||||
int sysctl_perf_event_max_contexts_per_stack __read_mostly = PERF_MAX_CONTEXTS_PER_STACK;
|
||||
static const int six_hundred_forty_kb = 640 * 1024;
|
||||
|
||||
static inline size_t perf_callchain_entry__sizeof(void)
|
||||
{
|
||||
|
@ -266,12 +267,8 @@ exit_put:
|
|||
return entry;
|
||||
}
|
||||
|
||||
/*
|
||||
* Used for sysctl_perf_event_max_stack and
|
||||
* sysctl_perf_event_max_contexts_per_stack.
|
||||
*/
|
||||
int perf_event_max_stack_handler(const struct ctl_table *table, int write,
|
||||
void *buffer, size_t *lenp, loff_t *ppos)
|
||||
static int perf_event_max_stack_handler(const struct ctl_table *table, int write,
|
||||
void *buffer, size_t *lenp, loff_t *ppos)
|
||||
{
|
||||
int *value = table->data;
|
||||
int new_value = *value, ret;
|
||||
|
@ -292,3 +289,32 @@ int perf_event_max_stack_handler(const struct ctl_table *table, int write,
|
|||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct ctl_table callchain_sysctl_table[] = {
|
||||
{
|
||||
.procname = "perf_event_max_stack",
|
||||
.data = &sysctl_perf_event_max_stack,
|
||||
.maxlen = sizeof(sysctl_perf_event_max_stack),
|
||||
.mode = 0644,
|
||||
.proc_handler = perf_event_max_stack_handler,
|
||||
.extra1 = SYSCTL_ZERO,
|
||||
.extra2 = (void *)&six_hundred_forty_kb,
|
||||
},
|
||||
{
|
||||
.procname = "perf_event_max_contexts_per_stack",
|
||||
.data = &sysctl_perf_event_max_contexts_per_stack,
|
||||
.maxlen = sizeof(sysctl_perf_event_max_contexts_per_stack),
|
||||
.mode = 0644,
|
||||
.proc_handler = perf_event_max_stack_handler,
|
||||
.extra1 = SYSCTL_ZERO,
|
||||
.extra2 = SYSCTL_ONE_THOUSAND,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init init_callchain_sysctls(void)
|
||||
{
|
||||
register_sysctl_init("kernel", callchain_sysctl_table);
|
||||
return 0;
|
||||
}
|
||||
core_initcall(init_callchain_sysctls);
|
||||
|
||||
|
|
|
@ -452,8 +452,8 @@ static struct kmem_cache *perf_event_cache;
|
|||
*/
|
||||
int sysctl_perf_event_paranoid __read_mostly = 2;
|
||||
|
||||
/* Minimum for 512 kiB + 1 user control page */
|
||||
int sysctl_perf_event_mlock __read_mostly = 512 + (PAGE_SIZE / 1024); /* 'free' kiB per user */
|
||||
/* Minimum for 512 kiB + 1 user control page. 'free' kiB per user. */
|
||||
static int sysctl_perf_event_mlock __read_mostly = 512 + (PAGE_SIZE / 1024);
|
||||
|
||||
/*
|
||||
* max perf event sample rate
|
||||
|
@ -463,6 +463,7 @@ int sysctl_perf_event_mlock __read_mostly = 512 + (PAGE_SIZE / 1024); /* 'free'
|
|||
#define DEFAULT_CPU_TIME_MAX_PERCENT 25
|
||||
|
||||
int sysctl_perf_event_sample_rate __read_mostly = DEFAULT_MAX_SAMPLE_RATE;
|
||||
static int sysctl_perf_cpu_time_max_percent __read_mostly = DEFAULT_CPU_TIME_MAX_PERCENT;
|
||||
|
||||
static int max_samples_per_tick __read_mostly = DIV_ROUND_UP(DEFAULT_MAX_SAMPLE_RATE, HZ);
|
||||
static int perf_sample_period_ns __read_mostly = DEFAULT_SAMPLE_PERIOD_NS;
|
||||
|
@ -484,7 +485,7 @@ static void update_perf_cpu_limits(void)
|
|||
|
||||
static bool perf_rotate_context(struct perf_cpu_pmu_context *cpc);
|
||||
|
||||
int perf_event_max_sample_rate_handler(const struct ctl_table *table, int write,
|
||||
static int perf_event_max_sample_rate_handler(const struct ctl_table *table, int write,
|
||||
void *buffer, size_t *lenp, loff_t *ppos)
|
||||
{
|
||||
int ret;
|
||||
|
@ -506,9 +507,7 @@ int perf_event_max_sample_rate_handler(const struct ctl_table *table, int write,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int sysctl_perf_cpu_time_max_percent __read_mostly = DEFAULT_CPU_TIME_MAX_PERCENT;
|
||||
|
||||
int perf_cpu_time_max_percent_handler(const struct ctl_table *table, int write,
|
||||
static int perf_cpu_time_max_percent_handler(const struct ctl_table *table, int write,
|
||||
void *buffer, size_t *lenp, loff_t *ppos)
|
||||
{
|
||||
int ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
|
||||
|
@ -528,6 +527,52 @@ int perf_cpu_time_max_percent_handler(const struct ctl_table *table, int write,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static const struct ctl_table events_core_sysctl_table[] = {
|
||||
/*
|
||||
* User-space relies on this file as a feature check for
|
||||
* perf_events being enabled. It's an ABI, do not remove!
|
||||
*/
|
||||
{
|
||||
.procname = "perf_event_paranoid",
|
||||
.data = &sysctl_perf_event_paranoid,
|
||||
.maxlen = sizeof(sysctl_perf_event_paranoid),
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec,
|
||||
},
|
||||
{
|
||||
.procname = "perf_event_mlock_kb",
|
||||
.data = &sysctl_perf_event_mlock,
|
||||
.maxlen = sizeof(sysctl_perf_event_mlock),
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec,
|
||||
},
|
||||
{
|
||||
.procname = "perf_event_max_sample_rate",
|
||||
.data = &sysctl_perf_event_sample_rate,
|
||||
.maxlen = sizeof(sysctl_perf_event_sample_rate),
|
||||
.mode = 0644,
|
||||
.proc_handler = perf_event_max_sample_rate_handler,
|
||||
.extra1 = SYSCTL_ONE,
|
||||
},
|
||||
{
|
||||
.procname = "perf_cpu_time_max_percent",
|
||||
.data = &sysctl_perf_cpu_time_max_percent,
|
||||
.maxlen = sizeof(sysctl_perf_cpu_time_max_percent),
|
||||
.mode = 0644,
|
||||
.proc_handler = perf_cpu_time_max_percent_handler,
|
||||
.extra1 = SYSCTL_ZERO,
|
||||
.extra2 = SYSCTL_ONE_HUNDRED,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init init_events_core_sysctls(void)
|
||||
{
|
||||
register_sysctl_init("kernel", events_core_sysctl_table);
|
||||
return 0;
|
||||
}
|
||||
core_initcall(init_events_core_sysctls);
|
||||
|
||||
|
||||
/*
|
||||
* perf samples are done in some very critical code paths (NMIs).
|
||||
* If they take too much CPU time, the system can lock up and not
|
||||
|
|
|
@ -54,7 +54,6 @@
|
|||
#include <linux/acpi.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/ftrace.h>
|
||||
#include <linux/perf_event.h>
|
||||
#include <linux/oom.h>
|
||||
#include <linux/kmod.h>
|
||||
#include <linux/capability.h>
|
||||
|
@ -91,12 +90,6 @@ EXPORT_SYMBOL_GPL(sysctl_long_vals);
|
|||
#if defined(CONFIG_SYSCTL)
|
||||
|
||||
/* Constants used for minimum and maximum */
|
||||
|
||||
#ifdef CONFIG_PERF_EVENTS
|
||||
static const int six_hundred_forty_kb = 640 * 1024;
|
||||
#endif
|
||||
|
||||
|
||||
static const int ngroups_max = NGROUPS_MAX;
|
||||
static const int cap_last_cap = CAP_LAST_CAP;
|
||||
|
||||
|
@ -1932,63 +1925,6 @@ static const struct ctl_table kern_table[] = {
|
|||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_PERF_EVENTS
|
||||
/*
|
||||
* User-space scripts rely on the existence of this file
|
||||
* as a feature check for perf_events being enabled.
|
||||
*
|
||||
* So it's an ABI, do not remove!
|
||||
*/
|
||||
{
|
||||
.procname = "perf_event_paranoid",
|
||||
.data = &sysctl_perf_event_paranoid,
|
||||
.maxlen = sizeof(sysctl_perf_event_paranoid),
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec,
|
||||
},
|
||||
{
|
||||
.procname = "perf_event_mlock_kb",
|
||||
.data = &sysctl_perf_event_mlock,
|
||||
.maxlen = sizeof(sysctl_perf_event_mlock),
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec,
|
||||
},
|
||||
{
|
||||
.procname = "perf_event_max_sample_rate",
|
||||
.data = &sysctl_perf_event_sample_rate,
|
||||
.maxlen = sizeof(sysctl_perf_event_sample_rate),
|
||||
.mode = 0644,
|
||||
.proc_handler = perf_event_max_sample_rate_handler,
|
||||
.extra1 = SYSCTL_ONE,
|
||||
},
|
||||
{
|
||||
.procname = "perf_cpu_time_max_percent",
|
||||
.data = &sysctl_perf_cpu_time_max_percent,
|
||||
.maxlen = sizeof(sysctl_perf_cpu_time_max_percent),
|
||||
.mode = 0644,
|
||||
.proc_handler = perf_cpu_time_max_percent_handler,
|
||||
.extra1 = SYSCTL_ZERO,
|
||||
.extra2 = SYSCTL_ONE_HUNDRED,
|
||||
},
|
||||
{
|
||||
.procname = "perf_event_max_stack",
|
||||
.data = &sysctl_perf_event_max_stack,
|
||||
.maxlen = sizeof(sysctl_perf_event_max_stack),
|
||||
.mode = 0644,
|
||||
.proc_handler = perf_event_max_stack_handler,
|
||||
.extra1 = SYSCTL_ZERO,
|
||||
.extra2 = (void *)&six_hundred_forty_kb,
|
||||
},
|
||||
{
|
||||
.procname = "perf_event_max_contexts_per_stack",
|
||||
.data = &sysctl_perf_event_max_contexts_per_stack,
|
||||
.maxlen = sizeof(sysctl_perf_event_max_contexts_per_stack),
|
||||
.mode = 0644,
|
||||
.proc_handler = perf_event_max_stack_handler,
|
||||
.extra1 = SYSCTL_ZERO,
|
||||
.extra2 = SYSCTL_ONE_THOUSAND,
|
||||
},
|
||||
#endif
|
||||
{
|
||||
.procname = "panic_on_warn",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue