perf: Prevent divide by zero exception in kernel/events/core.c
Subsystems (2)
PATCH 1/1 perf: Prevent divide by zero exception in kernel/events/core.c
Any value written to /proc/sys/kernel/perf_event_max_sample_rate is accepted and used as a divisor in perf_proc_update_handler().
Obviously that is wrong. 0 will cause a divide by 0 exception, and negative values are unreasonable.
The attached patch enforces a lower limit of 1.
cu,
Knut
Quoted 1 line
From
7f468bd7bad2f2fec2e93c89a48008d1cba99001Mon Sep 17 00:00:00 2001
From: Knut Petersen <[email protected]>
Date: Wed, 25 Sep 2013 13:34:57 +0200
Subject: [PATCH] Enforce 1 as lower limit for perf_event_max_sample_rate
/proc/sys/kernel/perf_event_max_sample_rate will accept negative values as well as 0.
Negative values are unreasonable, and 0 causes a divide by zero exception in perf_proc_update_handler.
This patch enforces a lower limit of 1.
--- kernel/events/core.c | 3 +++ 1 file changed, 3 insertions(+)
kernel/events/core.c +3 -0
@@ -198,6 +198,9 @@ int perf_proc_update_handler(struct ctl_table *table, int write,if (ret || !write)return ret; +if (sysctl_perf_event_sample_rate <=0 ) + sysctl_perf_event_sample_rate =1 ; + max_samples_per_tick =DIV_ROUND_UP (sysctl_perf_event_sample_rate,HZ ); perf_sample_period_ns =NSEC_PER_SEC / sysctl_perf_event_sample_rate;update_perf_cpu_limits ();
Signature · 1 line
1.8.1.4
Peter Zijlstra
maintainerQuoted 22 lines · Knut Petersen
From: Knut Petersen <[email protected]>
Date: Wed, 25 Sep 2013 13:34:57 +0200
Subject: [PATCH] Enforce 1 as lower limit forperf_event_max_sample_rate
/proc/sys/kernel/perf_event_max_sample_ratewill accept negative values as well as 0.Negative values are unreasonable, and 0 causes a divide by zero exception in
perf_proc_update_handler.This patch enforces a lower limit of 1.
Signed-off-by Knut Petersen <[email protected]>--- kernel/events/core.c | 3 +++ 1 file changed, 3 insertions(+)kernel/events/core.c +0
-0
kernel/events/core.c int perf_proc_update_handler(struct ctl_table *table, int write, · line 206
Quoted 9 lines
kernel/events/core.c +3
-0@@ -198,6 +198,9 @@ int perf_proc_update_handler(struct ctl_table *table, int write,if (ret || !write)return ret; +if (sysctl_perf_event_sample_rate <=0 ) + sysctl_perf_event_sample_rate =1 ; + max_samples_per_tick =DIV_ROUND_UP (sysctl_perf_event_sample_rate,HZ ); perf_sample_period_ns =NSEC_PER_SEC / sysctl_perf_event_sample_rate;update_perf_cpu_limits ();
The 'normal' way of doing that is changing the sysctl table entry to use proc_dointvec_minmax and set .extra = &one. See for example &sysctl_sched_cfs_bandwidth_slice in kernel/sysctl.c
Quoted 3 lines · Peter Zijlstra
The 'normal' way of doing that is changing the sysctl table entry to use
proc_dointvec_minmaxand set .extra = &one. See for example&sysctl_sched_cfs_bandwidth_sliceinkernel/sysctl.c
Thanks. V2 attached.
cu,
Knut
Quoted 1 line
From
4ef9dabdd27a02e2ebd45c2d98afda7e43e82ab3Mon Sep 17 00:00:00 2001
From: Knut Petersen <[email protected]>
Date: Wed, 25 Sep 2013 14:29:37 +0200
Subject: [PATCH] Enforce 1 as lower limit for perf_event_max_sample_rate
/proc/sys/kernel/perf_event_max_sample_rate will accept negative values as well as 0.
Negative values are unreasonable, and 0 causes a divide by zero exception in perf_proc_update_handler.
This patch enforces a lower limit of 1.
v2: Use proc_dointvec_minmax() as suggested by Peter Zijlstra.
--- kernel/events/core.c | 2 +- kernel/sysctl.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-)
kernel/events/core.c +1 -1
@@ -193,7 +193,7 @@ int perf_proc_update_handler(struct ctl_table *table, int write, void __user *buffer, size_t *lenp, loff_t *ppos) { - int ret = proc_dointvec(table, write, buffer, lenp, ppos); + int ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos);if (ret || !write)return ret;
kernel/sysctl.c +1 -0
@@ -1049,6 +1049,7 @@ static struct ctl_table kern_table[] = { .maxlen = sizeof(sysctl_perf_event_sample_rate), .mode = 0644, .proc_handler = perf_proc_update_handler, + .extra1 = &one, }, { .procname = "perf_cpu_time_max_percent",
Signature · 1 line
1.8.1.4
tip-bot for Knut Petersen
merge bot[tip:perf/core] perf: Enforce 1 as lower limit for perf_event_max_sample_rate
perf: Enforce 1 as lower limit for perf_event_max_sample_rate
Commit-ID: 723478c8a471403c53cf144999701f6e0c4bbd11 Gitweb: http://git.kernel.org/tip/723478c8a471403c53cf144999701f6e0c4bbd11 Author: Knut Petersen <[email protected]> AuthorDate: Wed, 25 Sep 2013 14:29:37 +0200 Committer: Ingo Molnar <[email protected]> CommitDate: Fri, 4 Oct 2013 10:06:07 +0200
perf: Enforce 1 as lower limit for perf_event_max_sample_rate
/proc/sys/kernel/perf_event_max_sample_rate will accept negative values as well as 0.
Negative values are unreasonable, and 0 causes a divide by zero exception in perf_proc_update_handler.
This patch enforces a lower limit of 1.
--- kernel/events/core.c | 2 +- kernel/sysctl.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-)
kernel/events/core.c +1 -1
@@ -193,7 +193,7 @@ int perf_proc_update_handler(struct ctl_table *table, int write, void __user *buffer, size_t *lenp, loff_t *ppos) { - int ret = proc_dointvec(table, write, buffer, lenp, ppos); + int ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos);if (ret || !write)return ret;
kernel/sysctl.c +1 -0
@@ -1049,6 +1049,7 @@ static struct ctl_table kern_table[] = { .maxlen = sizeof(sysctl_perf_event_sample_rate), .mode = 0644, .proc_handler = perf_proc_update_handler, + .extra1 = &one, }, { .procname = "perf_cpu_time_max_percent",