* [PATCH 0/1] perf/x86: Fix time_shift in perf_event_mmap_page
@ 2015-10-16 13:24 Adrian Hunter
2015-10-16 13:24 ` [PATCH 1/1] " Adrian Hunter
0 siblings, 1 reply; 7+ messages in thread
From: Adrian Hunter @ 2015-10-16 13:24 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar
Cc: Arnaldo Carvalho de Melo, Andy Lutomirski, Thomas Gleixner,
linux-kernel, Stephane Eranian, Andi Kleen
Hi
There is a problem with my patch:
commit b20112edeadf ("perf/x86: Improve accuracy of perf/sched clock")
which is in tip at the moment.
The problem is that userspace does not expect time_shift in perf_event_mmap_page
to be as much as 32. Here is a proposed fix.
Adrian Hunter (1):
perf/x86: Fix time_shift in perf_event_mmap_page
arch/x86/kernel/tsc.c | 11 +++++++++++
include/uapi/linux/perf_event.h | 4 ++--
2 files changed, 13 insertions(+), 2 deletions(-)
Regards
Adrian
^ permalink raw reply [flat|nested] 7+ messages in thread* [PATCH 1/1] perf/x86: Fix time_shift in perf_event_mmap_page 2015-10-16 13:24 [PATCH 0/1] perf/x86: Fix time_shift in perf_event_mmap_page Adrian Hunter @ 2015-10-16 13:24 ` Adrian Hunter 2015-10-19 8:08 ` Ingo Molnar 2015-10-20 9:35 ` [tip:perf/core] " tip-bot for Adrian Hunter 0 siblings, 2 replies; 7+ messages in thread From: Adrian Hunter @ 2015-10-16 13:24 UTC (permalink / raw) To: Peter Zijlstra, Ingo Molnar Cc: Arnaldo Carvalho de Melo, Andy Lutomirski, Thomas Gleixner, linux-kernel, Stephane Eranian, Andi Kleen Commit b20112edeadf ("perf/x86: Improve accuracy of perf/sched clock") allowed the time_shift value in perf_event_mmap_page to be as much as 32. Unfortunately the documented algorithms for using time_shift have it shifting an integer, whereas to work correctly with the value 32, the type must be u64. Fix by limiting the shift to 31 and adjusting the multiplier accordingly. Also update the documentation of perf_event_mmap_page so that new code based on it will be more future-proof. Fixes: b20112edeadf ("perf/x86: Improve accuracy of perf/sched clock") Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> --- arch/x86/kernel/tsc.c | 11 +++++++++++ include/uapi/linux/perf_event.h | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 69b84a26ea17..c7c4d9c51e99 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -259,6 +259,17 @@ static void set_cyc2ns_scale(unsigned long cpu_khz, int cpu) clocks_calc_mult_shift(&data->cyc2ns_mul, &data->cyc2ns_shift, cpu_khz, NSEC_PER_MSEC, 0); + /* + * cyc2ns_shift is exported via arch_perf_update_userpage() where it is + * not expected to be greater than 31 due to the original published + * conversion algorithm shifting a 32-bit value (now specifies a 64-bit + * value) - refer perf_event_mmap_page documentation in perf_event.h. + */ + if (data->cyc2ns_shift == 32) { + data->cyc2ns_shift = 31; + data->cyc2ns_mul >>= 1; + } + data->cyc2ns_offset = ns_now - mul_u64_u32_shr(tsc_now, data->cyc2ns_mul, data->cyc2ns_shift); diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h index 2881145cda86..6c72e72e975c 100644 --- a/include/uapi/linux/perf_event.h +++ b/include/uapi/linux/perf_event.h @@ -476,7 +476,7 @@ struct perf_event_mmap_page { * u64 delta; * * quot = (cyc >> time_shift); - * rem = cyc & ((1 << time_shift) - 1); + * rem = cyc & (((u64)1 << time_shift) - 1); * delta = time_offset + quot * time_mult + * ((rem * time_mult) >> time_shift); * @@ -507,7 +507,7 @@ struct perf_event_mmap_page { * And vice versa: * * quot = cyc >> time_shift; - * rem = cyc & ((1 << time_shift) - 1); + * rem = cyc & (((u64)1 << time_shift) - 1); * timestamp = time_zero + quot * time_mult + * ((rem * time_mult) >> time_shift); */ -- 1.9.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 1/1] perf/x86: Fix time_shift in perf_event_mmap_page 2015-10-16 13:24 ` [PATCH 1/1] " Adrian Hunter @ 2015-10-19 8:08 ` Ingo Molnar 2015-10-19 8:46 ` Adrian Hunter 2015-10-20 9:35 ` [tip:perf/core] " tip-bot for Adrian Hunter 1 sibling, 1 reply; 7+ messages in thread From: Ingo Molnar @ 2015-10-19 8:08 UTC (permalink / raw) To: Adrian Hunter Cc: Peter Zijlstra, Arnaldo Carvalho de Melo, Andy Lutomirski, Thomas Gleixner, linux-kernel, Stephane Eranian, Andi Kleen * Adrian Hunter <adrian.hunter@intel.com> wrote: > Commit b20112edeadf ("perf/x86: Improve accuracy of perf/sched clock") > allowed the time_shift value in perf_event_mmap_page to be as much > as 32. Unfortunately the documented algorithms for using time_shift > have it shifting an integer, whereas to work correctly with the value > 32, the type must be u64. > > Fix by limiting the shift to 31 and adjusting the multiplier accordingly. > > Also update the documentation of perf_event_mmap_page so that new code > based on it will be more future-proof. > > Fixes: b20112edeadf ("perf/x86: Improve accuracy of perf/sched clock") > Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Would be nice to point out via what symptoms the code misbehaves and how users notice. Thanks, Ingo ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/1] perf/x86: Fix time_shift in perf_event_mmap_page 2015-10-19 8:08 ` Ingo Molnar @ 2015-10-19 8:46 ` Adrian Hunter 2015-10-19 11:21 ` Ingo Molnar 0 siblings, 1 reply; 7+ messages in thread From: Adrian Hunter @ 2015-10-19 8:46 UTC (permalink / raw) To: Ingo Molnar Cc: Peter Zijlstra, Arnaldo Carvalho de Melo, Andy Lutomirski, Thomas Gleixner, linux-kernel, Stephane Eranian, Andi Kleen On 19/10/15 11:08, Ingo Molnar wrote: > > * Adrian Hunter <adrian.hunter@intel.com> wrote: > >> Commit b20112edeadf ("perf/x86: Improve accuracy of perf/sched clock") >> allowed the time_shift value in perf_event_mmap_page to be as much >> as 32. Unfortunately the documented algorithms for using time_shift >> have it shifting an integer, whereas to work correctly with the value >> 32, the type must be u64. >> >> Fix by limiting the shift to 31 and adjusting the multiplier accordingly. >> >> Also update the documentation of perf_event_mmap_page so that new code >> based on it will be more future-proof. >> >> Fixes: b20112edeadf ("perf/x86: Improve accuracy of perf/sched clock") >> Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> > > Would be nice to point out via what symptoms the code misbehaves and how users > notice. In the case of perf tools, Intel PT decodes correctly but the timestamps that are output (for example by perf script) have lost 32-bits of granularity so they look like they are not changing at all. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/1] perf/x86: Fix time_shift in perf_event_mmap_page 2015-10-19 8:46 ` Adrian Hunter @ 2015-10-19 11:21 ` Ingo Molnar 2015-10-19 11:57 ` [PATCH V2 " Adrian Hunter 0 siblings, 1 reply; 7+ messages in thread From: Ingo Molnar @ 2015-10-19 11:21 UTC (permalink / raw) To: Adrian Hunter Cc: Peter Zijlstra, Arnaldo Carvalho de Melo, Andy Lutomirski, Thomas Gleixner, linux-kernel, Stephane Eranian, Andi Kleen * Adrian Hunter <adrian.hunter@intel.com> wrote: > On 19/10/15 11:08, Ingo Molnar wrote: > > > > * Adrian Hunter <adrian.hunter@intel.com> wrote: > > > >> Commit b20112edeadf ("perf/x86: Improve accuracy of perf/sched clock") > >> allowed the time_shift value in perf_event_mmap_page to be as much > >> as 32. Unfortunately the documented algorithms for using time_shift > >> have it shifting an integer, whereas to work correctly with the value > >> 32, the type must be u64. > >> > >> Fix by limiting the shift to 31 and adjusting the multiplier accordingly. > >> > >> Also update the documentation of perf_event_mmap_page so that new code > >> based on it will be more future-proof. > >> > >> Fixes: b20112edeadf ("perf/x86: Improve accuracy of perf/sched clock") > >> Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> > > > > Would be nice to point out via what symptoms the code misbehaves and how users > > notice. > > In the case of perf tools, Intel PT decodes correctly but the timestamps > that are output (for example by perf script) have lost 32-bits of > granularity so they look like they are not changing at all. Sounds like a nice and very informative paragraph to add to the changelog! :-) Thanks, Ingo ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH V2 1/1] perf/x86: Fix time_shift in perf_event_mmap_page 2015-10-19 11:21 ` Ingo Molnar @ 2015-10-19 11:57 ` Adrian Hunter 0 siblings, 0 replies; 7+ messages in thread From: Adrian Hunter @ 2015-10-19 11:57 UTC (permalink / raw) To: Ingo Molnar Cc: Peter Zijlstra, Arnaldo Carvalho de Melo, Andy Lutomirski, Thomas Gleixner, linux-kernel, Stephane Eranian, Andi Kleen >From 96bb79ce53b9373f5b6a212fcc2cd4d364d708af Mon Sep 17 00:00:00 2001 From: Adrian Hunter <adrian.hunter@intel.com> Date: Fri, 16 Oct 2015 11:41:56 +0300 Subject: [PATCH 1/1] perf/x86: Fix time_shift in perf_event_mmap_page Commit b20112edeadf ("perf/x86: Improve accuracy of perf/sched clock") allowed the time_shift value in perf_event_mmap_page to be as much as 32. Unfortunately the documented algorithms for using time_shift have it shifting an integer, whereas to work correctly with the value 32, the type must be u64. In the case of perf tools, Intel PT decodes correctly but the timestamps that are output (for example by perf script) have lost 32-bits of granularity so they look like they are not changing at all. Fix by limiting the shift to 31 and adjusting the multiplier accordingly. Also update the documentation of perf_event_mmap_page so that new code based on it will be more future-proof. Fixes: b20112edeadf ("perf/x86: Improve accuracy of perf/sched clock") Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> --- Changes in V2: Add to the commit message symptoms of the code misbehaviour and how users notice. arch/x86/kernel/tsc.c | 11 +++++++++++ include/uapi/linux/perf_event.h | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 69b84a26ea17..c7c4d9c51e99 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -259,6 +259,17 @@ static void set_cyc2ns_scale(unsigned long cpu_khz, int cpu) clocks_calc_mult_shift(&data->cyc2ns_mul, &data->cyc2ns_shift, cpu_khz, NSEC_PER_MSEC, 0); + /* + * cyc2ns_shift is exported via arch_perf_update_userpage() where it is + * not expected to be greater than 31 due to the original published + * conversion algorithm shifting a 32-bit value (now specifies a 64-bit + * value) - refer perf_event_mmap_page documentation in perf_event.h. + */ + if (data->cyc2ns_shift == 32) { + data->cyc2ns_shift = 31; + data->cyc2ns_mul >>= 1; + } + data->cyc2ns_offset = ns_now - mul_u64_u32_shr(tsc_now, data->cyc2ns_mul, data->cyc2ns_shift); diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h index 2881145cda86..6c72e72e975c 100644 --- a/include/uapi/linux/perf_event.h +++ b/include/uapi/linux/perf_event.h @@ -476,7 +476,7 @@ struct perf_event_mmap_page { * u64 delta; * * quot = (cyc >> time_shift); - * rem = cyc & ((1 << time_shift) - 1); + * rem = cyc & (((u64)1 << time_shift) - 1); * delta = time_offset + quot * time_mult + * ((rem * time_mult) >> time_shift); * @@ -507,7 +507,7 @@ struct perf_event_mmap_page { * And vice versa: * * quot = cyc >> time_shift; - * rem = cyc & ((1 << time_shift) - 1); + * rem = cyc & (((u64)1 << time_shift) - 1); * timestamp = time_zero + quot * time_mult + * ((rem * time_mult) >> time_shift); */ -- 1.9.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [tip:perf/core] perf/x86: Fix time_shift in perf_event_mmap_page 2015-10-16 13:24 ` [PATCH 1/1] " Adrian Hunter 2015-10-19 8:08 ` Ingo Molnar @ 2015-10-20 9:35 ` tip-bot for Adrian Hunter 1 sibling, 0 replies; 7+ messages in thread From: tip-bot for Adrian Hunter @ 2015-10-20 9:35 UTC (permalink / raw) To: linux-tip-commits Cc: jolsa, dsahern, peterz, acme, mingo, torvalds, eranian, namhyung, tglx, acme, adrian.hunter, linux-kernel, vincent.weaver, luto, hpa Commit-ID: b9511cd761faafca7a1acc059e792c1399f9d7c6 Gitweb: http://git.kernel.org/tip/b9511cd761faafca7a1acc059e792c1399f9d7c6 Author: Adrian Hunter <adrian.hunter@intel.com> AuthorDate: Fri, 16 Oct 2015 16:24:05 +0300 Committer: Ingo Molnar <mingo@kernel.org> CommitDate: Tue, 20 Oct 2015 10:30:52 +0200 perf/x86: Fix time_shift in perf_event_mmap_page Commit: b20112edeadf ("perf/x86: Improve accuracy of perf/sched clock") allowed the time_shift value in perf_event_mmap_page to be as much as 32. Unfortunately the documented algorithms for using time_shift have it shifting an integer, whereas to work correctly with the value 32, the type must be u64. In the case of perf tools, Intel PT decodes correctly but the timestamps that are output (for example by perf script) have lost 32-bits of granularity so they look like they are not changing at all. Fix by limiting the shift to 31 and adjusting the multiplier accordingly. Also update the documentation of perf_event_mmap_page so that new code based on it will be more future-proof. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Arnaldo Carvalho de Melo <acme@kernel.org> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: David Ahern <dsahern@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Vince Weaver <vincent.weaver@maine.edu> Fixes: b20112edeadf ("perf/x86: Improve accuracy of perf/sched clock") Link: http://lkml.kernel.org/r/1445001845-13688-2-git-send-email-adrian.hunter@intel.com Signed-off-by: Ingo Molnar <mingo@kernel.org> --- arch/x86/kernel/tsc.c | 11 +++++++++++ include/uapi/linux/perf_event.h | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 69b84a2..c7c4d9c 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -259,6 +259,17 @@ static void set_cyc2ns_scale(unsigned long cpu_khz, int cpu) clocks_calc_mult_shift(&data->cyc2ns_mul, &data->cyc2ns_shift, cpu_khz, NSEC_PER_MSEC, 0); + /* + * cyc2ns_shift is exported via arch_perf_update_userpage() where it is + * not expected to be greater than 31 due to the original published + * conversion algorithm shifting a 32-bit value (now specifies a 64-bit + * value) - refer perf_event_mmap_page documentation in perf_event.h. + */ + if (data->cyc2ns_shift == 32) { + data->cyc2ns_shift = 31; + data->cyc2ns_mul >>= 1; + } + data->cyc2ns_offset = ns_now - mul_u64_u32_shr(tsc_now, data->cyc2ns_mul, data->cyc2ns_shift); diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h index 2881145..6c72e72 100644 --- a/include/uapi/linux/perf_event.h +++ b/include/uapi/linux/perf_event.h @@ -476,7 +476,7 @@ struct perf_event_mmap_page { * u64 delta; * * quot = (cyc >> time_shift); - * rem = cyc & ((1 << time_shift) - 1); + * rem = cyc & (((u64)1 << time_shift) - 1); * delta = time_offset + quot * time_mult + * ((rem * time_mult) >> time_shift); * @@ -507,7 +507,7 @@ struct perf_event_mmap_page { * And vice versa: * * quot = cyc >> time_shift; - * rem = cyc & ((1 << time_shift) - 1); + * rem = cyc & (((u64)1 << time_shift) - 1); * timestamp = time_zero + quot * time_mult + * ((rem * time_mult) >> time_shift); */ ^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2015-10-20 9:36 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-10-16 13:24 [PATCH 0/1] perf/x86: Fix time_shift in perf_event_mmap_page Adrian Hunter 2015-10-16 13:24 ` [PATCH 1/1] " Adrian Hunter 2015-10-19 8:08 ` Ingo Molnar 2015-10-19 8:46 ` Adrian Hunter 2015-10-19 11:21 ` Ingo Molnar 2015-10-19 11:57 ` [PATCH V2 " Adrian Hunter 2015-10-20 9:35 ` [tip:perf/core] " tip-bot for Adrian Hunter
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox