Re: [PATCH] perf/core: fix perf_proc_update_handler() bug
Em Thu, Jan 17, 2019 at 01:03:20PM -0800, Stephane Eranian escreveu: > On Thu, Jan 10, 2019 at 5:17 PM Stephane Eranian wrote: > > > > The perf_proc_update_handler() handles > > /proc/sys/kernel/perf_event_max_sample_rate > > syctl variable. When the PMU IRQ handler timing monitoring is disabled, > > i.e, > > when /proc/sys/kernel/perf_cpu_time_max_percent is equal to 0 or 100, > > then no modification to sysctl_perf_event_sample_rate is allowed to prevent > > possible hang from wrong values. > > > > The problem is that the test to prevent modification is made after the > > sysctl variable is modified in perf_proc_update_handler(). > > > > You get an error: > > > > $ echo 10001 >/proc/sys/kernel/perf_event_max_sample_rate > > echo: write error: invalid argument > > > > But the value is still modified causing all sorts of inconsistencies: > > > > $ cat /proc/sys/kernel/perf_event_max_sample_rate > > 10001 > > > > This patch fixes the problem by moving the parsing of the value after > > the test. > > > > Signed-off-by: Stephane Eranian > > Ping. Collected the Reviewed-by from Jiri and Andi, reproduced the problem before the patch and I'm testing it to push to Ingo via perf/urgent, thanks for the patch. - Arnaldo
Re: [PATCH] perf/core: fix perf_proc_update_handler() bug
On Thu, Jan 10, 2019 at 05:17:16PM -0800, Stephane Eranian wrote: > The perf_proc_update_handler() handles > /proc/sys/kernel/perf_event_max_sample_rate > syctl variable. When the PMU IRQ handler timing monitoring is disabled, i.e, > when /proc/sys/kernel/perf_cpu_time_max_percent is equal to 0 or 100, > then no modification to sysctl_perf_event_sample_rate is allowed to prevent > possible hang from wrong values. > > The problem is that the test to prevent modification is made after the > sysctl variable is modified in perf_proc_update_handler(). > > You get an error: > > $ echo 10001 >/proc/sys/kernel/perf_event_max_sample_rate > echo: write error: invalid argument > > But the value is still modified causing all sorts of inconsistencies: > > $ cat /proc/sys/kernel/perf_event_max_sample_rate > 10001 > > This patch fixes the problem by moving the parsing of the value after > the test. > > Signed-off-by: Stephane Eranian Reviewed-by: Jiri Olsa jirka > --- > kernel/events/core.c | 14 +++--- > 1 file changed, 7 insertions(+), 7 deletions(-) > > diff --git a/kernel/events/core.c b/kernel/events/core.c > index 3cd13a30f732..e5ede6918050 100644 > --- a/kernel/events/core.c > +++ b/kernel/events/core.c > @@ -436,18 +436,18 @@ int perf_proc_update_handler(struct ctl_table *table, > int write, > void __user *buffer, size_t *lenp, > loff_t *ppos) > { > - int ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); > - > - if (ret || !write) > - return ret; > - > + int ret; > + int perf_cpu = sysctl_perf_cpu_time_max_percent; > /* >* If throttling is disabled don't allow the write: >*/ > - if (sysctl_perf_cpu_time_max_percent == 100 || > - sysctl_perf_cpu_time_max_percent == 0) > + if (write && (perf_cpu == 100 || perf_cpu == 0)) > return -EINVAL; > > + ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); > + if (ret || !write) > + return ret; > + > 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(); > -- > 2.7.4 >
Re: [PATCH] perf/core: fix perf_proc_update_handler() bug
On Thu, Jan 17, 2019 at 01:03:20PM -0800, Stephane Eranian wrote: > On Thu, Jan 10, 2019 at 5:17 PM Stephane Eranian wrote: > > > > The perf_proc_update_handler() handles > > /proc/sys/kernel/perf_event_max_sample_rate > > syctl variable. When the PMU IRQ handler timing monitoring is disabled, > > i.e, > > when /proc/sys/kernel/perf_cpu_time_max_percent is equal to 0 or 100, > > then no modification to sysctl_perf_event_sample_rate is allowed to prevent > > possible hang from wrong values. > > > > The problem is that the test to prevent modification is made after the > > sysctl variable is modified in perf_proc_update_handler(). > > > > You get an error: > > > > $ echo 10001 >/proc/sys/kernel/perf_event_max_sample_rate > > echo: write error: invalid argument > > > > But the value is still modified causing all sorts of inconsistencies: > > > > $ cat /proc/sys/kernel/perf_event_max_sample_rate > > 10001 > > > > This patch fixes the problem by moving the parsing of the value after > > the test. > > > > Signed-off-by: Stephane Eranian > > Ping. Reviewed-by: Andi Kleen -Andi
Re: [PATCH] perf/core: fix perf_proc_update_handler() bug
On Thu, Jan 10, 2019 at 5:17 PM Stephane Eranian wrote: > > The perf_proc_update_handler() handles > /proc/sys/kernel/perf_event_max_sample_rate > syctl variable. When the PMU IRQ handler timing monitoring is disabled, i.e, > when /proc/sys/kernel/perf_cpu_time_max_percent is equal to 0 or 100, > then no modification to sysctl_perf_event_sample_rate is allowed to prevent > possible hang from wrong values. > > The problem is that the test to prevent modification is made after the > sysctl variable is modified in perf_proc_update_handler(). > > You get an error: > > $ echo 10001 >/proc/sys/kernel/perf_event_max_sample_rate > echo: write error: invalid argument > > But the value is still modified causing all sorts of inconsistencies: > > $ cat /proc/sys/kernel/perf_event_max_sample_rate > 10001 > > This patch fixes the problem by moving the parsing of the value after > the test. > > Signed-off-by: Stephane Eranian Ping. > --- > kernel/events/core.c | 14 +++--- > 1 file changed, 7 insertions(+), 7 deletions(-) > > diff --git a/kernel/events/core.c b/kernel/events/core.c > index 3cd13a30f732..e5ede6918050 100644 > --- a/kernel/events/core.c > +++ b/kernel/events/core.c > @@ -436,18 +436,18 @@ int perf_proc_update_handler(struct ctl_table *table, > int write, > void __user *buffer, size_t *lenp, > loff_t *ppos) > { > - int ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); > - > - if (ret || !write) > - return ret; > - > + int ret; > + int perf_cpu = sysctl_perf_cpu_time_max_percent; > /* > * If throttling is disabled don't allow the write: > */ > - if (sysctl_perf_cpu_time_max_percent == 100 || > - sysctl_perf_cpu_time_max_percent == 0) > + if (write && (perf_cpu == 100 || perf_cpu == 0)) > return -EINVAL; > > + ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); > + if (ret || !write) > + return ret; > + > 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(); > -- > 2.7.4 >